关于intern

来源:互联网 发布:大华网络摄像机默认ip 编辑:程序博客网 时间:2024/05/21 22:21
1: String s = new String("abc")+"d";
1)栈中开辟一块空间存放引用s
2)常量池内开辟一块空间存储abc
3)常量池内开辟一块空间存储d
4)堆中开辟一块内存存放一个新建的String对象abc
5)堆中开辟一块内存存放一个新建的String对象abcd
6)将s的引用指向新建的String对象

2:String s = new String("abc");
1) 栈中开辟一块空间存放引用s, 
2) 在常量池里面开辟一块空间存储abc(很重要)
2) 堆中开辟一块空间存放一个新建的String对象"abc", 
3) 引用s指向堆中的新建的String对象"abc"

3:影响String的关键字final
例一:
 String s ="a";
 System.out.println(s+"b"=="ab");
    输出为false

例二: 
 final String s ="a";
 System.out.println(s+"b"=="ab");
     输出为true

例三:
public static void main(String[] args) {
        String a = "hello2";
        final String b = getHello();
        String c = b + 2;
        System.out.println((a == c));
    }
    public static String getHello() {
        return "hello";
    }
    输出为false,虽然b用final修饰了,但是由于赋值是通过方法调用返回的,那么他的值只能在运行期间确定
    因此a和c指向的不是同一个对象
   
原因:在例二中用final修饰的变量可以理解为常量,即可以把s换成“a”;
而在例一中s+“b”中的s是引用加上一个常量,会重新在堆里面开辟一块内存来存储对象

例三:
 String s1="a";
 String s2="b";
 System.out.println("ab"==s1+s2);
    输出为false
原因:s1+s2会在堆里面新开辟一块内存来存储对象ab,故跟常量池里面的“ab”是不同的

String str1 = new StringBuilder("ja").append("va").toString();
System.out.println(str1.intern()==str1);//输出为false

解释:假设在jdk1.7的情况下,首先在常量池创建ja,va两个对象,堆内存创建了ja对象,总的在堆内存创建了java对象
在栈里面有一个str1指向堆里面的地址,然后str1.intern(),此时,在常量池里面有"java"这个关键字,所以intrn()
方法返回该字符串在常量池的位置,而str1是在堆内存的引用,所以两者不同

String str2 = new StringBuilder("ja").append("av").toString();
System.out.println(str2.intern()==str2);//输出为true
解释:假设在jdk1.7的情况下,首先在常量池创建ja,av两个对象,堆内存创建了ja对象,总的在堆内存创建了jaav对象
在栈里面有一个str2指向堆里面的地址,然后str2.intern(),此时没有在常量池发现jaav常量,所以在常量池里面留下了
一个str2的引用,指向堆内存;而str2正好也指向了堆内存,所以两者相等

jdk1.6中的intern方法
调用intern方法的时候首先会去常量池中查看是否存在与当前String值相同的值,如果存在的话,则直接返回常量池中这个String值的引用;
解释:让s=目标.intern(),如果常量池有这个字符串,则s的地址就是指向常量池的地址;如果没有则拷贝一份字符串到常量池,s的地址还是
指向常量池中的地址;
如果不存在的话,则会将原先堆中的该字符串拷贝一份到常量池中。
 
jdk1.7中的intern方法
调用intern方法的时候首先会去常量池中查看是否存在与当前String值相同的值,如果存在的话,则直接返回常量池中这个String值的引用;
解释:让s=目标.intern(),如果常量池有这个字符串,则s的地址就是指向常量池的地址;如果没有则拷贝一份引用到常量池中,s的地址指向
的就是堆内存的地址
如果不存在的话,则只会将原先堆中该字符串的引用放置在常量池中,并不会将拷贝整个字符串到常量池中。
原创粉丝点击