下面代码的输出是什么?一共在内存中生成了几个String对象?为什么?
String s1 = “aaa”;
String s2 = “aaa”;
String s3 = new String(“aaa”);
String s4 = new String(“AAA”);
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));
String s1 = “aaa”;
String s2 = “aaa”;
String s3 = new String(“aaa”);
String s4 = new String(“AAA”);
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));
解决方案 »
- 今天华为-赛门铁克公司面试题
- VB.net与JAVA的TCP通信问题
- 按Tab时的caretUpdate问题???
- JMenuItem 的监听器是什么
- 基础问题
- 请问如何对两个比特串进行逻辑运算!
- 关于JLabel在窗体上的显示,唉郁闷ing
- java 串口程序eclipse和控制台都正常,用Fat jar打包后运行jar串口打不开
- ******** 在线等待,关于JPasswordField的,解决问题后立即给分 *******
- 怎样把\u9996\u9875的汉字编码,转换为汉字输出!谢了
- 送《java手机程序设计入门》,求帮助!!
- 初学者的问题:从键盘接收一个int型的数用什么语句? 谢谢
false
true
3个String对象
看看下面这篇文章,相信对你理解该问题会有所帮助。
http://www.pcbbs.cn/Article/BC/JAVA/200601/18349.html
false
true
生成2个对象
------------------
对象在内存中的存储地址由他的hashCode决定,对于String对象,他覆写了Object中的hashCode():
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count; for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
所以String 对象比较特殊,只要是值一样,其对应的地址就相同,也就是不生成新的对象。得出结论:s1,s2,s3对应的是同一个对象,s4对应第二个对象。关于String.euqals()方法,代入得是s3的reference复制,也不生成新对象。你可以用
System.out.println(s1.hashCode()+
+"\t"+s2.hashCode()+
+"\t"+s3.hashCode()+
+"\t"+s4.hashCode());测试
false
true
3个对象
false
true
4个
s1和s2指向同一个对象aaa
s3是一个指向堆中aaa的String对象
String s4 = new String(“AAA”);
生成2个对象,一个AAA String常量,一个String对象s4
false
true
生成n个对象
false
true
对象个数:4原因:
String s1 = “aaa”; <=> String s1=new String("aaa");//JAVA中new即创建新对象
所以共四个新对象
如果语句为
String s1 = “aaa”;
String s2=s1;那么这两句只创建了一个对象,第二句只是声明了一个新的String引用,并指向s1所指向的那个对象。而并没有给s2分配实际的内存空间。
不知道我这样说楼主听的懂吗?
只有2个对像运算符==只是比较 两个对像的"内容 "是否相等
方法equals()比较的是两个引用是否相等
public class HelloWorld
{
public static void main(String[] args)
{
String s1 = "aaa";
String s2 = "aaa";
String s3 = new String("aaa");
String s4 = new String("AAA");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));
System.out.println(s2.equals(s3));//这句是我加上的结果为true;
}
}
String(String original)
Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string.
上面是Java API Doc的定义,是字符串变量的拷贝.
public class Test{
public static void main(String args[]){
String s1 = "aaa";
String s2 = "aaa";
String s3 = new String(s1);
String s4 = new String("AAA");
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
System.out.println(s1 == s3); //false
System.out.println(s1.equals(s3)); //true
System.out.println(s4 == "AAA"); //false
System.out.println(s4.equals("AAA")); //true
}
}
就是说生成了四个对象,所以内存中也应该是有四个对象.
dogod(那天,正喝着汤,猛然间....睡着了!) 你的内存地址问题可否说得再清楚点.谢谢!!
false
true
3个对象
java语言对于字符串的操作有点特殊像String a="a"这样实在一个字符串池(不知道是不是这么叫)里面生成了一个"a"的对象,如果再声明String b="a",这样的话其实b指向和a一样的
但是new String就不一样了,他只是生成一个普通对象
String a="a";
String b="a";
这2个用同一个内存地址