1、内存与String相关的知识点
- String的声明是final的,不可被继承
- String 实现了Serializable接口:表示String支持序列化
- String实现了Comparable:表示String可以比较大小
- String 内部定义了final char[] value 用于存储字符串数据
- String 为不可变字符序列(对现有字符串操作时,需重指定内存区域赋值,哪怕是调用replace()方法)
- 字面量的方式赋值,字符串声明在常量池中,常量池中不存重复的量
- new 对象时,对象在堆内存
2、测试查验
package com.test;
import org.junit.Test;
public class TestString {
@Test
//用测试方法学习验证String 特点
public void test(){
//字面量的方式实例化
//对象在方法去常量池中
//这种方式堆内存没对象
String s1 = "zhou";
String s2 = "zhou";
String string1 = "hello";
//new+构造器的方式实例化
String string2 = new String("9527");
String string3 = new String("9527");
String string4 = "javaEE";
String string5 = "hadoop";
String string6 = "javaEEhadoop";
String string7 = "javaEE"+"hadoop";
String string8 = string4+"hadoop";
String string9 = "javaEE"+string5;
//地址值如果相等说明是同一个即不变性
System.out.println(s1 == s2);//true
System.out.println(string1);
System.out.println(s2);
//是两个不同对象(堆内存)
//堆内存里面两个不同的对象指向常量池中的9527
//两个对象,一个在堆内存,一个在常量池中
System.out.println(string2==string3);//false 比较堆内存中的
System.out.println("***************************************");
System.out.println(string6 == string7);//true
//右边有其他变量,都不在常量池,二在堆中
System.out.println(string6 == string8);//false
System.out.println(string6 == string9);//false
//返回值得到的string10使用常量池中已经存在的 ''javaEEhadoop''
String string10 = string5.intern();
System.out.println(string10 = string6);//true
}
}
运行结果
true
hello
zhou
false
***************************************
true
false
false
javaEEhadoop