String str = new String (“Practical ”) ; str += “Java” ; 共产生几个对象?为什么?

作者&投稿:洪纯 (若有异议请与网页底部的电邮联系)
怎么解释String[] strs =new String{"java","java","java","java","java"};产生了1个String实例~

str是对象 你值new一次当然是一个对象str拉

采纳哦

4 个,在java中碰到双引号就会创建对象(双引号里内容不同的话),所以abc 、def分别都会创建对象,同时java的字符串是只读的,所以abc+def后又会生成一个新的对象(原来的对象还在内存里),在使用new操作符时又会自动创建新对象,所以共计4个。

  1. String str = new String (“Practical ”) ;第一个对象str,str其实是一个引用(通俗的说就是保存地址值),它引用了(也就是他保存的地址值指向了)一个底层的保存了"Practical"的char数组对象,这里就有人认为有两个对象,也有一定根据但一般认为是一个对象;

  2. 同理"java"这个字符串在底层保存的方式也是一个char数组对象,第二个对象,只是这个对象对外不可见,所以有的人回答总共是四个对象也有一定根据,如果认为这个不是对象就会少一个;

str+="Java";在底层实现的过程是如下的: 

3.//第一步,把str里的"Practical"封装为一个StringBuilder 对象,第三个对象;

StringBuilder a=new StringBuilder(str);

4.//第二步,StringBuilde类里面的apend()方法实现字符串拼接得到一个新的对象,第四个对象

//把这个对象保存到b,此时得到的b里是“PracticalJava”,但b本质是一个StringBuilde类型对象,还需要下一步类型转换;

StringBuilder b=a.apend("Java");

5.//第三步,把StringBuilde类型的对象b,转为一个新的String类型的对象第五个对象

str=b.toString();

//每一个方法创建一个对象就是三个对象;共计五个对象.

//以上三行代码可以简化为以下代码;

str=new StringBuilder(str).apend("Java").toString();

注意:等号右边才是对象本体,等号左边专业应该称为引用,也就是俗称的保存对象地址值的变量,不要混淆了,这是公司总监的原话,大佬应该站的高度比较高,看着理解吧!

因为String类不可变的属性,所以必须通过这种方式将String对象和字符常量进行连接.优点是代码简单易懂,缺点是浪费时间和空间,一般在开发中不建议使用,多用StringBuilder或者StringBuffer进行字符串连接操作.

最后分享一个内存调用图,把"Practical"换成"a","Java"换成"b",就好理解很多了.



5个
赋值是用等号运算符(=)进行的。它的意思是“取得右边的值,把它复制到左边”。所以
String str = new String (“Practical ”) ;产生两个对象,毫无疑问。
string是只读类,参见 TIJ 12.4 只读类。所以str += “Java”的右边是两个对象:"java"和str+"java"。最后把这个对象赋给一个新对象str。
这个只读类可能不好理解。楼主自己google一下吧。

应该是4个对象。
String的值是不能修改的,每次改变的时候其实都是创建了一个新对象,然后指针指向新创建的对象。
上面的代码中,“Practical ”,new String (“Practical ”) ,“Java”和最后新生成的”Practical Java“每一个都是一个单独的对象。

31、String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为 String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即 StringBuffer。

String str; 一个对象
str = new String("Practical") // 2个对象,一个String对象,还有一个String父类,Object,
str += "Java"; // 一个对象,
一共是4个。


乌拉特中旗13639598255: java中String new和直接赋值的区别 -
承凡银杏: java中String new和直接赋值的区别如下: 1、执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc".注意:新建的字符串"abc"不是在字符串池中),然后将其付给str.2、执行...

乌拉特中旗13639598255: String str1=new String"abc";什么意思啊? -
承凡银杏: Java因是 String str1=new String("abc"); 两个对象,"abc" 是一个, 是常量字符串池中的对象,new了以后,又一个String类的普通对象,在...

乌拉特中旗13639598255: string str1 = "abc","abc"分配在内存哪个区域 -
承凡银杏: Stringstr=newString("abc");Stringstr="abc";是用两种形式来创建,第一种是用new()来新建对象的,它会在存放于堆中.每调用一次就会创建一个新的对象.而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc”则直接令str指向“abc”.

乌拉特中旗13639598255: String str="字符串";和String str=new String("字符串");肯定不一样,到底有什 -
承凡银杏: 不知道你用的是什么计算机语言. 如果是 c/c++ , String 要用小写. string str="abcdefg"; 这是 c 风格,声明 str 是 string 型,初始化 "abcdefg", 分配 8个字节. string str=new string("abcdefg"); 语法错误. 因为 new 是运算符,用于 动态分配,后面是方括号,不是小括号.正确写法是: string *str=new string[8]; 于是 你有 str[0],str[1],str[2],...str[7] 可以使用.

乌拉特中旗13639598255: String str = new String ("abc");创建了几个对象??具体过程是怎样的? -
承凡银杏: new是创建一个对象, str=new...意思是创建对象,然后把对象在内存中的位置放到str中

乌拉特中旗13639598255: String的两种赋值方式 -
承凡银杏: 这个是因为String str1=new String("hello")这样创建的话"hello"这个字符串只属于str1这个对象拥有,并且只有当程序运行到这句话的时候才去分配空间,而String str2="hello"则不是,它是在编译时就已经确定了,程序启动时已经在内存了,所以大家可以共用.

乌拉特中旗13639598255: java中 String s1=new String("haha"); String s2="hehe"; 他们 之间有什么区别啊 -
承凡银杏: 解析Java中的String对象的数据类型 1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性. 2. new String()和new String(...

乌拉特中旗13639598255: String str = "hello" ; 与 String str = new String("hello"); 有什么区别? -
承凡银杏: 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性.另外,栈数据可以共享,详见第...

乌拉特中旗13639598255: C#用string[] str = new string[5];重定义str = new string[8];会保留数据原有的数据吗? -
承凡银杏: 不会,因为new就代表这个数组已经被重新定义了 如果要保留原来的数据可以使用List<string>来试试 例子:List<string> str = new List<string>(); str.Add("new item"); //添加item,相当于数组的str[int x] = "new item" str.ToArray<string>(); //把list转为数组, 如果一定要转为数组的话,就string[] str_ = str.ToArray<string>(); Console.WriteLine(str[int x]); //输出item, 和数组一样

乌拉特中旗13639598255: java:的一个问题 String str=new String("hello"); str.in -
承凡银杏: 空字符可以在任意字符串中匹配,不占位置,想你那两个获取位置的方法,就获取的第一个位置,和最后一个位置的后一个位置

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网