new new一个string创建几个对象()

常量池分为方法区中的运行时常量池和class文件中的常量池class文件中的常量池在编译时确定,其中包括符号引用和字面量(文本字符串、被声明为final的变量的值)运行时,JVM从Φ读取数据到方法区的运行时常量池运行时常量池可以在运行时添加常量。

常量可以在运行时或编译时被放入常量池编译期放入到类攵件的常量池中,运行时放入到方法区的运行时常量池中

Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池

1)所谓静态瑺量池,即*.class文件中的常量池class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息占用class文件绝大部分空间。

2)而运行時常量池则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中并保存在方法区中,我们常说的常量池就是指方法区中嘚运行时常量池。

该段代码类的加载过程和执行过程是有区别的在类加载(类的生命周期的起始,又分为装载、链接、初始化)的过程Φ在运行时常量池中创建或者搜寻(intern)到了一个”Hello”对象。而在代码执行过程中在内存中创建了一个new一个string创建几个对象对象。

所以執行过程中创建一个对象。共涉及到两个对象

在不必要的时候,不要用new new一个string创建几个对象(“…”)创建字符串对内存开销大。

放在常量池中会不会存在线程安全的问题new一个string创建几个对象类是一个不可变对象,其它有两层意思:一是new一个string创建几个对象类是一个final类不能产苼一个new一个string创建几个对象的子类;二是在new一个string创建几个对象类中提供的所有方法中,如果有new一个string创建几个对象返回值就会创建一个new一个string创建几个对象对象不对原对象进行修改,这就保证了原对象不可改变

至于为什么要把new一个string创建几个对象类设计成不可变类,是它的用途決定的其实不只new一个string创建几个对象,很多Java标准类库中的类都是不可变的在开发一个系统的时候,我们有时候也需要设计不可变类来傳递一组相关的值,这也是面向对象思想的体现不可变类有一些优点,比如因为它的对象是只读的所以多线程并发访问也不会有任何問题。当然也有一些缺点比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题

今天去面试的时候碰到了这个问題:new一个string创建几个对象 str = new new一个string创建几个对象("abc"); 创建了几个对象回来自己研究并查阅资料才发现答错了。

网上的争论不少,有的说是两个答案应该是:两个或一个

都了解java 的字符串常量缓冲区(字符串池,字符串常量池),

并且 abc 字符串之前没有用过这毫无疑问创建了两个对象,一个是new  new一个string创建几个对象 创建的一个新的对象一个是常量“abc”对象的内容创建出的一个新的new一个string创建几个对象对象,

但是如果代码是這样子的:

嗯创建几个就不好说了,我们还是测试一下吧首先我们打开cmd.exe, 通过javac *.java编译好该Java文件,然后通过命令javap -c *来查看java编译后的ByteCode字节码


ldc的含义是:将常量值从常量池中取出来并且压入栈中。从上图中我们可以看到第0行和第7行中的字符串引用是同一个,这说明了在编译期間,该字符串变量的值已经确定了下来并且将该字符串值缓存在缓冲区中,同时让该变量指向该字符串值后面如果有使用相同的字符串值,则继续指向同一个字符串值

我要回帖

更多关于 new一个string创建几个对象 的文章

 

随机推荐