java中String类的‘==’与equals()的使用及不同String定义下的存储方式

一、String的定义方式

  • String str1 = “I love CSDN”;
  • String str2 = new String(“I Love csdn”);

二、String属于引用数据类型

  1. String声明为final的,不可被继承
  2. String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小
  3. String内部定义了final char[] value用于存储字符串数据
  4. 通过字面量的方式(区别于new给一个字符串赋值,此时的字符串值声明在字符串常量池中)。
  5. 字符串常量池中是不会存储相同内容(使用String类的equals()比较,返回true)的字符串的。

三、String的不可变性

  1. 说明
    • 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
    • 当对现的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
    • 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
  2. 代码举例
String s1 = "abc";//字面量的定义方式
String s2 = "abc";
s1 = "hello";

System.out.println(s1 == s2);//比较s1和s2的地址值

System.out.println(s1);//hello
System.out.println(s2);//abc

System.out.println("*****************");

String s3 = "abc";
s3 += "def";
System.out.println(s3);//abcdef
System.out.println(s2);

System.out.println("*****************");

String s4 = "abc";
String s5 = s4.replace('a', 'm');
System.out.println(s4);//abc
System.out.println(s5);//mbc

java中String类的‘==’与equals()的使用及不同String定义下的存储方式_第1张图片

四、String实例化的不同方式

  1. 方式说明
    方式一:通过字面量定义的方式
    方式二:通过new + 构造器的方式
  2. 代码举例
    //通过字面量定义的方式:此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中。
    String s1 = “javaEE”;
    String s2 = “javaEE”;
    //通过new + 构造器的方式:此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值。
    String s3 = new String(“javaEE”);
    String s4 = new String(“javaEE”);

System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s1 == s4);//false
System.out.println(s3 == s4);//false

  1. 面试题
    String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?
    两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:“abc”
  2. 图示:
    java中String类的‘==’与equals()的使用及不同String定义下的存储方式_第2张图片

五、测试==与equals()

String s1 = "javaEE";
String s2 = "hadoop";

String s3 = "javaEEhadoop";
String s4 = "javaEE" + "hadoop";
String s5 = s1 + "hadoop";
String s6 = "javaEE" + s2;
String s7 = s1 + s2;

System.out.println(s3 == s4);//true
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
System.out.println(s5 == s6);//false
System.out.println(s5 == s7);//false
System.out.println(s6 == s7);//false

String s8 = s6.intern();//返回值得到的s8使用的常量值中已经存在的“javaEEhadoop”
System.out.println(s3 == s8);//true
****************************
String s1 = "javaEEhadoop";
String s2 = "javaEE";
String s3 = s2 + "hadoop";
System.out.println(s1 == s3);//false

final String s4 = "javaEE";//s4:常量
String s5 = s4 + "hadoop";
System.out.println(s1 == s5);//true

问题来了:
String str1 = “hello”;
String str2 = “he”+new String(“llo”);
str1==str2的结果是什么呢?

答案:false,在创建str2时,并不会从常量池中找到hello,所以还会创建一个新的对象。

你可能感兴趣的:(以前积累,java,开发语言,后端)