概述
1、通过构造方法创建:
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但地址值不同
2、直接赋值方式创建:
以 “ ” 方式给出的字符串,只要字符序列相同 ( 顺序和大小写 ),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
== 和equals的区别
==比较基本数据类型,比较的是具体的值
==比较引用数据类型:比较的是对象地址值
equals比较String类型: 比较的是对象的内容是否相
下面将结合代码说一下上面的知识点
案例1:
public class StringDiff1 {
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); //1 false
System.out.println(s1 == s3); //2 false
System.out.println(s3 == s4); //3 true
System.out.println("--------");
System.out.println(s1.equals(s2)); //4 true
System.out.println(s1.equals(s3)); //5 true
System.out.println(s3.equals(s4)); //6 true
System.out.println(s3.equals(chs)); //7 false
}
}
1、s1和s2都是通过new关键字创建的,内存地址与其他的都不相同,所以1和2都是false;s3和s4存在于字符串常量池中,在字符串常量池中是不会存储相同内容的字符串的,当String s4 = “abc”;时,发现在字符串常量池中已经存在“abc”了,于是s4和s3指向同一地址。
2、String的equals()方法比较的是两个字符串的内容,所以4/5/6都是true
3、String的equals()方法参数是Object类型,调用equals()方法可以传递任意类型的数据。但是,equals()方法的内部原理,优先判断如果参数不是String类型,直接返回false(s3是字符串类型,chs是字符数组,直接返回false);如果参数是String类型,才会去比较字符串的内容是否相同。源码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false; //如果比较的不是String类型,直接返回false
}
使用断点进行调试:s3和 chs类型不同,直接从1跳转到2
简易内存分配图:
案例2:
public class StringDiff2 {
public static void main(String[] args) {
String s1 = "Hello World";
String s2 = "Hello" + " World";
System.out.println(s1.equals(s2)); //1 true
System.out.println(s1 == s2); //2 true
System.out.println("----------");
String s3 = "abc";
String s4 = "ab";
String s5 = s4 + "c";
System.out.println(s3 == s5); //3 false
System.out.println(s3.equals(s5)); //4 true
}
}
1、String s2 = "Hello" + " World"; 此处+左右两边都是字符串常量对象,在编译期间JVM就能计算出结果字符串"Hello World",而该字符串"Hello World"在常量池空间中已经有了,不会再重新创建新的字符串处理对象"Hello World"了,所以1和2内容相同、地址相同(String s2 = "Hello" + " World"; 在编译的时候生成的.class文件就已经把两个字符串进行拼接了)
2、s4是变量,JVM在编译期间无法确定最终的结果的,简单理解: 在使用+进行字符串拼接时,只要+左右两边出现了字符串变量,那就相当于new,所以s3==s5为false
深度理解:
+ 中有字符串变量进行拼接时,内部使用StringBuilder完成字符串拼接后,再把StringBuilder通过new String的方法,转换成String对象
最后
以上就是缓慢超短裙为你收集整理的创造String对象两种方式的区别的全部内容,希望文章能够帮你解决创造String对象两种方式的区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复