Java String:字符串常量池(转)】的更多相关文章

前言 很多朋友Java的字符串常量池的概念困扰了很长一段时间,最近研究了一下jvm指令码,终于对它有了大概的了解. 在展示案例前,我们需要先搞清楚一个概念,众所周知,jvm的内存模型由程序计数器.虚拟机栈.本地方法栈.堆.元空间(方法区).直接内存组成. 今天我们谈到的概念只和虚拟机栈.堆.元空间(方法区)有关. 先举个例子说明两种关于字符串最基本的使用情况: String s ="abc":在编译期间,会将等号右边的"abc"常量放在常量池中,在程序运行时,会将s…
最近到广州某建站互联网公司面试,当时面试官问假设有两个字符串String a="abc",String b = "abc";问输出a==b是true还是false.我当时毫不犹豫答了true,然后根据字符串常量池的知识点结合jvm的内存模型讲解,然而他却跟我说是false,说这是最基本的问题.我当时一脸懵逼,跟他讨论了很长时间,后来发现他是错的,他说a,b两个变量是存在栈中,这两个引用是不一样的,只不过它们指向的内容是一样的.因为他毕竟工作了好几年,我当时也质疑我的…
首先看一个例子,通过这个例子更能快速理解String常量池 public static void main(String[] args) { String a = "ab"; String bb = "b"; String b = "a" + bb; String c = "a" + "b"; String d = b.intern(); System.out.println(a == b); System…
这里仅仅是举个简单的样例说明字符串常量池在内存中的位置. 闲言少叙,直接上代码. <span style="font-size: large;">import java.util.ArrayList; public class Test { public static void main(String[] args) { String str = "abc"; char[] array = {'a', 'b', 'c'}; String str2 = n…
直接贴代码---> public class Test { public static void main(String[] args) { /** * 为了提升字符串的访问效率,在程序中使用了"缓存"技术 * 所以在java中用双引号括起来的字符串都会在常量池中 * 存储一次,其中字符串常量池在方法区中,在程序的执行 * 过程中,如果用到了某字符串,会先去字符串常量池中找, * 若有,则直接使用,其内存地址也相同. */ String s1 = "abc";…
目录 1. String类是什么 1.1 定义 1.2 类结构 1.3 所在的包 2. String类的底层数据结构 3. 关于 intern() 方法(重点) 3.1 作用 3.2 字符串常量池(String Pool) 4. String类所用的连接符 5. String类的主要作用(简) 正文 1. String类是什么 1.1 定义 String类表示字符串.Java程序中的所有字符串都是这个String的实例,比如"abc".字符串为常数,它们的值在创建之后不能更改.因为字符…
字符串常量池(String Pool)保存着所有字符串字面量(literal strings),这些字面量在编译时期就确定.不仅如此,还可以使用 String 的 intern() 方法在运行过程中将字符串添加到 String Pool 中. 当一个字符串调用 intern() 方法时,如果 String Pool 中已经存在一个字符串和该字符串值相等(使用 equals() 方法进行确定),那么就会返回 String Pool 中字符串的引用:否则,就会在 String Pool 中添加一个新…
作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么? 字符串常量池的设计思想是什么? 字符串常量池在哪里? 如何操作字符串常量池? 字符串常量池的设计思想 字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价,作为最基础的数据类型,大量频繁的创建字符串,极大程度地影响程序的性能 JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化 为字符串开辟一个字符串常量池,类似于缓存区 创建字符串常量时,首…
老套的笔试题 在一些老套的笔试题中,会要你判断s1==s2为false还是true,s1.equals(s2)为false还是true. String s1 = new String("xyz"); String s2 = "xyz"; System.out.println(s1 == s2); System.out.println(s1.equals(s2)); 对于这种题,你总能很快的给出标准答案:==比较的是对象地址,equals方法比较的是真正的字符数组.所…
1.字符串常量池 每创建一个字符串常量,JVM会首先检查字符串常量池,如果字符串已经在常量池中存在,那么就返回常量池中的实例引用.如果字符串不在池中,就会实例化一个字符串放到字符串池中.常量池提高了JVM性能和内存开销 2.用new 的方式创建字符串 new方式创建字符串,会先检查常量池中是否有相同值的字符串.如果有,则拷贝一份到堆中,然后返回堆中的地址.如果没有,则在堆中创建一份,然后返回堆中的地址. 3.String Table String Table存放的是string的cache ta…