1、String 概述
(1)String 类在 java.lang 包下,所以使用的时候不需要导包。
(2)String 类代表字符串,Java程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是String 类的对象。
2、字符串的优点
(1)字符串不可变,它们的值在创建后不能被更改。不可变原因是它底层接收的char数组变量被定义成了final。
(2)虽然 String的值是不可变的,但是它们可以被共享。
(3)字符串效果上相当于字符数组( char[]),但是底层原理是字节数组( byte[])。JDK8及以前是字符数组,JDK9及以后是字节数组。
3、String 对象的特点
(1)通过 new 创建的字符串对象,每一次 new都会申请一个内存空间,虽然内容相同,但是地址值不同。看代码实现:
public class StringTest {
public static void main(String[] args) {
char[] chs = {'a', 'b', 'c'};
String s1 = new String(chs);
String s2 = new String(chs);
}
}
上面的代码中,JVM会首先创建一个字符数组,然后每一次new的时候都会有一个新的地址,只不过s1和s2参考的字符串内容是相同的。
(2)以 “” 方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个String 对象,并在字符串常量池中维护。
public class StringTest {
public static void main(String[] args) {
String s3 = "abc";
String s4 = "abc";
}
}
在上面的代码中,针对第一行代码,JVM 会建立一个String对象放在字符串池中,并给s3参考;第二行则让 s4 直接参考字符串池中的 String 对象,也就是说它们本质上是同一个对象。
4、String代码运行内存图
(1)代码如下
public class StringTest {
public static void main(String[] args) {
char[] chs = {'a', 'b', 'c'};
String s1 = new String(chs);
String s2 = new String(chs);
System.out.println(s1==s2);
String s3 = "abc";
String s4 = "abc";
System.out.println(s3==s4);
System.out.println(s1==s3);
}
}
运行结果
(2)运行内存图分析
在执行下方输出之前,它会先在堆内存中创建三个空间,这三个空间地址都不一样,所以在执行输出时,它比较的是栈内存中的地址值,输出false。
进行比较输出之前,它会在常量池中创建常量字符串“abc”,然后s3和s4都指向这个常量字符串的地址004,输出时比较的是栈内存中的地址值,输出true。
最后一个输出同理,比较的也是栈内存中的地址值,输出false。
5、字符串比较
(1)使用 ==做比较
- 基本类型:比较的是数据值是否相同;
- 引用类型:比较的是地址值是否相同。
(2)字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals():
- public boolean equals(0bject anObject):将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串。
(3)代码实现
public class StringTest {
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(s3==s4);
System.out.println(s1==s3);
System.out.println("----------");
//比较字符串对象内容是否相同
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s3.equals(s4));
}
}
运行结果
思考一下:为什么通过equals()方法就可以对内容进行比较呢?
想了解相关原因,可参照链接String 调用equals为什么可以比较内容而不是地址-CSDN博客
本文为学习笔记,所参考文章均已附上链接,若有疑问请私信!
创作不易,如果对你有点帮助的话麻烦点个赞支持一下!
新手小白,欢迎留言指正!