A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kun1990 中级黑马   /  2013-12-9 23:02  /  1250 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请问一下String直接定义一个字符串变量与new String()一个字符串有什么不同?

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

5 个回复

倒序浏览
首先,String s1 = "abc"; 这里只创建了一个对象,就是那个字符串对象。而String s2 = new String("abc"),这里是创建了两个对象,一个是new String ,一个是字符串对象。
回复 使用道具 举报
String a1 = "asd";
直接定义一个字符串,只有一个对象asd。
另外当字符串一旦初始化就不可以改变(由于a1是类类型变量,a1 = "abc";改变的是a1指向,asd地址值并没有变化)
String a2 = new String("asd");
这样定义的话会有2个对象,一个是new ,一个是"asd"
毕老师的视频讲的很详细,建议好好看下视频。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
楼主看这里:
String str = new String("abc");和String str = "abc";的区别,分析如下:
     我们可以把String x = new String("abc")这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String("aas")了。那么,new String("aas")之所以创建了两个对象,是因为调用了String的构造器:public String(String original){.....}.正是使用new调用了String类的构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abc"。
     再来看String a="abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。
希望能帮到你哦~

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
给你简单的举个例子吧!
String str="纷飞尽";这样代表内存当中有一个字符串赋值为“纷飞尽”
String str=new String("纷飞尽");这样代表内存有俩个对象分别为str和"纷飞尽"
老毕在讲String的时候专门说过
回复 使用道具 举报
1,String s = “abc”;这样的形式是直接给S赋值。此时这个表达式只生成一个对象s
2,但是String s = new String("abc");这样的话,会在栈内存中生成一个对象s,它指向堆内存的对象“abc”

从而这样写会生成两个对象:一个是s ,一个是 abc。这样的表达式虽然不会对程序造成影响,但是为了高效起见,一般的都是直接写成String s = "abc"

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马