A. 字符串的常量池和字符串池是一样的吗
不是一个东西,常量池必须是字符串初始化的,字符串是对象,在方法区存储,在heap上开空间存储
B. 字符串常量池在堆中还是方法区
JDK1.6及以前,常量池在方法区,这时的方法区也叫做永久代;
JDK1.7的时候,方法区合并到了堆内存中,这时的常量池也可以说是在堆内存中;
JDK1.8及以后,方法区又从堆内存中剥离出来了,但实现方式与之前的永久代不同,这时的方法区被叫做元空间,常量池就存储在元空间。
C. java中的字符串常量池与Java中的堆和栈的区别
java常量池不在堆中也不在栈中,是独立的内存空间管理。
1. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
2. 堆:存放所有new出来的对象。
3. 常量池:存放字符串常量和基本类型常量(public static final)。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
D. 求教 java 字符串缓冲区和常量池有什么关联、关系
java里的堆栈,常量池,用图形来表示的话会好理解下,不过不会上传图片,就简单的用文字描述下,希望能帮助你理解.
首先,java里new出来的对象都会存放在堆里.栈里可以存放对这些对象的指针的引用.
例如: A a=new A();
这里new出来的A对象会被存放在堆中,而 a呢.会被存放到栈里,并且保存了对A这个对象引用的地址.
栈的存放顺序是后进先出,如果你接触过数据结构的课程的话,这个并不难理解.
至于字符串池,是用来存放一些字符和栈和堆的关系,我们只需要这么理解,当我们创建一个字符串时,java会先在字符串池里寻找有没有你要创建的字符串.
例如: String a="你好";
先寻找字符串池里有没有 "你好" 这个字符串,如果存在,就不会在堆中再创建.
如果不存在,就会在堆中创建 "你好" 这个字符串 并在栈中生成 a保存对其的地址引用 然后还会将新创建的字符串"你好" 保存到字符串池中.
E. 反编译和反汇编有什么区别
反汇编是把机器码翻译成的汇编;
反编译是把机器码翻译成高级语言的过程,但通常要有其他线索辅助才能完成。
F. 什么叫做字符串常量池
可以理解为内存里面专门为string类型变量开辟的一片区域
譬如String a = "abc"; 当你定义这样一个变量的时候,java此时先会去常量池寻找有没有"abc"这样的字符串,如果有,直接把内存地址交给a, 否则就生成一个"abc"的字符串
当下一个String b = "abc";的时候,发现常量池已经有"abc"了,此时JVM不会再次生成"abc",而是直接交给"abc"引用给b, 所以此时你会发现a == b
G. java 字节码的常量池与虚拟机中的常量池有什么区别
前者是编译器的概念,后者是运行时对应的内存区域
H. 什么是字符串数组,什么是字符串常量池
你看看String源码就明白了,是对象!
s="123";
写这句话的时候,会在常量池先找有没有123这个字符串对象如果没有,他就开始抽取,1,2,3
然后拼接成一个对象即:"123";
假如后面又来一个也需要这个对象,比如说s1="123";
这个时候在操作s1的时候还是先去常量池找有没有这个对象,如果有,直接把地址拿过来,因为常量池数据为共享的,
假如这个时候s1="1234";那么常量池是没有的,就会重新抽取,1,2,3,4,然后重新拼接成一个新的对象放在常量池!
String源码里面有一个私有变量一个字符类型的数组,他就是用来抽取这些单个字符,然后拼接成
一个字符串对象!
I. 字符串常量池到底存放的是字符串引用还是字符串对象
引用,相同内容的字符串,会返回同一个引用
J. java中字符串的问题,两个字符串常量池里的字符串拼接在一起为什么结果和我想的不一样
首先比较的是 引用地址 而不是里面的值。如果想比值就用equals。
字符串常量:由相同序列的字符组成的两个字符串属于同一对象,位于内存中的同一个位置。
所以在编译期间a 是字符串常量"helloworld"的地址。
因为String c="hello"+"world";在编译期间也能直接执行,故也是指向字符串常量"helloworld"的地址。
而b是在运行期间创建,这两条语句所创建的"helloworld"字符串作为String对象存储在内存中的一个独立位置。
所以才有这个现象