JAVA复习3
观察字符串常量池概念
public class StringDemo {
public static void main(String[] args) { String str1="hello";
String str2="hello";
String str3="hello";
System.out.println(str1==str2); //true
System.out.println(str2==str3); //true
System.out.println(str3==str1); //true } } |
通过以上的代码分析,发现结果都为true ,在String 直接赋值的情况下,则存在字符串常量池,赋值之后 String的内容会自动进入到字符串常量池 接下来的对象在进行赋值的时候会先去判断字符串常量池中是否存在相同的内容,如果存在则不创建直接引用
两种实例化方式的区别?
1 直接赋值 赋值的内容会自动进入到字符串常量池, 只开辟一块空间
2 通过构造方法赋值 : 不会自动进入到字符串常量池, 开辟了两块空间
如果想要 通过构造方法实例化的String进入到字符串常量池 则可以手动调用intern方法
String str2=new String("hello").intern(); |
要先验证字符串不可改变,首先发现String类中的内容都是以字符数组完成的,数组的问题是一旦声明则长度不可改变
字符串的内容是不能改变的,改变的是String的引用,如果在程序中大量的产生了字符串拼接操作,则就会大量的产生垃圾空间
For(int i=0;i<1000000;i++){
Str+=hello world;
}
String类 不适合大量的频繁的修改字符串的内容,以后可以使用StringBuffer 或者 StirngBuilder类去解决字符串频繁修改的操作
总结:
String类特点:
1 两种实例化方式的区别?
直接赋值 String str=”hello”
构造方法赋值 String str=new String(“hello”)
直接赋值 只开辟一块空间,会自动进入到字符串常量池
构造方法赋值: 开辟了两个空间其中一块是垃圾空间,不会自动进入到字符串常量池 但是可以通过调用intern方法手动进入常量池
2 字符串的常量就为String类的匿名对象 “hello”.equals()方法验证
3 字符串内容一旦声明则不可改变 ,改变只是String 类 的引用(原因底层使用的数组,数组的长度不可改变)
Final 类 不能被继承 变量 不能被修改(常量) 方法(不能被覆写)
面试题:以上内容为面试题