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"; } }
本文来自博客园,作者:藤原豆腐渣渣,转载请注明原文链接:https://www.cnblogs.com/javafufeng/p/16299604.html