中国石化工程建设公司网站怎么做自己的充值网站
中国石化工程建设公司网站,怎么做自己的充值网站,六安seo公司选择8火星,广告设计公司网文章目录 1、什么是intern#xff1f;2、经典例题解释例1例2例3 1、什么是intern#xff1f;
String::intern()是一个本地方法#xff0c;它的作用是如果字符串常量池中已经包含一个等于此String对象的字符串#xff0c;则返回代表池中这个字符串的String对象的引用#… 文章目录 1、什么是intern2、经典例题解释例1例2例3 1、什么是intern
String::intern()是一个本地方法它的作用是如果字符串常量池中已经包含一个等于此String对象的字符串则返回代表池中这个字符串的String对象的引用否则会将此String对象包含的字符串添加到常量池中并且返回此String对象的引用。----书上描述
已经包含。。。可能不太好理解。我画图解释 方法的执行顺序肯定是从下向上依次执行的。 String s1 “11”; 先去字符串常量池中查看是否已经存在“11”如果存在则直接返回11的地址如果不存在则会在字符串常量池中创建“11”然后返回创建好的“11”的地址。因为之前未创建过所以该指令会先去字符串常量池中创建“11”然后返回11的地址 501。 String s2 new String(“11”); 也是先去字符串常量池中查看是否已经存在“11”如果有就在堆中创建对象存的是字符串常量池中“11”的地址501最后将堆中对象的地址601返回给S2 。 String s3 s2.intern(); intern方法会从字符串常量池中查询当前s2字符串11是否存在若不存在就会在字符串常量池中创建字符串11的实例 由于s1已经在字符串常量池中已经创建了“11”s2.intern()则返回501。
System.out.println(s1s2);
System.out.println(s1s3);false
trues1s2 返回false是因为s1指向的是字符串常量池中的11对象501而s2指向的是堆中存储了11的地址的对象601 s1s3 返回true 是因为s3和s1都指向的是字符串常量池中的11。
对String srt new String(“str”)与 str1 ”str“的区别不了解的话可以看篇文章
2、经典例题解释
例1
//1
String s new String(1);
//2
s.intern();//调用此方法之前字符串常量池中已经存在了1.
//3
String s2 1;
//4
System.out.println(ss2);执行1会创建两个对像在字符串常量池中创建一个”1“在堆中创建一个String对象并存储“1”在字符串常量池中的的地址。执行2调用此方法之前字符串常量池中已经存在了1所以此指令什么都没做此时s指向堆中的对象。执行3由于字符串常量池中已经存在了“1”所以不需要再创建返回“1”的地址s2指向字符串常量池中的”1“。执行4由于s指向堆中对象s2指向字符串常量池中的对象所以打印结果是false。
这是比较简单的例子 下面上强度了
例2 //1String s3 new String(1)new String(1);//2s3.intern();//3String s4 11;//4System.out.println(s3s4);执行1会在堆中创建两个存储字符串”1“的地址的对象和一个字面量为”11“的String对象在字符串常量池中创建一个”1“字符串实例。 在编译期间在创建String对象之前会先创建一个StringBuilder对象后面每次在堆中创建完一个String对象会对该字符串执行LDC指令LDC指令会先到字符串常量池中查找是否存在对应字符串实例的引用如果有的话那么直接返回这个字符串实例的地址给堆中的new的String对象如果没有的话会创建一个字符串实例然后将其添加到字符串常量池中之后再返回这个字符串实例对象的地址给堆中创建的对象。完成String对象初始化后都会执行StringBuilder::append()方法将该字符串拼接到StringBuilder对象里。当都拼接完会执行StringBuilder::toString()方法返回一个在堆中新new的String对象value为11。 可以通过编译后的字节码文件清晰的观察整个过程 标注的都是刚才介绍的行为。 执行2由于toString()方法只在堆中创建了一个”存储11的String对象并没有在字符串常量池中创建11字符串实例。按之前的说法intern应该去字符串常量池中创建字符串”11“的实例但是在JDK7中并没有在字符串常量池中创建字符串11的实例由于堆中已经存在了11这个String对象那么为了节省空间会在字符串常量池中申请一块空间存放这个String对象的地址并返回存放的地址也就是堆中存储11的String对象的地址。 执行3会去字符串常量池中查找是否存在11,因为第二行已经在字符串常量池中创建了存储堆中存储11的String对象的地址的空间则直接返回空间里面存储的堆中String对象的地址所以s4也指向了堆中存储11的String对象。 由于s3和s4都指向堆中同一个对象所以打印结果为true。 如图所示 通过debug可以看到两个句柄指向的地址是一样的 打印结果
例3 //1String s3 new String(1)new String(1);//2String s4 11;//3s3.intern();//4System.out.println(s3s4);第一行执行结果与例2的第一行执行结果一致。执行2由于字符串常量池中还没有11,则向字符串常量池中创建字符串11的实例并返回实例的地址。执行3由于字符串常量池中已经存在11,则不需要再创建返回实例的地址但由于没有赋值操作所以该行代码没有什么作用。此时s3指向堆中存储了“11”的String对象而s4指向的是字符串常量池中字符串为11的实例所以指向的地址不同打印结果为false 通过debug可以看到两个句柄指向的地址是不同的 打印结果
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88208.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!