概述
String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!
特点
-
字符串不可变,它们的值在创建后不能被更改
-
虽然 String 的值是不可变的,但是它们可以被共享
-
字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )
常用的构造方法
方法名 | 说明 |
---|---|
public String() | 创建一个空白字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(byte[] bys) | 根据字节数组的内容,来创建字符串对象 |
String s = “abc”; | 直接赋值的方式创建字符串对象,内容就是abc |
public class StringTest {public static void main(String[] args) {//public String():创建一个空白字符串对象,不含有任何内容String s1 = new String();System.out.println("s1:" + s1);//public String(char[] chs):根据字符数组的内容,来创建字符串对象char[] chs = {'a', 'b', 'c'};String s2 = new String(chs);System.out.println("s2:" + s2);//public String(byte[] bys):根据字节数组的内容,来创建字符串对象byte[] bys = {97, 98, 99};String s3 = new String(bys);System.out.println("s3:" + s3);//String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abcString s4 = "abc";System.out.println("s4:" + s4);}
}
创建字符串对象两种方式的区别
- 通过构造方法创建
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
-
直接赋值方式创建
以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
==号比较的到底是什么
基本数据类型 具体数据值
int a = 10;
int b = 20;
System.out.println(a == b) //false
引用数据类型 地址值
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2) //false
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2) //true
equals方法的作用
equals()只能作用在引用数据类型
,无法作用在基本数据类型
equals()方法在不重写的情况下调用的是"=="也就是比较两个对象的地址值是否一致,但是很多类(如String, Integer等)都重写了equals方法,以便按照对象的内容而不是内存地址进行比较。例如,对于String类,"equals"方法会比较两个字符串中的字符是否完全相同。如果重写后具体对比的含义根据重写规则而定
方法介绍
public boolean equals(String s) 比较两个字符串内容是否相同、区分大小写
public class StringTest1 {public static void main(String[] args) {//构造方法的方式得到对象char[] chs = {'a', 'b', 'c'};String s1 = new String(chs);String s2 = new String(chs);//直接赋值的方式得到对象String s3 = "abc";String s4 = "abc";//比较字符串对象地址是否相同System.out.println(s1 == s2);System.out.println(s1 == s3);System.out.println(s3 == s4);System.out.println("--------");//比较字符串内容是否相同System.out.println(s1.equals(s2));System.out.println(s1.equals(s3));System.out.println(s3.equals(s4));}
}//结果
false
false
true
--------
true
true
true
遍历字符串
public class StringTest2 {public static void main(String[] args) {//输入字符串并打印Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串");String str = sc.next();//遍历for(int i = 0; i < str.length(); i++){//i 依次表示字符串的每一个索引char c = str.charAt(i);System.out.println(c);}}
}
subString()
截取
String subString(int beginIndex,int endIndex)
包头不包尾,包左不包右.
只有返回值才是截取的小串
截取到末尾
String subString(int beginIndex)
注意点:只有返回值才是替换之后的结果
StringBuilder
StringBuilder可以看成是一个容器,创建后里面的内容是可变的
当我们在拼接字符串和反转字符串的时候会使用到
常用方法
append()
public StringBuilder append(任意类型)
reverse()
public StringBuilder reverse()
length()
public int length()
toString()
public String toString()
public class StringBuilderTest {public static void main(String[] args) {//1.创建对象StringBuilder sb = new StringBuilder("abc");//2.添加元素sb.append(1);sb.append(2.3);sb.append(true);//反转sb.reverse();//获取长度int len = sb.length();System.out.println(len);//打印//普及://因为StringBuilder是Java已经写好的类//java在底层对他做了一些特殊处理。//打印对象不是地址值而是属性值。System.out.println(sb);}
}
StringJoiner
-
StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
- 作用:提高字符串的操作效率,代码编写简洁
-
JDK8出现的
基本使用:
//1.创建一个对象,并指定中间的间隔符号
StringJoiner sj = new StringJoiner("---");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
//3.打印结果
System.out.println(sj);//aaa---bbb---ccc
//1.创建对象
StringJoiner sj = new StringJoiner(", ","[","]");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
int len = sj.length();
System.out.println(len);//15
//3.打印
System.out.println(sj);//[aaa, bbb, ccc]
String str = sj.toString();
字符串拼接的底层原理
如果没有变量参与,都是字符串直接相加,编译后就是拼接之后的结果,会复用串池中的字符串
如果有变量参与,每一行拼接的代码,都是在内存中创建新的字符串,浪费内存
public class StringTest3 {public static void main(String[] args) {String s1 = "abc";//记录串池中的地址值String s2 = "a"+"b"+"c";//复用串池中的字符串System.out.println(s1 == s2);//true}
}
//在编译的时候,会将"a"+"b"+"c"拼接成"abc"
打乱字符串
public class test7 {public static void main(String[] args) {//键盘输入任意字符串,打乱里面的内容//1.键盘输入任意字符串String str = "abcdefg";//2.打乱里面的内容//修改字符串里面的内容://1.subString //2.变成字符数组char[] arr = str.toCharArray();//['a','b','c','d','e','f','g']//3.打乱数组里面的内容//从0索引开始,跟一个随机索引进行位置的交换//当数组里面的每一个元素都跟一个随机索引进行交换完毕之后,那么内容就打乱了Random r = new Random();for (int i = 0; i < arr.length; i++) {int randomIndex = r.nextInt(arr.length);//拿着随机索引指向的元素,跟i指向的元素进行交换char temp = arr[i];arr[i] = arr[randomIndex];arr[randomIndex] = temp;}//4.把字符数组再变回字符串String result = new String(arr);System.out.println(result);}
}