欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java String 那些事

程序员文章站 2022-05-06 08:02:57
...
public class StringDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		String a = "test"; 		//字符串常量池中创建空字符串,a引用常量池中的字符串地址
		String b = "test";		//字符串常量池中已经存在空字符串,直接返回常量池中的字符串地址给b
		System.out.println("内存地址是否一致:"+(a==b)); //true
		String c = new String("test"); // 字符串常量池中存在字符串“test”,不需要创建,堆中生成新的字符串对象“test”,并将它的堆内存地址返回给c
		String d = new String("test"); // 字符串常量池中存在字符串“test”,不需要创建,堆中生成新的字符串对象“test”,并将它的堆内存地址返回给d
		System.out.println("内存地址是否一致:"+(c==d)); //false
		System.out.println("两个对象值是否相等:"+a.equals(c)); //true
		
		String e = a.intern();		//返回与a对象在常量池中值相等的字符串
		String f = c.intern();		//返回与c对象在常量池中值相等的字符串
		
		System.out.println("两者在字符串常量池中的字符串对象是否一致:"+(e==f)); //true,说明字符串常量池中不存在值相同的字符串
		
		String g = "HelloWorld";
		String h = "Hello" + "World";
		
		String i = "Hello";
		String j = "World";
		
		System.out.println("原串与编译期拼接字符串内存地址是否一致:"+(g==h)); //true,字符串常量在编译时,对字符串拼接进行了优化,拼接后的字符串会存放在字符串常量池中
		System.out.println("原串与运行期拼接字符串内存地址是否一致:"+(g==(i+j))); //false,字符串引用变量,在运行时,在堆中进行拼接,是在堆中生成新的字符串
		
	}

}