String地址
来源:互联网 发布:vba编程 编辑:程序博客网 时间:2024/06/05 19:58
已经过测试,真的诶-O-
JVM内存区域里面有一块常量池,关于常量池的分配:
- JDK6的版本,常量池在持久代PermGen中分配
- JDK7的版本,常量池在堆Heap中分配
字符串是存储在常量池中的,有两种类型的字符串数据会存储在常量池中:
- 编译期就可以确定的字符串,即使用""引起来的字符串,比如String a = "123"、String b = "1" + B.getStringDataFromDB() + "2" + C.getStringDataFromDB()、这里的"123"、"1"、"2"都是编译期间就可以确定的字符串,因此会放入常量池,而B.getStringDataFromDB()、C.getStringDataFromDB()这两个数据由于编译期间无法确定,因此它们是在堆上进行分配的
- 使用String的intern()方法操作的字符串,比如String b = B.getStringDataFromDB().intern(),尽管B.getStringDataFromDB()方法拿到的字符串是在堆上分配的,但是由于后面加入了intern(),因此B.getStringDataFromDB()方法的结果,会写入常量池中
常量池中的String数据有一个特点:每次取数据的时候,如果常量池中有,直接拿常量池中的数据;如果常量池中没有,将数据写入常量池中并返回常量池中的数据。
因此回到我们之前的场景,使用StringBuilder拼接字符串每次返回一个new的对象,但是使用intern()方法则不一样:
"XXX-192.168.1.1"这个字符串尽管是使用StringBuilder的toString()方法创建的,但是由于使用了intern()方法,因此第一条线程发现常量池中没有"XXX-192.168.1.1",就往常量池中放了一个
"XXX-192.168.1.1",后面的线程发现常量池中有"XXX-192.168.1.1",就直接取常量池中的"XXX-192.168.1.1"。
因此不管多少条线程,只要取"XXX-192.168.1.1",取出的一定是同一个对象,就是常量池中的"XXX-192.168.1.1"
这一切,都是String的intern()方法的作用
阅读全文
0 0
- String地址
- 比较String地址相等
- string赋值地址问题
- String地址转bitmap
- Java String 对象内存地址
- 新建String对象分配内存地址区分
- 为什么打印String对象,不是地址值?
- 关于String地址引用的问题
- 关于String的内存地址及字符串相加
- LeetCode—String数字字符串中寻找ip地址
- [LeetCode] Restore IP from string 从字符串恢复IP地址
- 正则表达式判断并取得string里面的URL地址
- SQL Server IP地址格式转换(GUID To String)
- JAVA的String的传值和传地址问题
- java 使用String.format进行拼接URL连接地址
- 根据图片Uri获取图片的String地址
- Java中String相同字符串的地址是否想同??
- 以String类来说java变量地址和值比较
- android studio 使用zxing超简便方法
- Windows桌面右键新建未出现word/excel/ppt解决办法
- 基于Centos6.5源码编译安装mysql-5.7.17过程详解
- lua面向对象实现-类实例化对象、继承、多态、多继承、lua单例模式
- 《剑指offer》构建乘积数组
- String地址
- MySQL IO线程及相关参数调优
- 用python计算大文件夹下小文件夹里文件的个数
- 13条是左右人生的金科玉律
- mysql存储过程中 declare 和 set 定义变量的区别
- 第一周
- NYOJ 10 Skiing(记忆化搜索)
- 二叉树--实现一颗二叉树的层序遍历
- Spring bean的作用域