String s="Hello"; s="Java";
2016-09-13 10:43
113 查看
面试时遇到有关String的题,发现不会,恶补一下:
一、String是否能被继承:答案是不能,因为String是final类,故不可被继承也不能被修改。
例如:String s = "Hello";
s = " world";
解析:在jvm的工作过程中,会创建一片内存空间专门存入String对象,我们把这片内存空间叫做String池。
String s =" Hello";当Jvm看到“Hello”,在String池创建String对象存储它,并将他的引用返回给s。
s = "world"; 当Jvm看到"world",在String池创建新的String对象存储它,再把新建的String对象的引用
返回给s,而原先的“Hello”仍然有String池内。没有消失,它是不能被修改的。
所以我们仅仅是改变了s的引用,而没有改变他所引用的对象,因为String对象的值是不能被改变的。
二、String s = new String ("xyz")创建了几个对象?
首先让我们了解几个概念:
1.栈:由JVM分配区域,用于保存线程执行的动作和数据引用。
2.堆:由JVM分配的,用于存储对象等数据的区域。
3.常量池constant pool:在堆中分配出来的一块存储区域,用于存储显式的String,float或者interger,这是一个特殊的 共享区域,可以在内存中共享的不经常改变的东西,都可以放在这里。常量池中的数据是在编
译区赋值的,也就是生成class文件时就把它放到常量池里了。
看下面的例子:
String a = "abc";①
String b = "abc";②
使用String a = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
①代码执行后在Constant Pool中创建了一个值为abc的String对象,②执行时,因为Constant Pool中存在"abc"所以就不在创建新的String对象了。
String c = new String("xyz");①
String d = new String("xyz");②
让我们来看看这两句代码在内存中发生了什么,①Class被CLassLoader加载时,你的"xyz"被作为常量读入,在constant pool里创建了一个共享的"xyz",然后当调用到new String("xyz")的时候,会在heap(堆)里创建这个new
String("xyz");②由于constant pool中存在"xyz"所以不再创建"xyz",然后创建新的new String("xyz")。对于String c = new String("xyz");的代码,与String a = "abc"相比不同的是一概在堆中创建新对象,不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
程序1
String s1 = new String("xyz"); //创建二个对象,一个引用
String s2 = new String("xyz"); //创建一个对象,并且以后每执行一次创建一个对象,一个引用
程序2
String s3 = "xyz"; //创建一个对象,一个引用
String s4 = "xyz"; //不创建对象,只是创建一个新的引用
重要的是理解constant pool与new关键字
最后看本题目:String s = new String ("xyz")创建了几个对象?
1.如果String常量池中,已经创建"xyz",则不会继续创建,此时只创建了一个对象new String("xyz");
下面的这个例子能帮助我们更深入的理解String的存储和赋值原理(比较字符串时,==比equals()快,==比较的是引用,equals()比较的是对象内容) eg:1 String str1 = new String("123");
String str2 = "123";
String str3 = str1.intern();
System.out.println((str1 == str2) +","+ (str3 == str2)); 输出 false,true
String str4 = new String("234");
String str5 = new String("234");
String str6 = str4.intern();
String str7 = str5.intern();
System.out.println((str4 == str5) +","+ (str6 == str7)); 输出 false,true eg2: public class Test4{ private String name; public Test4(String name){ this.name = name; } public void setName(String name){ this.name = name; } public String getName(){ return name; } } public class Test3{ public static void main(String[] args){ Test4 t1 = new Test4(new String("zhangsan")); Test4 t2 = new Test4("zhangsan"); Test4 t3 = new Test4("zhangsan"); System.out.println(t2 == t3);//false System.out.println(t2.equals(t3));//true System.out.println(t1.getName() == t2.getName());//? System.out.println(t2.getName() == t3getName());//?
System.out.println(t2.getName().equals(t3.getName()));//true } }如果哪里有什么不对的地方,欢迎各位朋友的指正,上面的俩个?若有朋友知道,也可以给我留言,互相交流与学习!
一、String是否能被继承:答案是不能,因为String是final类,故不可被继承也不能被修改。
例如:String s = "Hello";
s = " world";
解析:在jvm的工作过程中,会创建一片内存空间专门存入String对象,我们把这片内存空间叫做String池。
String s =" Hello";当Jvm看到“Hello”,在String池创建String对象存储它,并将他的引用返回给s。
s = "world"; 当Jvm看到"world",在String池创建新的String对象存储它,再把新建的String对象的引用
返回给s,而原先的“Hello”仍然有String池内。没有消失,它是不能被修改的。
所以我们仅仅是改变了s的引用,而没有改变他所引用的对象,因为String对象的值是不能被改变的。
二、String s = new String ("xyz")创建了几个对象?
首先让我们了解几个概念:
1.栈:由JVM分配区域,用于保存线程执行的动作和数据引用。
2.堆:由JVM分配的,用于存储对象等数据的区域。
3.常量池constant pool:在堆中分配出来的一块存储区域,用于存储显式的String,float或者interger,这是一个特殊的 共享区域,可以在内存中共享的不经常改变的东西,都可以放在这里。常量池中的数据是在编
译区赋值的,也就是生成class文件时就把它放到常量池里了。
看下面的例子:
String a = "abc";①
String b = "abc";②
使用String a = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
①代码执行后在Constant Pool中创建了一个值为abc的String对象,②执行时,因为Constant Pool中存在"abc"所以就不在创建新的String对象了。
String c = new String("xyz");①
String d = new String("xyz");②
让我们来看看这两句代码在内存中发生了什么,①Class被CLassLoader加载时,你的"xyz"被作为常量读入,在constant pool里创建了一个共享的"xyz",然后当调用到new String("xyz")的时候,会在heap(堆)里创建这个new
String("xyz");②由于constant pool中存在"xyz"所以不再创建"xyz",然后创建新的new String("xyz")。对于String c = new String("xyz");的代码,与String a = "abc"相比不同的是一概在堆中创建新对象,不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
程序1
String s1 = new String("xyz"); //创建二个对象,一个引用
String s2 = new String("xyz"); //创建一个对象,并且以后每执行一次创建一个对象,一个引用
程序2
String s3 = "xyz"; //创建一个对象,一个引用
String s4 = "xyz"; //不创建对象,只是创建一个新的引用
重要的是理解constant pool与new关键字
最后看本题目:String s = new String ("xyz")创建了几个对象?
1.如果String常量池中,已经创建"xyz",则不会继续创建,此时只创建了一个对象new String("xyz");
2.如果String常量池中,没有创建"xyz",则会创建两个对象,一个对象的值是"xyz",一个对象new String("xyz")。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。(无论怎样都返回池中的对象)
下面的这个例子能帮助我们更深入的理解String的存储和赋值原理(比较字符串时,==比equals()快,==比较的是引用,equals()比较的是对象内容) eg:1 String str1 = new String("123");
String str2 = "123";
String str3 = str1.intern();
System.out.println((str1 == str2) +","+ (str3 == str2)); 输出 false,true
String str4 = new String("234");
String str5 = new String("234");
String str6 = str4.intern();
String str7 = str5.intern();
System.out.println((str4 == str5) +","+ (str6 == str7)); 输出 false,true eg2: public class Test4{ private String name; public Test4(String name){ this.name = name; } public void setName(String name){ this.name = name; } public String getName(){ return name; } } public class Test3{ public static void main(String[] args){ Test4 t1 = new Test4(new String("zhangsan")); Test4 t2 = new Test4("zhangsan"); Test4 t3 = new Test4("zhangsan"); System.out.println(t2 == t3);//false System.out.println(t2.equals(t3));//true System.out.println(t1.getName() == t2.getName());//? System.out.println(t2.getName() == t3getName());//?
System.out.println(t2.getName().equals(t3.getName()));//true } }如果哪里有什么不对的地方,欢迎各位朋友的指正,上面的俩个?若有朋友知道,也可以给我留言,互相交流与学习!
相关文章推荐
- 【Java面试题】15 String s="Hello"; s=s+“world!”;这两行代码执行后,原始的String对象中的内容到底变了没有?String与StringBuffer的超详细讲解!!!!!
- 火星又归来: String.replace("SUNW", "JAVA")
- 火星又归来: String.replace("SUNW", "JAVA")
- "String" in Java总结
- Java中的String str="abc"; String str=new String("abc");和String str = new String();的区别以及==与equals()的不同。
- java.lang.NumberFormatException: For input string: "bobo"
- [java] "Hello"和new String("Hello")产生String对象的区别
- Java解析DBF文件,错误Failed to parse Number: For input string: "-.---" 或读取不出数据或乱码问题都在这里解决
- Java String = "" 和 new String()区别
- Flex和Java整合错误 [FaultEvent fault=[RPC Fault faultString="Send failed"
- 火星又归来: String.replace("SUNW", "JAVA")
- Java中的String str="abc"; String str=new String("abc");和String str = new String();的区别以及==与equals()的不同。
- Java中的String str="abc"; String str=new String("abc");和String str = new String();的区别以及==与equals()的不同。
- Unable to find a value for "dwmc" in object of class "java.lang.String" using operator "." (null
- 问题解决:javax.servlet.jsp.el.ELException: The "." operator was supplied with an index value of type "java.lang.String" to be applie
- java的PreparedStatement.setString(1, "");后一个参数不能为空,否则出错
- 火星又归来: String.replace("SUNW", "JAVA")
- The "." operator was supplied with an index value of type "java.lang.String" to be applied to a List
- String str = new String("hello"); str+="Java";这两句代码共有几个对象?
- An internal erroroccurred during: "Removing compiler problem markers...".java.lang.String