在程序的开发过程中,经常需要判断用户输入的用户名是否正确,可以通过对比用户输入的用户名字符串是否与数据库中或者已经存在集合中的字符串相同,来决定用户输入的用户名是否正确。Java的基本数据类型可以使用“==”判断两个操作数是否相等,但是对于Java类创建的对象就不能使用这种方法来判断是否相等了。字符串是基本数据类型之外的,也就是说字符串在Java中是对象。本实例将通过字符串相等判断来实现用户名验证。实例运行效果如图


4.10.png

本实例调用了String类的equals()方法来判断两个字符串内容是否相同,这个方法是从Object类中继承的。在Java语言中,默认所有类都是Object类的子类,也就是说只要是对象,都会重写或直接使用Object类的equals()方法,String类就重写了这个方法实现判断字符串内容是否相同。该方法的声明如下:


public boolean equals(Object anObject)

参数说明

anObject:与当前字符串进行比较的对象。

1)在项目中创建窗体类,在窗体中添加一个接收用户输入信息的文本框、“提交”和“关闭”两个按钮。

2)编写“提交”按钮的事件处理方法。在该方法中接收用户输入的用户名,然后判断输入,如果不是管理员用户名,并且输入的用户名是已经注册的,则显示正确提示,否则显示错误提示。关键代码如下:

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class CheckUsername extends JFrame {
    
    private JPanel contentPane;
    private JTextField usernameField;
    
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    CheckUsername frame = new CheckUsername();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    
    /**
     * Create the frame.
     */
    public CheckUsername() {
        setTitle("\u5BC6\u7801\u627E\u56DE");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 312, 181);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        JLabel label = new JLabel("\u7528\u6237\u540D\uFF1A");
        label.setBounds(22, 54, 58, 17);
        contentPane.add(label);
        
        usernameField = new JTextField();
        usernameField.setBounds(77, 51, 180, 23);
        contentPane.add(usernameField);
        usernameField.setColumns(10);
        
        JButton button = new JButton("\u63D0\u4EA4");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                do_button_actionPerformed(e);
            }
        });
        button.setBounds(67, 88, 71, 25);
        contentPane.add(button);
        
        JButton button_1 = new JButton("\u5173\u95ED");
        button_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                do_button_1_actionPerformed(e);
            }
        });
        button_1.setBounds(165, 88, 71, 25);
        contentPane.add(button_1);
        
        JLabel label_1 = new JLabel(
                "<html>\u8BF7\u8F93\u5165\u4F60\u8981<font size=5 color=red>\u627E\u56DE\u5BC6\u7801</font>\u7684\u7528\u6237\u540D\u79F0\u3002</html>");
        label_1.setBounds(12, 14, 343, 25);
        contentPane.add(label_1);
    }
    
    protected void do_button_actionPerformed(ActionEvent e) {
        String name = usernameField.getText();// 获取用户输入
        if (name.equals("admin")) {// 判断是否管理员账号
            JOptionPane.showMessageDialog(null, "对不起,这个用户名是管理员的,不是你的");
        } else if (name.equals("mingri")) {// 判断是否注册用户
            JOptionPane.showMessageDialog(null, "该用户名对应的密码已经发送到注册时的邮箱,请查收");
        } else {// 给错误用户名的提示对话框
            JOptionPane.showMessageDialog(null, "你输入的用户名不存在,留意Caps Lock键是否按下。");
        }
    }
    protected void do_button_1_actionPerformed(ActionEvent e) {
        dispose();
    }
}

心法领悟Java的字符串池。

Java虚拟机中有一个保存字符串的池,它会记录所有字符串。例如:

String str1="abc";
String str2="abc";
String str3=new String("abc");
System.out.println(str1==str2);
System.out.println(str1==str3);

这段代码中str1==str2的判断将返回true,为什么这个等式会成立呢?Java中的基本数据类型使用“==”可以判断操作数是否相等,对于对象使用这个符号判断的是两个对象的内存地址是否相同。而Java虚拟机为了提高字符串应用效率,提供了字符串池来保存字符串常量,str1创建字符串常量“abc”,这时会先检测字符串池中是否包含该字符串,如果不包含,则创建字符串常量保存到字符串池中,然后再返回。str2也赋值为字符串“abc”,这是由于字符串池中已经存在该字符串,所以不再创建,直接返回该字符串,也就是说这两个变量引用同一个字符串,那么它们的内存地址也是相同的,所以str1==str2成立。但是使用new关键字创建的字符串会新开辟内存空间,所以str1==str3不成立。