String str="Hello" 与 String str=new String(“Hello”)一样吗?

简介: String str="Hello" 与 String str=new String(“Hello”)一样吗?



为什么会输出上边的结果呢,String x = "Hello" 的方式,Java 虚拟机会将其分配到常量池中,而常量池中没有重复的元素,比如当执行“Hello”时,java虚拟机会先在常量池中检索是否已经有“Hello”,如果有那么就将“代理”的地址赋给变量,如果没有就创建一个,然后在赋给变量;而 String z = new String(“Hello”) 则会被分到堆内存中,即使内容一样还是会创建新的对象。



上面程序中的"==“是判断两个对象引用的地址是否相同,也就是判断是否为同一个对象,a1与a2 返回为true,a1与a3返回则是false。说明a1与a2引用的同一个对象的地址,a3则与其它两个引用不是同一个对象地址。

Java为了避免产生大量的String对象,设计了一个字符串常量池。工作原理是这样的,创建一个字符串时,JVM首先为检查字符串常量池中是否有值相等的字符串,如果有,则不再创建,直接返回该字符串的引用地址,若没有,则创建,然后放到字符串常量池中,并返回新创建的字符串的引用地址。所以上面a1与a2引用地址相同。

那为什么a3与a1、a2引用的不是同一个字符串地址呢? String a3=new String(“代理Hello); JVM首先是在字符串常量池中找"Hello” 字符串,如果没有创建字符串常量,然后放到常量池中,若已存在,则不需要创建;当遇到 new 时,还会在内存(不是字符串常量池中,而是在堆里面)上创建一个新的String对象,存储"Hello",并将内存上的String对象引用地址返回,所以a3与a1、a2引用的不是同一个字符串地址。内存结构图如下:


相关文章
|
20天前
|
存储
数据存储之数组的特点,长度固定,适应变化需求,集合类特点是空间可变,ArrayList泛型,ArrayList<String> array = new ArrayList<String>()
数据存储之数组的特点,长度固定,适应变化需求,集合类特点是空间可变,ArrayList泛型,ArrayList<String> array = new ArrayList<String>()
String对象的特点,new创建的字符串对象地址值不同,String s3 = “abc“; s4=“abc“ sout(s1 == s2)比较地址和内容,s1.equals(s3)比较内容
String对象的特点,new创建的字符串对象地址值不同,String s3 = “abc“; s4=“abc“ sout(s1 == s2)比较地址和内容,s1.equals(s3)比较内容
new String()定义字符串为空,char[] chs = {‘a‘,‘b‘,‘c‘} String s2 = new String(chs) 输出abc,byte定99为a
new String()定义字符串为空,char[] chs = {‘a‘,‘b‘,‘c‘} String s2 = new String(chs) 输出abc,byte定99为a
|
10月前
|
Java 程序员 编译器
new String(“hello“)之后,到底创建了几个对象?
最近,有很多优秀的程序员从大厂毕业, 再加上大环境的影响,很多正在找工作的小伙伴也感觉技术面试越来越难,基本上都会问技术底层原理,甚至有些还会问到操作系统层面的知识。 如果技术功底不扎实,确实很难找到合适的岗位。
90 0
|
9月前
|
Java
每天一道面试题之String str=“i“与 String str=new String(“i”)一样吗?
每天一道面试题之String str=“i“与 String str=new String(“i”)一样吗?
String zy1=new String("小朱"); String zy2=new String("小朱");建了几个对象?
String zy1=new String("小朱"); String zy2=new String("小朱");建了几个对象?
String s = new String("java"); 只创建了一个对象!好好看好好学,要了解原理!
String s = new String("java"); 只创建了一个对象!好好看好好学,要了解原理!
String s = new String("java"); 只创建了一个对象!好好看好好学,要了解原理!
Java 最常见的面试题:String str="i"与 String str=new String("i")一样吗?
Java 最常见的面试题:String str="i"与 String str=new String("i")一样吗?
「JDK」解析 String str=““与 new String()
一、基础概念 为了讲清楚他们的差异,这里先介绍几个概念。 1.1 常量池 所谓常量池:顾名思义就是用来存放一些常量的。该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。
|
1月前
|
Java UED
Java中String强转int:一种常见的错误和解决方法
在Java中将非数字字符串转换为整数会导致`NumberFormatException`。要解决这个问题,可以使用`try-catch`捕获异常,正则表达式验证数字格式,或利用异常信息提供错误提示。例如,`Integer.parseInt()`会因遇到非数字字符如`"123abc"`而抛出异常,但通过异常处理或正则`\\d+`可确保安全转换。记得在编程时避免直接强转,以防止程序异常中断。