关于字符串常量池问题

问题描述

1,Strings="a"+"b"+"c";创建的是一个对象。这个没问题。但是:Stringstr=”kv”+”ill”+”“+”ans”;就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和””生成“kvill“存在内存中,最后又和生成了”kvillans”;并把这个字符串的地址赋给了str。这话的意思是说Stringstr=”kv”+”ill”+”“+”ans”创造了四个对象?2,final和static修饰的变量都在常量池中吗?

解决方案

解决方案二:
4个对象够么?你拼到一起的时候也是一个新对象
解决方案三:
Stringstr=”kv”+”ill”+”“+”ans”为什么我感觉和Strings="a"+"b"+"c"是一样的。编译期就会把几个字符串合并成一个。final修饰的静态字段在编译期会被放在常量池中
解决方案四:
我一直以为是和1一样是一个对象,但是我看到很多博客上写都是四个对象,很疑惑。引用1楼a574258039的回复:

4个对象够么?你拼到一起的时候也是一个新对象

解决方案五:
我想的也跟你一样,但很多文章都说Stringstr=”kv”+”ill”+”“+”ans”不是一个对象比如这个:http://zy19880423.iteye.com/blog/434179引用2楼sum_rain的回复:

Stringstr=”kv”+”ill”+”“+”ans”为什么我感觉和Strings="a"+"b"+"c"是一样的。编译期就会把几个字符串合并成一个。final修饰的静态字段在编译期会被放在常量池中

解决方案六:
Stringstr=”kv”+”ill”+”“+”ans”;这句话要拆开说昂,str在赋值过程中共创造了四个对象,但是str是一个对象,一个指向常量池“kvillans”的对象。【首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和””生成“kvill“存在内存中,最后又和生成了”kvillans】。。。咳咳,楼主这个说法就太。。。四个对象分别是kv,ill,ans和kvillans,字符串执行+操作时把String转为基本类型char来做的,一次就把三个对象拼成一个了。只要记住,常量池是编译期的事就好理解了。最后补充下,常量池是每个类都有的,当然这貌似是虚拟机要做的事了。
解决方案七:
引用5楼mymy1026的回复:

Stringstr=”kv”+”ill”+”“+”ans”;这句话要拆开说昂,str在赋值过程中共创造了四个对象,但是str是一个对象,一个指向常量池“kvillans”的对象。【首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和””生成“kvill“存在内存中,最后又和生成了”kvillans】。。。咳咳,楼主这个说法就太。。。四个对象分别是kv,ill,ans和kvillans,字符串执行+操作时把String转为基本类型char来做的,一次就把三个对象拼成一个了。只要记住,常量池是编译期的事就好理解了。最后补充下,常量池是每个类都有的,当然这貌似是虚拟机要做的事了。

原谅我读书少,没看到还一空格,空格也是一个对象呢,5个对象
解决方案八:
首先回答第一个问题,Stringstr=”kv”+”ill”+”“+”ans”;在编译器就组成了一个字符串,所以这里面在运行时只有一个string对象。关于字符串常量池和如何验证只生成一个字符串对象,可以参考这篇文章。final修饰的常量在编译时期放入类的常量池表,而常量池是类的常量池表的运行展示形式。了解运行时常量池,可以参考本文另外,关于字符串拼接的运行机制,可以查看这篇文章.

时间: 2024-11-08 18:15:39

关于字符串常量池问题的相关文章

字符串常量池、堆、栈

String a="a"+"b"+"c" 创建了几个对象 这个问题涉及到了字符串常量池和字符串拼接 String a="a"+"b"+"c" 通过编译器优化后,得到的效果是 String a="abc" Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid"; 另一种就是使用new这种标准的构造对象的方法,

只有编译时,才能使用字符串常量池吗?心中的几个疑问。

问题描述 师兄,您好.下面是几个疑问,想问一下您,谢谢您!!publicclassTest{publicstaticvoidmain(String[]args){Stringstr1="HelloJava的长度:10";Stringstr2="Hello"+"Java"+"的长度:"+"HelloJava".length();System.out.println(str1==str2);intlen=10;

java字符串-string创建对象问题字符串常量池问题

问题描述 string创建对象问题字符串常量池问题 String a=new String("aaaa")如果之前常量池没有aaaa字符串,那么这句代码具体创建的是几个对象?, 解决方案 string是比较特殊的. new String就好比开了一个空间里面装着aaa而且有了自己的地址符.也就是说是一个对象了. 而String a也是一个对象,你要记得每个类型都有默认值的,但是后面的等于号是将new String的地址符给了a,这时a也指向那个空间,于是它的值也是aaa. 其实在工作编

helloworld-关于字符串常量池的问题

问题描述 关于字符串常量池的问题 String s1="hello"; String s2="world"; String s3="helloworld"; System.out.println(s3.equals((s1+s2))); 存在几个helloworld? 如果此时将helloworld赋值给变量s5 则赋值的是哪一个helloworld 解决方案 字符串常量会存在常量池里,每定义一个字符串,都会先查看常量池,如果有,就直接使用已有的

c#-C#中字符串常量池是什么意思,谁能给详细说说?字符串常量池的意义是什么

问题描述 C#中字符串常量池是什么意思,谁能给详细说说?字符串常量池的意义是什么 C#中字符串常量池是什么意思,谁能给详细说说?字符串常量池的意义是什么 解决方案 http://www.thinksaas.cn/group/topic/69377/ 具体可以去看clr via C# 解决方案二: 可以看下这篇文章的介绍:http://www.jb51.net/article/53212.htm

Java 中的字符串常量池详解_java

Java中的字符串常量池 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式.然而这两种实现其实存在着一些性能和内存占用的差别.这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池.

Java的string类常量池及不可变性

1.String常量池     当使用new String("hello")时,JVM会先使用常量池来管理"hello"直接量,再调用String类的构造器来创建一个新的String对象,新创建的对象被保存在堆内存中.即new String("hello")一共产生了两个字符串对象. [常量池constant pool]管理在编译时被确定并保存在已编译的.class文件中的一些数据,包括关于类.方法.接口中的常量,和字符串常量.  [字符串常量池

Android开发入门(二十)内容提供者 20.3 经过预定义的查询字符串常量

除了使用自己手动写的查询URI,可以也使用Android内置的URI查询常量. 例如,除了使用 content://contacts/people,可以写这个赋值语句. Uri allContacts = ContactsContract.Contacts.CONTENT_URI;   一些Android内置的预定义查询字符串常量. Browser.BOOKMARKS_URI Browser.SEARCHS_URI CallLog.CONTENT_URI MediaSto re.Images.M

String之常量池小结

1.String 常量池 String使用private final char value[ ]实现字符串的存储,也就是说String创建对象之后不能够再次修改此对象中存储的字符串内容,因而String类型是不可变的(immutable),因而String类是线程安全的. 其中字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价.JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化.为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常