首页 > 试题广场 >

下列程序的输出结果是什么?

[单选题]
下列程序的输出结果是什么?
public class Test1{
    public static void main(String args[]){
            String a="1234";
            String b="1234";
            String c = new String("1234");
            System.out.println(a==b);
            System.out.println(a==c);
            System.out.println(a.equals(c));
    }
}

  • true
    false
    true
  • true
    true
    false
  • true
    false
    false
  • true
    true
    true
推荐
正确答案:A
equal:是用来比较两个对象内部的内容是否相等的。
==:是用来判断两个对象的地址是否相同,即是否是指相同一个对象。

编辑于 2014-12-30 20:24:51 回复(3)
A.第一次String a="1234"时,会在常量池中创建一个常量1234,String b=1234时,常量池中已经有了该常量,所以直接取,a和b的地址一样,所以地址值相等;String c = newString("1234")重新new了对象,在堆内存中开辟了新的空间,所以地址值不想等,而equals方法比较的是值是否相等

发表于 2015-08-10 11:25:59 回复(4)
重新说下String的equals方法,不是说所有类的equals方法都只判断值。
例如Object的equals方法的作用和==是相同的,都是判断引用。
只不过String类重写了Object的equals方法而已,代码如下
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
先判断地址是否相等,如果相等直接返回true.
否则先判断是否是String类型的,如果是在判断每个字符是否相等,如果都相等返回true,其余情况返回false
编辑于 2015-04-02 17:13:07 回复(5)
A.equals只是进行值判断不对类是不是同一个引用不进行判断,而==判断包括值和类引用.通过String a = "1234"这种产生的字面字符串,如果内存中存在字符串“1234”则会直接引用,如果没有则分配内存,因此a==b的结果为true。而String c = new String("1234"),则会分配内存控件存储字符串,不考虑之前是否存在。因此a==c的结果false.由于a和c的值都是"1234"因此a.equals(c)的结果为true.同时Integer中也是类似的原理,因此使用Integer a = 12;时会在某种情况下提高程序的性能。
发表于 2015-01-04 19:44:07 回复(1)
字符串相同java在编译的时候会使用同一个地址
发表于 2015-05-24 11:58:26 回复(0)
   String a="1234";
   使用 = 赋值创建String类型的特殊实例,会创建一个对象并储存在常量池中 ;
   String b="1234";
   优先使用常量池中已存在的对象.
   a 和 b 指向的是同一个地址值.
     1. == 比较内容和地址值:  a==b 为 true

   String c =newString("1234"); 创建一个对象存储在一般堆内存中
 2.由于指向不同对象 , 比较地址值 :  a==c 为 false

     String 类中重写的 equals 方法只比较字符串内容 , 不比较地址值
     3. a.equals(c) 为true


发表于 2016-03-14 18:34:09 回复(0)
用(==)进行比较的时候, 比较的是他们在JVM中的存放地址  ,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为也是比较对象的内存地址,但在一些类库当中这个方法 被重写 了,如 String,Integer,Date 在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
发表于 2016-04-29 11:21:13 回复(0)
注意:hashCode()都是一样的
发表于 2015-10-02 18:35:52 回复(0)
A,这道题考察java的内存机制,==是看内存中的地址是否一样,equal是判断内容是否一样。
发表于 2015-03-31 10:52:16 回复(0)
第一次String a="1234"时,会在常量池中创建一个常量1234,String b=1234时,常量池中已经有了该常量,所以直接取,a和b的地址一样,所以地址值相等;
String c = newString("1234")重新new了对象,在堆内存中开辟了新的空间,所以a和c地址值不相等,而equals方法比较的是值是否相等
编辑于 2019-09-09 21:15:35 回复(0)
1.对于==,如果比较的是两个基本数据类型,则直接比较存储的值,如果比较的是两个引用数据类型(如比较两个对象),则比较的是所指向的对象的地址,即是否是指相同一个对象;
2.equals方法,如果没有对equals方法进行重写,例如Object的equals方法,作用和==是相同的,即是用来判断两个对象的地址是否相同,即是否是指相同一个对象。如果重写了equals方法,例如String类重写了equals方法,则用来比较的是对象的内容
发表于 2019-08-24 10:50:15 回复(0)
equal:用来比较的是对象内部内容是否相等
==:用来判断两个对象的地址是否相同,是否是同一个对象
发表于 2019-06-02 10:05:42 回复(0)
例题一:

TRUE    FALSE    TRUE
第一次String a="1234"时,会在常量池中创建一个常量1234,String b=1234时,常量池中已经有了该常量,所以直接取,a和b的地址一样,所以地址值相等
String c = newString("1234")重新new了对象,在堆内存中开辟了新的空间,所以地址值不想等,而equals方法比较的是值是否相等

拓展与总结:
在String中 == 是判断地址是否相等
关于equals这个方法,在String类中是被重写了的,可以先判断地址是否相同,再比较值是否相同

并不是所有类的equals都是比较值,例如object类的equals方法和==是一样的

注:instanceof是用来判断前后两个对象是否是一个家族中的,也就是判断是否有继承关系

例题二:

false,false,true

拓展与总结:
在Integer中,使用 == 来作比较两个对象时(和常数进行比较时,是直接比较值是否相同),需要注意的一点是:对Integer对象进行初始化赋值时,是通过调用valueOf来实现的。
而对于-128到127之间的数(最小值-128是确定了的,但是最大值127是可以通过虚拟机的配置文件来配置),Java会对其进行缓存。而超出这个范围则新建一个对象。
也就是说,如果第一次创建值时在缓存范围之内,第二次如果也是第一次相同的数,其实就是直接在缓存中取的,并没有新建对象,地址相同。

equals的源码↓

编辑于 2018-12-10 14:20:15 回复(1)
1.没有重写的equals方法和“==”是一样的,
  • 引用类型比地址,
  • 基本类型且为数值类型,比值,即使类型不同,也能true。

2.String重写了equals方法,有三种情况
  • 比较对象与当前对象是同一个对象(Object中的equals方法),返回true;
  • 传入的对象是String类型,比较两个字符串长度,不同返回false,若长度相同,则对每一位字符进行比较,每一位都相同返回true;
  • 传入的对象不是String类型,直接返回false。


编辑于 2018-05-11 09:13:21 回复(0)
equals()与==的区别:
    对于==来说,如果作用于基本数据类型的变量,则直接比较其存储的值是否相等;
                            如果作用于引用类型的变量,则比较的是所指向对象的地址。
    对于equals()来说,如果没有对Object.equals()进行重写,则比较的是引用类型变量所指向的地址;
                            如果对Object.equals()进行重写,则比较的是所指向的对象内容(如String,Data)
发表于 2018-02-25 11:35:16 回复(0)
“==”比较的是 地址或者说是对象的引用
equals的默认行为比较的是引用,但jdk中有些类覆盖了object类的equals()方法,范围比较对象的内容是否一样。这些类有:java.io.file、java.util.date、java.lang.string、包装类(integer、Double......)
String a="1234";会在常量池中创建一个对象1234, String b="1234"时优先使用常量池中已存在的对象,直接取出该常量,所以a和b的地址是相等的.
new string()重新在堆里创建了一个对象,所以和ab的地址是不相等的
a.equals(c)在string中比较的是值是否相等,所以返回true

发表于 2017-12-05 19:22:19 回复(0)
A  == 是判断址 equals 是判断值
发表于 2015-12-17 12:02:05 回复(0)
看错答案了,日
发表于 2015-08-09 23:45:48 回复(0)
==用于比较对象的引用
equal用于比较对象的内容
发表于 2015-07-05 16:45:13 回复(0)
字符串常量是看常量池里面有没有“1234”有则不创建,没有就创建,所以a,b这两个变量都是指向统一个“1234”,所以a,b的所指向的内存地址是一样的,c变量是指向new String(“1234”)对象的。所以c值得地址和ab地址肯定不同。但是abc的指向的内容是一样的所以选A。
发表于 2015-06-25 15:33:09 回复(1)
A
发表于 2015-05-24 12:11:44 回复(0)