【Day8:JAVA字符串的学习】

目录

  • 1、常用API
  • 2、String类
    • 2.1 String类的特点
    • 2.2 String类的常见构造方法
    • 2.3 String类的常见面试题:
      • 2.3.1 面试题一:
      • 2.3.2 面试题二:
      • 2.3.3 面试题三:
      • 2.3.4 面试题四:
    • 2.4 String类字符串用于比较的方法
    • 2.5 String类字符串的遍历
    • 2.6 String类字符串的截取方法
    • 2.7 String类字符串的替换方法
    • 2.8 String类字符串的切割方法
    • 2.9 String类字符串方法的总结
  • 3、StringBuilder类
    • 3.1 StringBuilder介绍
    • 3.2 StringBuilder的构造方法
    • 3.3 StringBuilder的常用方法
    • 3.4 StringBuffer与StringBuilder的区别:

1、常用API

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • Scanner类录入字符串注意事项:
    在这里插入图片描述

  • API帮助文档的使用流程:在这里插入图片描述

2、String类

2.1 String类的特点

  • Java程序中,所有双引号字符串,都是String的实例,即对象。如下是两种创建字符串对象的方法:
String s = "";
String s1 = new String();
  • 字符串一旦被创建,则不可被更改,即字符串的内容不可更改,如果要修改,则只能使用新的对象做替换。如下:
String s = "abc";
s = "def";
  • String字符串虽然不可改变,但可以被共享。为了解释清除什么是共享,因此这里要涉及一个概念,即字符串常量池:当我们使用双引号创建字符串对象时,会先去字符串常量池中检查是否存在改数据:

存在:创建
不存在:复用

看如下代码就是共享的例子:

String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);输出:
true

上述代码的内存图解释:
在这里插入图片描述

注:==比较地址,而equals()比较内容

总结:
在这里插入图片描述

2.2 String类的常见构造方法

在这里插入图片描述

注意事项:
1、打印对象名时,会输出对象在堆内存开辟的内存地址,但是打印字符串对象时,输出的是内容。
2、这三个构造方法创建对象,都没有直接使用双引号来的方便。

2.3 String类的常见面试题:

2.3.1 面试题一:

  • System.out.pringln(s1 == s2)输出true还是false,为什么?

答:两个字符串都是用双引号创建对象时,其实都是引用了堆内存中字符串常量的内存地址,因此使用==号作比较时,两个指向同一个地址,自然输出true。下面是内存图解释:
在这里插入图片描述

2.3.2 面试题二:

  • 直接使用双引号创建字符串,与使用构造方法创建字符串有什么区别?

答:使用双引号时,会在堆内存的字符串常量池中开辟一个空间,而使用构造方法new一个对象时,会在堆内存的普通区局开辟一个空间,因此当这两种创建内容相同,但是用==做比较时,会输出false。看下面的内存图解释;
在这里插入图片描述

2.3.3 面试题三:

  • 字符串做+拼接时的原理。

答:使用+做拼接时,首先会在堆内存开辟StringBuilder对象的内存地址,然后再调用此类的toString方法转换成字符串,转换后的字符串也会在堆内存中开辟一个空间,最后再将转换后字符串的地址给栈内存中引用的变量,因此拼接后的字符串和使用双引号创建的字符串内容虽然相同,但是指向的地址是不同的,使用==自然会返回false。下面是内存图解释:
在这里插入图片描述

2.3.4 面试题四:

  • 字符串常量拼接原理:在编译时就会做优化处理,所以编译成字节码文件后,就是拼接到一起的样子,例如下图:
    在这里插入图片描述

输出为true,原因是s2编译成字节码文件后为"abc",和s1是一样的。

2.4 String类字符串用于比较的方法

在这里插入图片描述

练习:
在这里插入图片描述

package com.itheima.string;import com.itheima.string.vo.User;import java.util.Scanner;public class Login {public static void main(String[] args) {login();}public static void login(){// 1、从数据库查找:正确的用户名和密码User user = new User("马四", "1qaz");// 2、和用户输入做比较Scanner sc = new Scanner(System.in);for (int i = 0; i < 3; i++) {System.out.println("请输入用户名:");String username = sc.next();System.out.println("请输入密码:");String password = sc.next();if (username.equals(user.getName()) && password.equals(user.getPassword())){System.out.println("登录成功!");break;}System.out.println("你输入不正确,还剩余" + (2- i)  + "次机会");}}
}

注:如果字符串的比较要忽略大小写,则使用equalsIgnoreCase方法即可。

2.5 String类字符串的遍历

在这里插入图片描述

package com.itheima.string;public class StringMethodDemo {public static void main(String[] args) {
//        print1();print2();}/*字符串的第一种遍历方式*/private static void print1() {String s = "itheima";char[] charArray = s.toCharArray();for (int i = 0; i < charArray.length; i++) {System.out.println(charArray[i]);}}/*字符串的第二种遍历方式*/private static void print2() {String s = "itheima";for (int i = 0; i < s.length(); i++) {System.out.println(s.charAt(i));}}
}

注:第一种方法遍历效率高!!!

练习1:
在这里插入图片描述

package com.itheima.string;
import java.util.Scanner;public class StringTestDemo {public static void main(String[] args) {countCharNumber();}public static void countCharNumber(){int numCount = 0;//数字数量int lowerCount = 0;//小写数量int upperCount = 0;//大写数量Scanner sc = new Scanner(System.in);System.out.println("请录入一个字符串:");String s = sc.next();char[] chars = s.toCharArray();for (int i = 0; i < chars.length; i++) {if (chars[i] >= '0' && chars[i] <= '9'){numCount++;}else if (chars[i] >= 'a' && chars[i] <= 'z'){lowerCount++;} else if (chars[i] >= 'A' && chars[i] <= 'Z') {upperCount++;}}System.out.println("数字数量" + numCount);System.out.println("小写数量" + lowerCount);System.out.println("大写数量" + upperCount);}
}

2.6 String类字符串的截取方法

在这里插入图片描述

package com.itheima.string;public class StringTestDemo2 {public static void main(String[] args) {
//        substring1();stustring2();}private static void substring1() {String s = "itheima";String substring = s.substring(3);//包含开始索引,输出:ithSystem.out.println(substring);}private static void stustring2() {String s = "itheima";String substring = s.substring(1, 5);//包含开始索引,不包含结束索引输出:theiSystem.out.println(substring);}
}

练习:
在这里插入图片描述

package com.itheima.string;import java.util.Scanner;public class StringTestDemo3 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一个手机号:");String phoneNumber = scanner.next();String mockPhoneNumber = phoneNumber.substring(0, 4) + "****" + phoneNumber.substring(8, 11);System.out.println("最终效果为:" + mockPhoneNumber);}
}

2.7 String类字符串的替换方法

在这里插入图片描述

package com.itheima.string;public class StringTestDemo {public static void main(String[] args) {String s = "itheima";String replace = s.replace("heima", "baima");//旧值,新值System.out.println(replace);}
}

练习:
在这里插入图片描述

package com.itheima.string;
import java.util.Scanner;public class StringTestDemo4 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串:");String s = sc.next();String replace = s.toUpperCase().replace("TMD", "***");//全部转大写System.out.println(replace);}
}

2.8 String类字符串的切割方法

在这里插入图片描述

package com.itheima.string;public class StringTestDemo4 {public static void main(String[] args) {String s = "abc,def,ghj";String[] split = s.split(",");for (int i = 0; i < split.length; i++) {System.out.println(split[i]);}String ss = "abc.def.ghj";String[] split1 = ss.split("\\.");//因为split参数是正则表达式匹配,而.代表任意数,所以需要用转义符\做转义即可for (int i = 0; i < split1.length; i++) {System.out.println(split1[i]);}}
}

2.9 String类字符串方法的总结

在这里插入图片描述

3、StringBuilder类

3.1 StringBuilder介绍

在这里插入图片描述

作用:
在这里插入图片描述
在这里插入图片描述

看下提高的效率:

package com.itheima.stringBuilder;public class StringBuilderDemo1 {public static void main(String[] args) {long start = System.currentTimeMillis();String s = "";for (int i = 0; i < 11111; i++) {s += i;}System.out.println(s);long end = System.currentTimeMillis();long start1 = System.currentTimeMillis();StringBuilder sb = new StringBuilder();for (int i = 0; i < 11111; i++) {sb.append(i);}System.out.println(sb);long end1 = System.currentTimeMillis();System.out.println(end - start);//502System.out.println(end1 - start1);//3}
}

可以发现,使用了StringBuilder类,运行时间减少了几个数量级。

3.2 StringBuilder的构造方法

在这里插入图片描述

在这里插入图片描述

3.3 StringBuilder的常用方法

在这里插入图片描述

  • 案例1:
    在这里插入图片描述
package com.itheima.stringBuilder;public class StringBuilderDemo2 {public static void main(String[] args) {StringBuilder sb = new StringBuilder("156651");String s1 = sb.toString();String s2 = sb.reverse().toString();if (s1.equals(s2)){System.out.println("是回文");}else {System.out.println("不是回文");}}
}

String和StringBuilder相互的转换:
在这里插入图片描述

  • 案例2:
    在这里插入图片描述
package com.itheima.stringBuilder;public class StringBuilderDemo3 {public static void main(String[] args) {int[] arr = {1, 2, 3};String string = getString(arr);System.out.println(string);}public static String getString(int[] arr){StringBuilder sb = new StringBuilder("[");for (int i = 0; i < arr.length; i++) {sb.append(arr[i]);if (i != arr.length - 1){sb.append(",");}}sb.append("]");return sb.toString();}
}

3.4 StringBuffer与StringBuilder的区别:

StringBuffer 与 StringBuilder使用上没有区别,因此学会了使用StringBuilder,则StringBuffer就会使用。

但是不同点在于,当多线程时,StringBuffer是安全的(效率低),而StringBuilder是不安全的(效率高)。为何这样,在后续多线程里介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用DevEco Studio创建Native C++应用

简介 本篇主要介绍如何使用DevEco Studio for OpenAtom OpenHarmony &#xff08;以下简称“OpenHarmony”&#xff09;创建一个Native C应用。应用采用“Native C”模板&#xff0c;实现了通过Node-API调用C标准库的功能。本示例通过调用C标准库接口来演示调用过程&#xff0…

windows-386、windows-amd64、windows-arm64这三者有什么区别?

选择文件的版本出现下面问题&#xff1a; Architectures windows-386 &#xff1a;这些是针对 32 位 Windows 系统编译的。windows-amd64 &#xff1a;这些是针对具有 AMD 或 Intel x86-64 架构的 64 位 Windows 系统编译的。windows-arm64 &#xff1a;这些是针对具有 ARM 架…

Golang的内存关系

1.Page Golang的Page,在操作系统对虚拟内存管理的MMU定义的物理页有相似的定义,默认的Page为8KB 2.mSpan 多个连续的Page称之为是一个Span&#xff0c;其定义含义有操作系统的管理的页表相似 3.Size Class Size Class: 相当于 一个等级和刻度, 比如 第二等级 就代表 一个Pag…

从零开始打造教育APP:在线教育系统源码与开发流程

很多人疑问&#xff0c;应该如何从零开始打造一个在线教育APP&#xff1f;今天&#xff0c;小编将详细为大家讲解在线教育系统的源码与开发流程。 一、需求分析 对于在线教育APP&#xff0c;需要要明确以下几点&#xff1a; 1.目标用户&#xff1a;明确APP的用户群体&#xf…

四川景源畅信:抖音小店新手如何做?

随着短视频平台的兴起&#xff0c;抖音小店成为了许多创业者的新选择。但是&#xff0c;对于新手来说&#xff0c;如何在抖音上开设并经营好自己的小店呢?本文将围绕这一问题展开讨论。 一、明确目标和定位作为抖音小店的新手&#xff0c;首先要明确自己的经营目标和定位。是想…

挑战你的数据结构技能:复习题来袭【3】

chap3 练习1 一. 单选题 1. (单选题)栈和队列具有相同的&#xff08;&#xff09; A. 抽象数据类型B. 逻辑结构C. 存储结构D. 运算 答案: B:逻辑结构 答案分析&#xff1a;逻辑结构都属于线性结构,只是它们对数据的运算不同。 2. (单选题)栈是() A. 顺序存储的线性结构B…

如何处理逻辑设计中的时钟域

1.什么是时钟域 2.PLL对时钟域管理 不管是否需要变频变相&#xff0c;在FPGA内部将外部输入时钟从专用时钟引脚扇入后先做PLL处理。如何调用pll&#xff0c;见另一篇文章。 约束输入时钟 creat_clock -period 10 -waveform {0 5} [get_ports {sys_clk}] 3.单bit信号跨时钟…

黏土风格绘画神器Image to Clay Style Online,可免费生成50000张

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃斜杠君&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &#…

[pdf,epub]《软件方法》2024版电子书共290页(202405更新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 已上传本账号CSDN资源。 或者到以下链接下载&#xff1a; http://www.umlchina.com/url/softmeth2024.html&#xff0c;或点击“阅读原文”。 如果需要提取码&#xff1a;umlc 已排…

mysql高级篇学习(数据表的设计方法,索引优化)

使用docker 安装 mysql 安装 docker # yum 包更新到最新 yum update# 卸载旧的 docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine # 安装 gcc 环境 yum -y install…

库卡机器人保养服务包,教你保养技术

为了确保机器人的持续稳定运行和延长使用寿命&#xff0c;正确的库卡机器人保养和KUKA机械手维修至关重要。 KUKA机器人保养工作对于保障其稳定运行和延长使用寿命具有重要意义。通过了解子锐机器人提供的库卡机械手保养服务包&#xff0c;可以确保机器人在良好的状态下为生产线…

英语新概念2-回译法-lesson16

第一次回译 if you ___ your car on a wrong place, the traffic police man will find you quickly. If he do not give you the ticket,you are lucky.However,the ___ not all like this,The police man is __ sometimes.I had a holiday in Sweden, I found a ___ in my c…

深入探索:中文字符的编码与转移字符的奥秘

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;探索字符编码的世界 二、字符编码基础&#xff1a;理解ASCII与Unicode…

2023idea没有VCS首次提交代码到Git

1、setting 2、vcs------>create git repository 3、右键项目----->Git------>add 4、右键项目------>git------>commit Directory 之后就会显示这个页面(下面写你提交的信息&#xff0c;就是你修改了什么) 点击commit,提交 5、Git--------->push 6、选择…

IDEA出现javax.servlet.http包错误解决方法

问题原因&#xff1a;缺少对应的jar包&#xff0c;其实tomcat服务器自带与HTTP一些相关的Jar包&#xff0c;没有导入进去。 解决方案1&#xff1a; 导入对应jar包 <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</…

图片如何去水印?ps去除图片上的水印应该怎么操作?教会你!

图片去水印是一个常见的需求&#xff0c;尤其在使用他人图片时&#xff0c;为避免版权问题&#xff0c;去除水印是很有必要的。Photoshop&#xff08;PS&#xff09;作为一款专业的图片处理软件&#xff0c;提供了多种去除水印的方法。以下是使用PS去除图片水印的几种详细步骤&…

SNAT和DNAT策略

1.SNAT策略及应用 SNAT应用环境&#xff1a;局域网主机共享单个公网IP地址接入Internet&#xff08;私有不能在Internet中被正常路由&#xff09; SNAT原理&#xff1a; 修改数据包的源地址。 SNAT转换前提条件&#xff1a; 局域网各主机已正确设置IP地址、子网掩码、默认网…

记录使用 Vue3 过程中的一些技术点

1、自定义组件&#xff0c;并使用 v-model 进行数据双向绑定。 简述&#xff1a; 自定义组件使用 v-model 进行传参时&#xff0c;遵循 Vue 3 的 v-model 机制。在 Vue 3 中&#xff0c;v-model 默认使用了 modelValue 作为 prop 名称&#xff0c;以及 update:modelValue 作为…

【十一】图解SpringBoot AOP实现原理

图解Spring AOP实现原理 概述 研究了一段时间spring原理&#xff0c;对spring的ioc和aop有了更深刻的理解&#xff0c;最大的体会就是spring的核心就是ioc和aop&#xff0c;spring的功能都是基于这两大特性延展开的&#xff0c;spring ioc管理了Java bean&#xff0c;spring ao…

怎么把3d模型旋转加复制---模大狮

在进行3D建模和设计过程中&#xff0c;经常需要对3D模型进行旋转和复制操作&#xff0c;这是设计过程中的常见需求。本文将介绍如何对3D模型进行旋转和复制&#xff0c;帮助读者更好地掌握这一重要的操作技巧。 一、旋转3D模型 在大多数3D建模软件中&#xff0c;旋转3D模型通常…