Java常用类——String类概论

String概述与不可变性

String是一个final类,代表不可变的字符序列
字符串是常量,用双引号表示,它们的值在创建之后不能更改
String对象的字符内容是存储在一个字符数据final value[]中的
String实现了Serializable接口:表示字符串可以序列化的
String实现了Comparable接口:表示字符串可比较的(按字典序)

        String s1 = "abc";  //字面量方式定义
        String s2 = "abc";
        System.out.println(s1==s2); //输出true

        String s4="abc";
        String s5=s4.replace('a','b');
        System.out.println(s4); //输出abc
        System.out.println(s5); //输出bbc
  • 字面量都存储在方法区的字符串常量池中,常量池中不会有第二个相同的字符串
  • 字符串不能被修改,一般赋值或者连接(+)都是造了新的字符串常量
  • 调用String的replace()方法时,也必须新造字符串常量

String对象的创建

        String str="hello";  //字面量定义
        String s1 = new String();  //本质上this.value = new char[0];
        String s2 = new String(String original);  //本质上this.value = original.value;
        String s3 = new String(char[] a);
        String s4 = new String(char[] a, int startIndex, int count);  //从数组a[]的第startindex开始的count个字符
        String s1 = "javaEE";
        String s2 = "javaEE";
        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

总之,如果是字面量定义,"=="之下很可能相等,因为地址值一样
否则仔细判断对象的地址...

面试题:String s=new String("abc");方式创建了几个对象?
两个,一个堆空间new结构,另一个是char[]型对应常量池的数据

String类的不同拼接操作

1.常量与常量的拼接结果在常量池中,且常量池中不会存在相同内容的常量
2.连接符中只要有一个是变量,结果就在堆中(有new结构)
3.如果拼接的结果调用intern()方法,返回值就在常量池中

 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;
        String s8= s5.intern();
        
        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
        System.out.println(s3==s8); //true

posted @ 2022-05-04 21:45  JayerListen  阅读(42)  评论(0编辑  收藏  举报