关于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的地址指向
的就是堆内存的地址
如果不存在的话,则只会将原先堆中该字符串的引用放置在常量池中,并不会将拷贝整个字符串到常量池中。
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的地址指向
的就是堆内存的地址
如果不存在的话,则只会将原先堆中该字符串的引用放置在常量池中,并不会将拷贝整个字符串到常量池中。
阅读全文
0 0
- 关于intern
- 关于intern()方法
- 关于String.intern()
- 关于intern和字符串
- 关于String.intern()
- 关于String.intern()的思考
- intern
- 关于String的intern方法的讨论
- 关于java中String的 intern()方法
- 关于Java中intern关键词的疑惑
- String.intern()详解,关于String s2 = new String("ja") + new String("va"); s2.intern();
- 关于 String的intern() 的用途 及简单测试
- jdk1.7 sun hotspot关于string.intern()内存溢出
- 关于java String的intern()方法的理解
- ATC intern
- String intern()
- String intern()
- String.intern();
- liunx 内存释放
- nutz自定义sql查询
- 多目标跟踪的简单理解
- Cookie的使用细节;Session的概述
- NOIP 2017 时间复杂度
- 关于intern
- 前台开发记录
- SpringMVC基础-8-JSON与Restful支持
- EventBus详细解析
- 多维数组和一维数组的转换
- 开启一个线程,定时刷新窗口
- 文章标题
- JSP基础语法
- Machine Learning 基础概念