首页 > 试题广场 >

下面代码将输出什么内容:()

[单选题]

下面代码将输出什么内容:()

public class SystemUtil{
    public static boolean isAdmin(String userId){
        return userId.toLowerCase()=="admin";
    }
    public static void main(String[] args){
        System.out.println(isAdmin("Admin"));
    }
}


  • true
  • false
  • 1
  • 编译错误
推荐
equals和==的区别 ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
编辑于 2017-03-19 10:40:44 回复(21)

在源码中 toLowerCase 是重新 new String()

所以为 == 是比较对象是否是同一个对象,所以为 false

发表于 2017-03-14 12:38:11 回复(26)
道理我都懂,当初怎么就瞎了眼捏→_→
发表于 2017-04-05 13:14:25 回复(0)
首先要知道toLowerCase()的底层实现是
return new String(result, 0, len + resultOffset);
所以底层new 了一个新的字符串并且返回。

因为0x0003 不等于0x0002 ,所以返回false,如果是equals 则返回true
因为== 比较的是地址。
equals 比较的话 先比较地址,如果相等,直接返回true
然后看比较的对象是不是String类型,如果不是直接返回false
如果是的话,则依次比较每个字符,如果全部相等,则返回true


编辑于 2017-12-08 09:43:53 回复(14)

图片说明
为何返回值是true,不是调用toLowerCase()重新定义了一个对象吗

发表于 2017-08-28 17:38:09 回复(5)
啊啊啊啊啊啊,不止一次吃了这个亏,字符串比较相等一定用equals,一定用equals,一定用equals!!
发表于 2017-07-24 09:22:46 回复(3)
这个题Admin 的A是大写,所以toLowerCase 时会重新new一个字符串,不是同一块地址,返回false。
但是,如果main方法传入的是admin的情况下,是不会重新new的,会返回true。
发表于 2019-01-20 20:12:28 回复(0)
==是判断地址,string的tolowercase很明显是拿着原有的字符串又new了个地象,所以地址不一样
发表于 2017-02-06 23:20:07 回复(0)
string是引用类型
发表于 2016-12-13 14:40:43 回复(0)

B

刚开始的时候我认为返回true,我认为他们都是常量池中的"admin"。查看toLowerCase()后发现如果需要转换他会重新new String。

发表于 2017-04-03 15:29:13 回复(0)
等号左边是堆区对象,右边是常量区对象(方法区中),肯定不是一个对象
发表于 2018-04-19 22:36:44 回复(0)
这题考察的是==和equals的区别,当基本数据类型比较时,只能用后者;当引用类型比较时,前者是比较地址,后者是比较内容。所以String中,==是比较地址,而toLowerCase方法是返回新String,地址不同。结果为false
发表于 2017-03-31 00:11:10 回复(2)
public static boolean isAdmin(String id){
return id=="admin";                               //false
//return id.toLowerCase()=="admin";    //false。后面的“admin”常量不会共享new出的对象
}
    public static void main(String[] args) {
    String a=new String("admin");
    System.out.println(isAdmin(a));
    }

public static boolean isAdmin(String id){
return id=="admin";                            //true
//return id.toLowerCase()=="admin";   //true
}
    public static void main(String[] args) {
    System.out.println(isAdmin(“admin”));
    }

public static boolean isAdmin(String id){
return id.toLowerCase()=="admin"; 
  //false。==后面的的“admin”是字符串常量。前面toLowerCase函数返回的是new出的对象,而不是返回常量对象。
}
    public static void main(String[] args) {  
    System.out.println(isAdmin("Admin"));
    }

  toLowerCase源码:
编辑于 2017-03-20 12:18:55 回复(0)
对字符串内容的比较用equals()方法
发表于 2017-01-04 23:19:01 回复(0)
“ == ” 和 “ equals ” 在比较基本类型时都是比较数值。但是在比较对象时,“ == ”比较的是内存地址 ,不相同直接返回faise ;而 “ equals ”不单单比较内存地址,还会比较内存地址所指向的值,即使内存地址不相同,但是所指向的值都相同,也会返回 true。 这是我的理解

发表于 2018-02-26 15:30:13 回复(0)
字符串不变性,大小写函数重新申请了一块区域
发表于 2017-03-06 19:59:00 回复(1)
==比较的是否是同一个对象,还常考的一个知识点是:equal比较的是对象中的内容,很明显这里不是同一个对象
发表于 2017-02-25 20:25:47 回复(0)

如果代码改成
System.out.println(isAdmin("admin"));
则会返回true。。

原理仅需要看源码,,不要来一堆什么堆内存、栈内存
知道  ==  比较的是地址就可以了

源码原理是: 发现所有字符都是小写(根据字符编码集判断)时候,返回原对象,发现有一个字符是大写时,就新建一个String返回

发表于 2020-06-18 17:12:57 回复(0)
还是不明白,静态方法为什么不经过对象或者类名调用就可以自己执行,求解惑
发表于 2017-08-27 21:42:38 回复(2)
要分清  “admin”=="admin" 返回true, “admin”在字符串常量池中,  这道题返回false秘密在于toLowerCase方法中
发表于 2023-02-06 14:06:00 回复(0)
当然,toLowerCase()是会new一个字符串"admin",但是,之前的那个"admin"在哪里呢?我们可以知道,int a = 126;Integer c = new Integer(126),system.out.println(a==c);输出是true,这是因为比较的时候会自动拆箱。
public class ImmutableString
{
	public static void main(String[] args)
	{
		 String s1 = "Test";     
         String s2 = "Test";     
         String s3 = new String("Test");
		 String s4 = new String("Test");
		
		System.out.println(s1==s2);//true
		System.out.println(s3==s4);//false
	}
}
问题就是,在方法区的常量池的"admin"和在堆中的"admin"比较的时候是怎么样的呢,又不是基本数据类型,比较的是地址,那当然是false啦!
好,拓展一下:
public class TestPlus
{
	public static void main(String[] args)
	{
		String s1 = new String("HeIIo");//共2个 堆区和常量池都有"HeIIo"
		String s2 = "World";//共3个 常量池中的"World"
		System.out.println("s1 = " + s1);//共5个 "s1 = "&"s1 = HeIIo"都在常量池
		System.out.println("s2 = " + s2);//共7个 "s2 = "&"s2 = World"常量池
		//在堆里创建“HeIIoWorld”对象,创建2个共9个
		s1 += s2;//9  HeIIoWorld  "HeIIoWorld"堆和常量池都有,因为创建了新对象
		System.out.println("s1 = " + s1);//共10个 "s1 = HeIIoWorld"常量池
		System.out.println("s1==HeIIoWorld " + (s1=="HeIIoWorld") );//共13个  "s1==HeIIoWorld "在常量池,"s1==HeIIoWorld false"在常量池
		s1 = s1.concat(" 张三!");//HeIIoWorld张三! 共16个 "HeIIoWorld 张三"堆和常量池,"张三"常量池
		System.out.println("s1.concat = " + s1);//共18个 "s1.concat = "&"s1.concat = HeIIoWorld 张三"常量池
		
		s1 = s1.replaceAll("II", "aa");//HeaaoWorld张三!共22个
		System.out.println("s1.concat = " + s1);//共23个
		System.out.println(s1 + " ls index: " + s1.charAt(2));//a 共28个
		System.out.println("--------------------- ");
		StringBuffer sb1 = new StringBuffer("Hello");
		StringBuffer sb11 = new StringBuffer("Hello");
		StringBuffer sb2 = new StringBuffer("World");
		StringBuffer sb3= new StringBuffer("Hello");
    	StringBuffer sb4=sb1.append("abc");
		System.out.println( "sb4==sb1  "+(sb4==sb1));//true
		sb1.toString();//创建String对象返回String对象的地址
	    //System.out.println( sb1.toString());
  //System.out.println( sb1==sb1.toString());
       //System.out.println( "Helloabc==sb1.toString()="+("Helloabc"==sb1.toString()));
	     //sb3=sb1+sb2;
	   System.out.println("sb11==sb3   "+(sb11==sb3));
	    System.out.println("sb11.equals(sb3)   "+sb11.equals(sb3));
         System.out.println("sb1 = " + sb1);
	}	
}
理解了以上的程序,那么对于String对象的创建,你将非常透彻。


发表于 2020-09-09 10:10:31 回复(0)