p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解
选中代码后按ctrl+ait+t可以选择语句体包围这块代码
String类
String类表示字符串,java中所有的字符串文字都为此类的对象
字符串的内容是不会发生改变的,它的对象在创建后不能被更改!!!
String name = "张三";
name = "李四";
第二行代码是将李四
代替了张三
如果拼接了两个字符串,则会产生一个新的字符串
由于String类在lang包里面,所以使用的时候不用导包
创建String对象的两种方式
- 直接赋值
String name = "张三";
- 使用构造方法来创建字符串
以下为部分构造方法
以下为其使用方式及其应用场景
public static void main(String[] args) {
//第一种:使用直接赋值的方式来获取一个字符串对象
String string1 = "abc";
System.out.println(string1);
//当使用双引号直接赋值的时候,系统会检查该字符串在串池中是否存在
//不存在则创建新的;存在则复用
//第二种:使用new的方式来获取一个字符串对象
//比如空参构造就可以获得一个空白的字符串对象
//没什么用
String string2 = new String();
System.out.println("→"+string2+"←");// “”
//也可以传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象
//没什么用
String string3 = new String("helloWorld");
System.out.println(string3);
//也可以传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
char[] arr = {'a','b','c','d'};
String string4 = new String(arr);
System.out.println(string4);
//作用:拼接字符数组的字符
//应用场景:我们可以将一个字符串存储到字符数组中
//通过改变字符数组的内容就可以间接改变字符串的内容
//也可以传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象
byte[] bytes = new byte[]{97,98,99,100};
String string5 = new String(bytes);
System.out.println(string5);
//作用:将字节数组中的数字经过ASCII码表转换成字符后在进行拼接
//应用场景:以后在网络当中传输的数据其实都是字节信息
//我们一般要把字节信息进行转换,转换成字符串,此时就要用到这个构造了
}
字符串的比较
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1==s2);
输出false
原因如下
如果==号比较的是基本数据类型,则实质上比较的是两个元素的数据值
如果==号比较的是引用数据类型,则实质上比较的是两个元素的地址值
而上述的s2是new出来的新对象,因此其地址值自然与s1不同
又如下面这种情况
String s1 = "abc";
String s2 = "abc";
System.out.println(s1==s2);
输出true
这是因为创建s1对象的时候将abc这一个字符串新增加在了串池里面,由于s2的字符串与s1一致,所以s2的地址值也就是s1的地址值,即abc的地址值
又如下面这种情况
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1==s2);
输出false
这是因为s1、s2都是通过构造方法创建的,两个对象都是new出来的,因此二者对应的abc都存储在堆内存里,并且二者的地址值不停
只要是new出来的,都是在堆内存里开辟了一个小空间
要想比较字符串的内容,就必须要使用String里面的方法
如果只对字符串的内容进行比较的话我们可以使用以下方法
equals()方法
完全一样结果才为true,否则为false
格式
boolean 变量 = 字符串对象1.equals(字符串对象2);
equalsIgnoreCase()方法
忽略大小写的比较
boolean flag2 = s1.equalsIgnoreCase(s2);
字符串的遍历
字符串的遍历需要用到两个方法
charAt()方法
作用为根据索引返回字符
格式
char 变量 = 字符串.charAt(字符串的索引);
length()方法
返回此字符串的长度
格式
int 变量 = 字符串.length();
注意
.
数组的长度:数组.length
字符串的长度:字符串.length()
举例
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入字符串");
String string = scanner.next();
//遍历
for (int i = 0; i < string.length(); i++) {
System.out.println(string.charAt(i));
}
}
}
这样就得到了字符串的每一个字符
通过遍历我们便可以对字符串进行统计字符次数、、字符串的拼接、字符串的反转等操作
字符串的截取
substring()方法
作用为根据索引截取字符串的一部分
格式
String 变量 = 字符串.substring(索引1,索引2);
//索引2可以不写,
//此时就是截取从索引1对应字符开始到最后一个字符
substring,翻译为子字符串
注意
包头不包尾、包左不包右
只有返回值才是截取的字符串
该方法并不会改变原来的字符串
字符转换为数字
利用ASCII码表进行转换
字符串的替换
replace()方法
格式
String 变量 = 字符串.replace(旧值,新值);
注意
只有返回值才是截取的字符串
该方法并不会改变原来的字符串
字符串的检测
contains() 方法
contains() 方法用于判断字符串中是否包含指定的字符或字符串。
格式
boolean 变量 = 字符串.contains(要判断的字符或字符串);
StringBuilder类
StringBuilder类是用来存储一串字符的容器
与String类不同的是,StringBuilder类对象的内容是可以更改的,可以看成一个长度可以变化的字符串(但不是字符串,因为字符串只要创建就不能改变了)
这个特点提高了字符串的操作效率
直接打印StringBuilder类输出的是对象的属性值
举例
String s1 = "aaa";
String s2 = "bbb";
String s3 = "ccc";
String s4 = "ddd";
String s = s1 + s2 + s3 + s4;
如果这样拼接字符串的话每次进行一次拼接操作(即“+”)都会产生一个新的字符串
这种方式非常影响内存以及运行效率
而使用StringBuilder类则可以减少内存使用和提高运行效率
StringBuilder构造方法
- 空参构造(创建一个空白可变字符串,不含有任何内容)
格式
StringBuilder 变量 =new StringBuilder();
- 有参构造(根据字符串的内容,来创建可变字符串的对象)
StringBuilder 变量 = new StringBuilder(参数);
StringBuilder成员方法
append()成员方法
在StringBuilder类对象后面添加相应的内容
格式
StringBuilder类变量.append(添加的内容);
也可以一次性添加多个内容
StringBuilder类变量.append("A").append(true).append(2).append(3.0);
reverse()成员方法
反转对象
格式
StringBuilder类变量.reverse();
length()成员方法
获取长度
格式
int 变量 = StringBuilder类变量.length();
toString()成员方法
返回一个字符串
格式
String 变量 =StringBuilder类变量.toString();
扩展:链式编程
内容:
当我们在调用一个方法时,不需要使用变量来接收方法的结果,可以继续调用其他方法
即依赖前一个方法的结果再去调用后面的方法
下面的代码即为一种链式编程
public static void main(String[] args) {
int len = getString().substring(1).replace("b","B").length();
System.out.println(len);
}
public static String getString(){
return "abc";
}
这也是一种链式编程
StringBuilder类变量.append("A").append(true).append(2).append(3.0);
使用 StringBuilder类的时机及例题
- 字符串的拼接
- 字符串的反转
例题1
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
//键盘输入一个字符串,判断该字符串是否是对称字符串,并在控制台打印是或不是
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符串");
String string = scanner.next();
//反转字符串
String string1 = new StringBuilder().append(string).reverse().toString();
if (string.equals(string1)){
System.out.println("是");
}
else {
System.out.println("不是");
}
}
}
例题2
package study.jichu3.zifuchuan.StringBuilder;
public class Test3 {
public static void main(String[] args) {
//定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回
//调用该方法,并在控制台输出结果
//例如
//数组为 int[]arr = {1,2,3,4,5};
//输出结果为:[1,2,3,4,5]
int[]arr = new int[]{1,2,3,4,5};
String string = arrToString(arr);
System.out.println(string);
}
public static String arrToString(int[]arr){
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if (i== arr.length-1){
sb.append(arr[i]);
}
else {
sb.append(arr[i]).append(",");
}
}
sb.append("]");
return sb.toString();
}
}
StringJoiner类
StringBuilder类是用来存储一串字符的容器
与String类不同的是,StringBuilder类对象的内容是可以更改的,可以看成一个长度可以变化的字符串(但不是字符串,因为字符串只要创建就不能改变了)
这个特点提高了字符串的操作效率
StringJoiner构造方法
- 有参构造(创建一个StringJoiner对象,指定拼接时的间隔符号)
格式
StringJoiner变量 =new StringJoiner(间隔符号);
举例
StringJoiner sj = new StringJoiner("---");
sj.add("aaa").add("bbb").add("ccc");
System.out.println(sj);
输出结果为
aaa---bbb---ccc
- 有参构造(创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号)
StringJoiner变量 = new StringJoiner(间隔符号,开始符号,结束符号);
举例
StringJoiner sj = new StringJoiner("---","[","]");
sj.add("aaa").add("bbb").add("ccc");
System.out.println(sj);
输出结果为
[aaa---bbb---ccc]
StringJoiner成员方法
add()成员方法
添加数据并返回对象本身
格式
StringJoiner类变量.add(添加的内容);
也可以一次性添加多个内容
StringJoiner类变量.add("A").add("true").add("2").add("3.0");
length()成员方法
获取长度
格式
int 变量 = StringJoiner类变量.length();
toString()成员方法
返回一个字符串
格式
String 变量 =StringJoiner类变量.toString();