㈠ 求教 java 字符串缓冲区和常量池有什么关联、关系
java里的堆栈,常量池,用图形来表示的话会好理解下,不过不会上传图片,就简单的用文字描述下,希望能帮助你理解.
首先,java里new出来的对象都会存放在堆里.栈里可以存放对这些对象的指针的引用.
例如: A a=new A();
这里new出来的A对象会被存放在堆中,而 a呢.会被存放到栈里,并且保存了对A这个对象引用的地址.
栈的存放顺序是后进先出,如果你接触过数据结构的课程的话,这个并不难理解.
至于字符串池,是用来存放一些字符和栈和堆的关系,我们只需要这么理解,当我们创建一个字符串时,java会先在字符串池里寻找有没有你要创建的字符串.
例如: String a="你好";
先寻找字符串池里有没有 "你好" 这个字符串,如果存在,就不会在堆中再创建.
如果不存在,就会在堆中创建 "你好" 这个字符串 并在栈中生成 a保存对其的地址引用 然后还会将新创建的字符串"你好" 保存到字符串池中.
㈡ Java String常量池在什么位置
常量池只有一个。
string a = "abc"//现在常量池里找abc,有的话就把a指向它,没有的话就新建 这是在编译期间做的
string b = new string("abc");//直接新建一个abc,并把地址给b,这是在运行期间做的
a == b //判断a和b的地址是否相等,明显不相等。
a.equals(b)//判断a和b指向的字符串常量是否相等,都是"abc",所以是true
㈢ Java中,这些字符串什么时候进入常量池的
Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式。然而这两种实现其实存在着一些性能和内存占用的差别。这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池。
㈣ java中的字符串到底是在方法区的常量池里还是new出来的对象里
String str ="nihao";
当这段代码编译的时候,首先它会去堆里的方法区常量池里去查找,如果有一个同样的字符串“nihao”,存在,那么它会把当前声明的对象的地址指向那个字符串对象,调用的是String.itern()方法。如果没有的话,它会开启堆内存,分割一块新的地址指向str对象。
String是不可变的(final的),不必担心稳定性问题。
而当你新new一个String数组的时候,当你给String数组赋值的时候,它同样遵循这个原理。
这样做的好处:字符串多重利用,防止产生冗余。
详情参考jdk中String类的的itern方法:
public String intern()
返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当
s.equals(t) 为 true 时,s.intern()==t.intern() 才为 true。
所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。
㈤ Java中的字符串常量池与Java中的堆和栈的区别
java常量池不在堆中也不在栈中,是独立的内存空间管理。
1. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
2. 堆:存放所有new出来的对象。
3. 常量池:存放字符串常量和基本类型常量(public static final)。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
㈥ 我想问一下Java通过new String创建字符串会被保存都常量池中吗
厚颜无耻的复制下
方式一:String a = “aaa” ;
方式二:String b = new String(“aaa”);
两种方式都能创建字符串对象,但方式一要比方式二更优。
因为字符串是保存在常量池中的,而通过new创建的对象会存放在堆内存中。
常量池中已经有字符串常量”aaa”
通过方式一创建对象,程序运行时会在常量池中查找”aaa”字符串,将找到的”aaa”字符串的地址赋给a。
通过方式二创建对象,无论常量池中有没有”aaa”字符串,程序都会在堆内存中开辟一片新空间存放新对象。
常量池中没有字符串常量”aaa”
通过方式一创建对象,程序运行时会将”aaa”字符串放进常量池,再将其地址赋给a。
通过方式二创建对象,程序会在堆内存中开辟一片新空间存放新对象,同时会将”aaa”字符串放入常量池,相当于创建了两个对象。
㈦ Java常量池是什么有什么用 和堆、栈有关系求简单易懂的解释!
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间
这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
㈧ Java中的几种常量池
字符串常量池:当类加载完成,在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中。
class文件常量池:用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。
运行时常量池:当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中。
㈨ java字符串常量池问题
程序运行时的任何数据都存放在程序内存中,程序结束后程序内存被回收,其中的任何数据都不再存在。
㈩ java8字符串常量池在哪
首先你要知道jvm常量池也是对象池,它和在堆中的存储没有区别(底层存储都是一样的,只是对象之间的引用有差别)。那为什么要有常量池呢?因为它可以节省时间和空间,当需要一个对象的时候,可以直接从常量池中获取,而不需要重新创建,这样也就节省了时间和空间(常量池判断对象是否存在应该是equals方法)。
除了String外,Java的8种基本类型(Byte, Short, Integer, Long, Character, Boolean, Float, Double)除Float和Double以外,其它六种都实现了常量池。
楼主这么好学,我出个题目给楼主:
Integer i = 127;
Integer j = 127;
System.out.println(i == j);
提示:对象存在常量池
Integer m = 128;
Integer n = 128;
System.out.println(m == n);
提示:对象存在堆内存