java中字符串常量放在哪里

两个必须存放在堆中 str指向堆中的Hello对象 也就是说 两个对象和str的地址全部存放在堆中 String str="abc"; * 引用数据类型肯定存放在堆中 栈中放置的是参数变量而不能放对象 对象只能放在堆中 它只创建一个对象 在堆中创建一个对String类的对象引用变量str(引用变量肯定是存放在堆里的)...
java中字符串常量放在哪里
回答的人好多,建议找本书看看,误人子弟的多 - -!
自己试验一下的好。
注意两个问题 一个是String的equals方式是被重写过的。默认情况下 equals 就是==
第二只要是new操作必然产生新对象,以及对象对内存地址的引用。
因此str1==str2 为false 但是equals却是true
而str1 和 2 是两个内存地址,指向的内存对象也是2个
String str1 = "Hello";此方式jvm会在new String的时候进行一个判断,如果已经存在那么会直接指向那个地址。因此字符串的操作要比stringbuffer操作字符串慢很多2013-05-08
/* * 看程序写结果 * 字符串如果是变量相加,先开空间,在拼接。 * 字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。 */public class StringDemo4 {public static void main(String[] args) {String s1 = "hello";String s2 = "world";String s3 = "helloworld";System.out.println(s3 == s1 + s2);// falseSystem.out.println(s3.equals((s1 + s2)));// trueSystem.out.println(s3 == "hello" + "world");// false 这个我们错了,应该是trueSystem.out.println(s3.equals("hello" + "world"));// true// 通过反编译看源码,我们知道这里已经做好了处理。// System.out.println(s3 == "helloworld");// System.out.println(s3.equals("helloworld"));}}2015-12-07
str1和str2分别
创建两个对象 Hello对象和str引用对象
两个必须存放在堆中
str指向堆中的Hello对象
也就是说 两个对象和str的地址全部存放在堆中

String str="abc"; * 引用数据类型肯定存放在堆中 栈中放置的是参数变量而不能放对象 对象只能放在堆中

它只创建一个对象 在堆中创建一个对String类的对象引用变量str(引用变量肯定是存放在堆里的),然后查找栈中是否有"abc",若没有则将"abc"存放进栈,并令str指向"abc",若已经存在则直接令str指向"abc".(也就是说引用变量本身只能存放在堆中 它的值是所指向的字符串abc 它的地址存放在栈中) 它创建多个"abc"字符串在内存中其实只存在一个对象而已,这样有利于节省内存空间同时在一定程度上提高程序运行速度

String str=new String("abc");* 所以通过new操作符的操作都是在堆完成的

它创建两个对象 abc对象和str引用对象 两个必须存放在堆中 str指向堆中的abc对象 也就是说 两个对象和str的地址全部存放在堆中 因为使用了new操作符 所以下面的例子里str2,str3和str4即使是值都为abc因为str2的地址在栈中 str3和str4的地址各自开辟空间 所以他们的地址肯定不一样了
但是它们的值是一样的 那就是abc

String str2 = "abc";
String str3=new String ("abc");
String str4 =new String ("abc");

equals:equals就是比较值 ==在基本类型里也是比较值 在引用类型里是比较地址 注意这个区别就OK了!

表示堆中的引用变量的值是否相同(引用类型变量比较的是他们本身的值,本身的值是通过引用变量地址指向的对象或字符串来得到的,不管这个被指向的字符串或者对象是在栈中还是堆中)
==:表示堆中或者栈中的基本类型的值或者引用变量的地址是否相同(基本类型比较的是他们本身的值,引用类型变量比较的是地址)

当equals为true时,==不一定为true;2013-05-08
这个是在内存中存放的地址,你必须str1.equals(str2)才可以判断的。
你可以输出地址看看,你这样比较的是两个地址,当然是false了。
第一个直接缓存 数据共享Hello,是true。2013-05-08
第一种方式首先在栈中创建一个变量 str1,str2,然后通过引用去字符串常量池中查找是否有"hello"字符串,如果没有则将"hello "字符串存入字符串常量池,并使 str1和str2 指向此常量。如果有此字符串则直接指向。
第二种方式是用new来新建对象,存放在堆中,每次调用都会新建一个对象。不会指向同一个引用对象。2013-05-08
但是堆区对象中也有一个引用,那么着两个对象里的引用指向的是同一个并且存放在数据区中的那个Hello么?
=============
不是同一个,指向的堆栈不一样

还是每一个对象各自引用一个Hello,如果是这样那么这个Hello又放在哪里?
=============
在内存里新开了一块地方存这个Hello2013-05-08
不是同一个,数据就在堆里面啊,每一个对象都在堆里有一个Hello2013-05-08
mengvlog 阅读 546 次 更新于 2025-09-10 16:54:29 我来答关注问题0
  •  阿暄生活 字符串常量池存的是实例还是引用? 字符串常量池在堆中还是 *** 区

    字符串常量池存的是引用,字符串常量池在Java中通常位于堆中。以下是详细解释:一、字符串常量池存的是引用 在Java中,字符串常量池用于存储字符串字面量。当我们使用双引号定义一个字符串时,如String str = "hello";,这个字符串字面量"hello"会被存储在字符串常量池中。字...

  •  誉祥祥知识 Java中的字符串常量池与Java中的堆和栈的区别

    Java的常量池是一个独立的内存空间,它既不在堆中也不在栈中。栈主要用于存放基本类型变量和对象引用,但对象本身并不存储在栈中,而是存放在堆中(通过new创建的对象)或者常量池中(字符串常量对象则存放在常量池中)。堆内存则是用来存放所有通过new关键字创建的对象。常量池则专门用来存储字符串常量...

  •  文暄生活科普 一文弄懂String常量池,String常见面试题,以及intern()方法

    首先,了解 String 类。它是 Java 中的一个不可改变的类,用于表示字符串。在 Java 中,字符串常量池是存储字符串字面量的地方。在 JDK 1.6 中,常量池位于永久代中;而从 JDK 1.7 开始,它被移动到了堆内存中。在 JDK 1.8 中,永久代被移除,常量池继续存在于堆中。接下来,我们来解答...

  •  阿暄生活 字符串 常量池 字符串常量池存的是实例还是引用

    在Java 6及之前的版本中,字符串常量池位于方法区的永久代中。从Java 7开始,字符串常量池被移动到了堆内存中,但仍然作为方法区的一部分进行管理(即元空间中的一部分)。这一变化主要是为了更好地管理内存和减少垃圾回收的压力。5. 示例说明:String s1 = "hello";:在字符串常量池中...

  •  文暄生活科普 007-String a="i"与 String a=new String("i")一样吗

    3 new String创建的对象是保存在堆里面的:除了new String,Java中的new操作都会构造一个对象,并且这些对象都是保存在堆内存中的。演示面试:第一种方式a="i",只创建了一个字符串对象并保存在字符串常量池中。第二种方式a=new String("i"),先在字符串常量池中创建了一个字符串对象,然后在堆...

檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部