String new赋值、直接赋值

String类是final的。
String str = new String("Hello"); //创建了两个对象
系统会先创建一个匿名对象"Hello"存入堆内存(我们暂且叫它A),然后new关键字会在堆内存中又开辟一块新的空间,然后把"Hello"存进去,并且把地址返回给栈内存中的str, 此时A对象成为了一个垃圾对象,因为它没有被任何栈中的变量指向,会被GC自动回收。
直接赋值,java语法就这么规定的。
因为String类太常用了,这样直接赋值,避免多次创建内容相同的String对象,节省空间,提高效率。
String s0=”kvill”;
String s1=”kvill”;
String s2=”kv” + “ill”;
System.out.println( s0==s1 );
System.out.println( s0==s2 );
结果为:
true
true
首先,我们要知道Java会确保一个字符串常量只有一个拷贝。
因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”kv”和”ill”也都是字符 串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中 ”kvill”的一个引用。

时间: 2024-11-05 13:38:42

String new赋值、直接赋值的相关文章

string 构造方法为对象赋值,equals方法比较两个字符串是否相等

package String; /* * 写了一个简单的equals 方法 * 总结:用string的构造方法来赋值,构造方法:public string (string xxx) * 比较两个字符串是否相等,用方法 public boolean equals(string str) */ public class StringDemo { public static void main(String[] args) { String www = "hello"; //直接为www 初

关于String的两种赋值方式

String的两种赋值是不同的,String str1=“hello”,指向堆内存中的"hello",而String str2=new String("hello"),因为new开辟的新的堆内存,所以二者地址不同,在用==时,显示的是false. 例一: String str1=“Hello”; String str2=“Hello”; String str3=“Hello”; 这时候三者都是指向同一堆内存地址,因为如果对象池中已经有了相同的字符串声明时,就不会再重

java中String new和直接赋值的区别

    Java中String new和直接赋值的区别     对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中.对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份. 例如: String str1="ABC": 和String str2 = new String("ABC"); String str1="ABC" 可能创建

java基础复习之对于String对象,可以使用“=”赋值,也可以使用new关键字赋值,两种方式有什么区别?

String类型是实际工作中经常用到的类型,从数据类型上划分,String是一个引用类型,是API中定义的一个类.所以String类型的对象可以用new创建,例如String name=new String("string");为变量name进行赋值,值为"string" ,然而String类比其他类有些特殊,可以使用'='直接赋值,如 String name="string";也是为变量name进行赋值,值为"string"

Java中String的两种赋值方式的区别

本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过"字面量"赋值,如:String str="hello",第二种是通过new关键字创建新对象,如:String str=new String("hello").那么这两种赋值的方式到底有什么区别呢,下面给出具体分析. 1.首先回顾Java虚拟机的结构图. 在上面的

输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限 (MD花了半天时间,思路不对害死人)

1 输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限 2 3 比如: 4 5 输入:5 18 6 7 输出: 8 9 1 2 3 4 5 10 11 16 17 18 0 6 12 13 15 0 0 0 7 14 15 14 0 0 0 8 16 17 13 12 11 10 9 18 19 20 21 输入: 4 12 22 23 输出: 24 25 1 2 3 4 26 27 12 0 0 5 28 29 11 0 0 6 30 31 10 9 8 7 32

Angular.js 中 copy 赋值与 = 赋值 区别

转自st.gg Angular.js 中 copy 赋值与 = 赋值 区别 为什么用 $scope.user = $scope.master; $scope.master 会跟着 $scope.user 改变?angular.copy 和 = 号赋值有什么区别呢?新手还没有搞懂,请教各位了. <!DOCTYPE html> <html> <script src= "http://apps.bdimg.com/libs/angular.js/1.3.9/angular

在java中,将String类型字符串s赋值为null后,将字符串与其他字符串拼接后得到结果出现了null字符串与其他字符连接的样式

String s = null; s  += "hello"; System.out.println(s); 结果为:nullhello 原因: 先应用String.valueOf 得出s的value值,再通过StringBuilder拼接hello,因此将value与hello进行了拼接: String s = null; s = (new StringBuilder(String.valueOf(s))).append("hello").toString();

String使用字面值常量赋值与new String()赋值的区别

我们都知道比较字符串的内容需要使用String.equals(String) 方法 直接使用 == 来比较2个字符串,比较的是这两个字符串的内存地址. 最近看到一个java的小细节如下: public static void main(String[] args) { String a="aaa"; String b=new String("aaa"); String c="aaa"; System.out.println(a==b); //输出

string 构造函数,=,整数 赋值给 string 引起的 坑

对string 理解构造和赋值理解不清引起的错误. 起因: string a; int i=1; a=i;//不报错,不警告 int c=330;//大于256 a=c;//不警告,不报错 a=330;//warning: overflow in implicit constant conversion string str=3;// error: invalid conversion from 'int' to 'const char*' string str(3);// error: inv