-
string 的疑惑5
String str="abc"和String str=new String("abc");这两种方法声明一个String类型对象有区别吗?区别在哪里?
问题补充:斐斐宝贝 写道Java运行环境有一个字符串池,由String类维护。执行语句String str="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给str,如果不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给str。执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给str。前一语句的效率高,后一语句的效率低,因为新建字符串占用内存空间。String str=newString()创建了一个空字符串,与String str=new String("")相同。
那么请问,这个字符串池是在堆内存还是在栈内存呢?
问题补充:地狱牢笼 写道字符串池不在堆内存也不在栈内存
那在哪里?应该也是一个内存块吧?
问题补充:longxiaoyan 写道java虚拟机的运行时数据区有如下几个:方法区、堆、Java栈、PC寄存器、本地方法栈,其中方法区中存储了类信息、常量池(final常量、字符串)、静态变量等。运行时创建的所有类实例或数组都放在堆中。下面来说说你的问题:
String str="abc";//在方法区中的常量池里存储了"abc"
String str=new String("abc");//在方法区中的常量池里存储了"abc",并在栈中了存储了一个String类实例,这个类实例有一个指针指向方法区的"abc".
另外说明一点:方法区中的常量只会有一份,即String str="abc";String str=new String("abc");这两个代码一起执行也只会在方法区中存储一份"abc",在堆中存储一个String类实例,及大众面试题经常提问的创建了几个对象:2个.
想继续深入了解可以看看这个帖子(需要一定的虚拟机基础):
http://www.iteye.com/topic/774673
恩,回答的很详细了。谢谢!2011年12月29日 10:55
7个答案 按时间排序 按投票排序
-
采纳的答案
java虚拟机的运行时数据区有如下几个:方法区、堆、Java栈、PC寄存器、本地方法栈,其中方法区中存储了类信息、常量池(final常量、字符串)、静态变量等。运行时创建的所有类实例或数组都放在堆中。下面来说说你的问题:
String str="abc";//在方法区中的常量池里存储了"abc"
String str=new String("abc");//在方法区中的常量池里存储了"abc",并在栈中了存储了一个String类实例,这个类实例有一个指针指向方法区的"abc".
另外说明一点:方法区中的常量只会有一份,即String str="abc";String str=new String("abc");这两个代码一起执行也只会在方法区中存储一份"abc",在堆中存储一个String类实例,及大众面试题经常提问的创建了几个对象:2个.
想继续深入了解可以看看这个帖子(需要一定的虚拟机基础):
http://www.iteye.com/topic/7746732011年12月29日 15:30
-
这个回答的很清楚了
<a href="http://zhidao.baidu.com/question/81333323.html">http://zhidao.baidu.com/question/81333323.html</a>2011年12月29日 16:50
-
String str="abc"
是声明一个str的变量,并直接给str赋值;在内存中的变化时,在堆内存(str)和栈内存(abc)都开辟一个空间。
String str=new String("abc");
声明了一个str的变量,它的内存运行顺序:
1.String str = new String("");
2.将字符串缓存池中的已经存在的str对应的值abc,给str这个对象。2011年12月29日 15:02
-
Java运行环境有一个字符串池,由String类维护。执行语句String str="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给str,如果不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给str。执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给str。前一语句的效率高,后一语句的效率低,因为新建字符串占用内存空间。String str=newString()创建了一个空字符串,与String str=new String("")相同。
2011年12月29日 11:22
相关推荐
那么有人在进行字符串拼接的时候,就会产生疑惑:“我到底是用+号还是StringBuilder?”我们先来看这样一段代码: String chenmo = "沉默"; String wanger = "王二"; System.out.println(chenmo + wanger); 这段...
在JAVA学习过程中,初学者总是会遇到一些很疑惑的问题,往往是知其然不知其所以然。下面针对这些基础的问题进行一个详细的解答,以便后来者少走弯路,知其然知其所以然。 问题一:String 声明和引用 JAVA 语言中,...
java面试的疑惑剪辑 博文链接:https://z-jq1015.iteye.com/blog/248599
什么是不可变对象? 众所周知, 在Java中, String类是不可变的。... 对于Java初学者, 对于String是不可变对象总是存有疑惑。看下面代码: String s = ABCabc; System.out.println(s = + s); s = 1
什么是不可变对象? 众所周知, 在Java中, String类是不可变的... 对于Java初学者, 对于String是不可变对象总是存有疑惑。看下面代码: String s = "ABCabc"; System.out.println("s = " + s); s = "1
public static void main(String[] args) { int total = 200; // 2 dollars in cents int cost = 110; // 1.10 dollars in cents int change = total - cost; System.out.println(change); // prints 90 } } `...
当我们处理基本类型的值,尤其是String类型时,可能疑惑为何它们能像引用类型那样拥有方法。例如,我们可以在一个字符串上调用`substring()`方法。原因在于JavaScript引入了三种特殊引用类型:String、Number和...
5. **字符串操作**:Java中的String是不可变的,这可能导致性能问题。了解StringBuilder和StringBuffer的使用场景,以及如何高效地操作字符串,是必备技能。 6. **集合框架**:List、Set和Map接口以及它们的实现类...
这可能让人疑惑,因为通常只有对象才能拥有方法。在JavaScript中,这种特性是由隐式转换机制实现的。 当我们尝试在基本类型的字符串上调用方法时,JavaScript引擎会自动将这个基本类型的值转换为一个特定的包装对象...
public static void main(String[] args) { System.out.println(2.00 - 1.10); } } ``` 这段代码旨在模拟一个简单的找零过程,其中客户用2美元支付1.10美元的商品,理论上应该找回0.90美元。但实际上,这段代码...
$string='April15,2003'; $pattern='/(\\w+)(\\d+),(\\d+)/i'; $replacement='${1},${3}'; echo preg_replace($pattern,$replacement,$string); ?> 这个表达式的结果为April1,2003 原因:(\w+)能够完整匹配...
- `string`返回"string" - `Symbol`(ES2015新增)返回"symbol" 然而,对于复杂类型,`typeof`的行为有些特殊: - 对于使用构造函数创建的对象,如`new String('abc')`和`new Number(12)`,`typeof`返回"object" - ...
对于初学者而言,在学习Java的过程中可能会遇到各种疑惑和挑战,本文旨在帮助初学者理解并掌握Java编程中的几个关键概念,以便更加高效地学习和发展。 #### 1. 字符串与字符串对象的理解 字符串在Java中是一种特殊...
本文将重点讨论Java中的堆栈分配、import语句、构造方法以及它们在初学者中常见的疑惑。 ### 1. 堆栈分配 在Java中,局部变量(在方法内部声明的变量)存储在堆栈中,而对象引用和实例变量存储在堆内存中。堆栈内存...
C++语法详解》对C++的语法进行了全面介绍和深入...《C++语法详解》层次分明,由浅入深,各章节相对独立,语法示例短小精悍,方便对有疑惑的语法进行速查。学习完《C++语法详解》,读者不会再对C++的各种语法感到困惑。
本文将探讨Thread线程的基础知识及其常见的疑惑点。 首先,我们需要了解线程的状态。Java定义了五种线程状态: 1. 创建(new):线程刚刚被实例化,尚未启动。 2. 运行(Runnable):线程已启动,可能在就绪...
在Java编程语言中,存在一些不为初学者...了解这些隐藏的方法可以帮助我们更好地理解Java的运行机制,并在遇到反射相关的疑惑时提供解答。在面试或实际开发中,掌握这些不常见的知识点可以体现对Java更深层次的理解。
在隐式转换中,我们可能最大的疑惑是:何时发生隐式转换?我们这里可以归纳为两种情况发生隐式转换的场景: • 比较运算(==、!=、>、<)、if、while需要布尔值地方 • 算术运算(+、-、*、/、%)除了上面的场景,...