Java String类原理分析

 

String用来表示字符串,Java中用一个final修饰的字符数组来存储字符。

在Java有两种定义字符串的方式,区别很大:

  (1)直接赋值。创建字符串的时候,系统先在内存的常量池中寻找有没有一模一样的字符串,要是有一样的,则新的引用也指向那个字符串。

    否则,在常量池中创建一个新的字符串。(推荐使用)

 

    String str = ''HELLO'';

 

  (2)通过关键字new调用String类的构造方法赋值。先在常量池中看看有没有同样内容的字符串,要是没有则在常量池中创建一个字符串,再用new在堆内存开辟一个空间,存储该字符串。

                 要是常量池中有该字符串,则直接使用new关键字在堆内存开辟空间,存储该字符串。

    使用第二种方式创建字符串,可能会创建2个对象,一个在常量池,一个在堆内存

    String str = new String("HELLO");

 

public class TestString {
    
    public static void main(String[] args) {
        
        String s1 = "Java";
        String s2 = new String("Java");
        String s3 = "Java";
        System.out.println(s1==s2);  //false ,s1 s3都指向常量池同一个位置,s2指向堆内存
        System.out.println(s1==s3);  //true
        
        //代码分析,四种情况:直接赋值字符串连接时,考虑编译期和运行期
        //如果在编译期,可以被确定,那么就使用已有的对象。否则,创建新的对象
        
        String s4 = "abc";  //编译期可以被确定
        String s5 = s4+"d"; //编译的时候,s4为一个变量,所以s5不可以确定,s5指向一个新创建的对象
        String s6 = "abcd";
        System.out.println(s5==s6); //false
        
        final String s7 = "abc";  //编译期可以被确定,因为s7属于常量
        String s8 = s7+"d"; 
        String s9 = "abcd";  //编译期可以被确定
        System.out.println(s8==s9); //true
        
        String str = getStr();   //在编译期方法不能被确定
        String s10 = "abc"+str;  
        String s11 = "abcd";
        System.out.println(s10==s11);  //false
        
        
        final String str2 = getStr();   //在编译期方法不能被确定
        String s12 = "abc"+str2;  
        String s13 = "abcd";
        System.out.println(s12==s13);  //false
    }
    
    public static String getStr() {
        return "d";
    }
}

 

 

 

    

 

posted @ 2022-05-22 23:32  藤原豆腐渣渣  阅读(106)  评论(0编辑  收藏  举报