论坛首页 Java企业应用论坛

java中String对象

浏览 2455 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2011-07-18   最后修改:2011-07-18
这里得到的String对象是不是一个新的?
我想问的是通过Scanner得的对象是new 出来的新对象?
public static void main(String[] args) {
		String s1=new Scanner(System.in).next();
		String s2="test";
		String s3="test";
		System.out.println("s1==s2   "+(s1==s2));
		System.out.println("s1.equals(s2)   "+s1.equals(s2));
		System.out.println(s2==s3);
	}

输出结果

test
s1==s2   false
s1.equals(s2)   true
true
   发表时间:2011-07-18  
都是不怕做题的淫呐


csdn上每月两次的问题
0 请登录后投票
   发表时间:2011-07-20  
xyfwjk 写道
这里得到的String对象是不是一个新的?
我想问的是通过Scanner得的对象是new 出来的新对象?
public static void main(String[] args) {
		String s1=new Scanner(System.in).next();
		String s2="test";
		String s3="test";
		System.out.println("s1==s2   "+(s1==s2));
		System.out.println("s1.equals(s2)   "+s1.equals(s2));
		System.out.println(s2==s3);
	}

输出结果

test
s1==s2   false
s1.equals(s2)   true
true



S2 S3的test来自常量池,引用地址一样,所以true,
你通过输入流获取的字符串,不是从常量池拿出来的 引用地址不一样 所以是FALSE;





0 请登录后投票
   发表时间:2011-07-20  
xyfwjk 写道
这里得到的String对象是不是一个新的?
我想问的是通过Scanner得的对象是new 出来的新对象?
public static void main(String[] args) {
		String s1=new Scanner(System.in).next();
		String s2="test";
		String s3="test";
		System.out.println("s1==s2   "+(s1==s2));
		System.out.println("s1.equals(s2)   "+s1.equals(s2));
		System.out.println(s2==s3);
	}

输出结果

test
s1==s2   false
s1.equals(s2)   true
true


new 出来的对象是在堆里面,而用=分配的对象是在常量池里面,java编译器会把所有相同的String指向常量池里同一个对象,所以引用是相同的。

可以调用String.intern()得到常量池的引用。

s1.intern()==s2 返回就是true了。
0 请登录后投票
   发表时间:2011-07-20  
我总觉得这种题目没太多必要研究,记得用equals方法就行……
说真的,没感觉出来==这种比较在非primitive类型里有什么必要使用(仅java)
0 请登录后投票
   发表时间:2011-07-21  
equals 和==的区别而已~
0 请登录后投票
   发表时间:2011-07-21  
xyfwjk 写道
这里得到的String对象是不是一个新的?
我想问的是通过Scanner得的对象是new 出来的新对象?
public static void main(String[] args) {
		String s1=new Scanner(System.in).next();
		String s2="test";
		String s3="test";
		System.out.println("s1==s2   "+(s1==s2));
		System.out.println("s1.equals(s2)   "+s1.equals(s2));
		System.out.println(s2==s3);
	}

输出结果

test
s1==s2   false
s1.equals(s2)   true
true

既然输出 s1==s2 flase 那肯定不是常量池里的变量。记住 java编译器在编译期间遇到引用都会无法确定变量,对于s1 == s2 都会是false。除非 s1是final关键字修饰的常量,后面通过引用才会输出true
0 请登录后投票
   发表时间:2011-07-21  
哈哈,哈哈哈,这问题...
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics