JAVA中对JTextField对象的值的获取操作,为啥注释的部分没有效果呢?难道有啥错误么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA中对JTextField对象的值的获取操作,为啥注释的部分没有效果呢?难道有啥错误么?相关的知识,希望对你有一定的参考价值。

//UserField、PassField均为JTextField对象!
String str1 = UserField.getText();
String str2 = PassField.getText();
// if (UserField.getText() == "jackson")
// System.out.println(UserField.getText());
// UserField.setText(null);
//
// if (PassField.getText() == "123")
// System.out.println("Please Coming");
// UserField.setText(null);
// PassField.setText(null);
//
//
if (str1.equals("jackson"))
System.out.println(str1);
UserField.setText(null);

if (str2.equals("123"))
System.out.println(str2);
PassField.setText(null);

在jave中==比较的的是2个对象的内存地址

如果没有overrid equals方法的话,它和“==”是一样的,当然,String类中对于equals进行了override,

看JDK源码可以知道,equals方法先会对字符串的长度进行比较,如果长度相同,则再对每个character作==运算


public boolean equals(Object anObject)
    if (this == anObject)
        return true;
    
    if (anObject instanceof String)
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count)
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0)
            if (v1[i++] != v2[j++])
            return false;
        
        return true;
        
    
    return false;
    
 public int hashCode()
    int h = hash;
        int len = count;
    if (h == 0 && len > 0)
        int off = offset;
        char val[] = value;
            for (int i = 0; i < len; i++)
                h = 31*h + val[off++];
            
            hash = h;
        
        return h;
    


在来,看下JTextField的源码,可以看到,getText的实现是这样的

【以下是从JDK1.6中截取的部分源码片段】

//JTextField的getText
public String getText()
        Document doc = getDocument();
        String txt;
        try
            txt = doc.getText(0, doc.getLength());
         catch (BadLocationException e)
            txt = null;
        
        return txt;
    
//这段代码是doc.getText的实现
    public String getText(int offset, int length) throws BadLocationException
    if (length < 0)
        throw new BadLocationException("Length must be positive", length);
    
    String str = data.getString(offset, length);
    return str;
    
//这段代码是data.getString(offset,length)的实现
 public String getString(int where, int len) throws BadLocationException
    if (where + len > count)
        throw new BadLocationException("Invalid range", count);
    
    return new String(data, where, len);
    

最终可以看到,返回的结果是new String(data,where,len);,到此也可以很明显看到getText返回的字符串和"123"是两个不同的实例,因此==得到的必然是false


PS: 关于String a = new String("123"); 和 String a = "123"; 这2条语句的不同已经是一个老生常谈的问题了,此处就不说明了。

追问

JDK源码?怎么样可以看到呢?

追答

在JDK的安装目录下有src.zip,可以解出来看看。另外的话使用eclipse也可以查看到源代码(可能需要作关联)

参考技术A String 的 == 应该写 equals函数 而不是简单的==
==只有数字类型的 才可以用..
String的都是equals
参考技术B 字符串的比较要用equals 吧 不能用== 的 参考技术C if (PassField.getText() == "123") 用 equals

以上是关于JAVA中对JTextField对象的值的获取操作,为啥注释的部分没有效果呢?难道有啥错误么?的主要内容,如果未能解决你的问题,请参考以下文章

Java方法中传递数组与改变数组值的问题

Java方法中传递数组与改变数组值的问题

java对象值的copy

单击提交后如何在带有java bean值的JTextField上设置文本

如何在具有许多 JTextField 的 Java Swing JFrame 实例中获取关键事件?

如何在 JLabel 和 JTextField 上显示非科学格式的值?