Day 6:Vector类和实现Hashset以及登录窗口的模拟

本文深入探讨了Java集合框架中的LinkedList和Vector的使用方法与区别,包括扑克牌洗牌实例、年龄排序实现、线程安全特性解析及HashSet的工作原理。

LinkedList作业:生成扑克牌并且洗牌?

 

import java.util.*;

class Poker{
    String color;
    String number;
    
    public Poker(String color, String number) {
        super();
        this.color = color;
        this.number = number;
    }

    @Override
    public String toString() {

        return "{"+color+number+"}";    
    }
}

public class Demo1 {
    
    public static void main(String[] args) {
        LinkedList pokers = createPokers();
        shufflePoker(pokers);
        showPoker(pokers);
    }
    
    private static void showPoker(LinkedList pokers) {
        for(int i = 0 ; i<pokers.size() ; i++){
            System.out.print(pokers.get(i));
            if(i%10==9){
                System.out.println();
            }
        }    
    }


    private static void shufflePoker(LinkedList pokers) {
        Random random = new Random();
        for(int i = 0;i < 100;i++) {
            int index1 = random.nextInt(pokers.size());
            int index2 = random.nextInt(pokers.size());
            //pokers.set(index1, pokers.get(index2));
            //pokers.set(index2, pokers.get(index1));
            Poker poker1 = (Poker) pokers.get(index1);
            Poker poker2 = (Poker) pokers.get(index2);
            pokers.set(index1, poker2);
            pokers.set(index2, poker1);
        }    
    }


    private static LinkedList createPokers() {
        String[] colors = {"黑桃","红桃","梅花","方块"};
        String[] numbers = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        LinkedList list = new LinkedList();
        for(int i = 0 ; i < colors.length ; i++){
            for(int j = 0 ; j<numbers.length ; j++){
                list.add(new Poker(colors[i], numbers[j]));
            }
        }
        return list;
    }
    
}

题目:用集合按年龄排序,排序方法(直接排序)

import java.util.*;

class Person{
    
    String name;
    int age;

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    @Override 
    public String toString() {
        return "{ 名字("+ this.name+" ),年龄("+ this.age+")}";
    }
}


public class Demo2 {

    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.add(new Person("李杰", 21));
        list.add(new Person("李英", 18));
        list.add(new Person("李汉三", 8));    
        paixu(list);    
    }

    private static void paixu(LinkedList list) {
        for(int i= 0 ; i<list.size() -1 ; i++){
            for(int j = i+1 ; j<list.size() ; j++){
                Person p1 = (Person) list.get(i);
                Person p2 = (Person) list.get(j);
                if(p1.age>p2.age){
                    list.set(i, p2);
                    list.set(j, p1);    
                }
            }
        }
        System.out.println(list);
    }    
}

Vector :底层也是维护了一个Object的数组实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低。

笔试题: 说出ArrayLsit与Vector的区别?

  相同点: ArrayList与Vector底层都是使用了Object数组实现的。
    不同点:
      1. ArrayList是线程不同步的,操作效率高。
         Vector是线程同步的,操作效率低。
      2. ArrayList是JDK1.2出现,Vector是jdk1.0的时候出现的。

 

package cn.itcast.list;

import java.util.*;
public class Demo1 {
    public static void main(String[] args) {
        Vector v  =  new Vector();
        v.addElement("李英");
        v.addElement("李杰");
        v.addElement("李汉三");
        Enumeration e = v.elements(); //获取迭代器
        while(e.hasMoreElements()){
            System.out.println(e.nextElement());
        }    
    }
}

 Set接口:实现了Set接口的集合类,具备的特点: 无序,不可重复。

因为不可重复的特点所以没有添加成功。

hashSet的实现原理:
   Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 ,
   然后通过元素的哈希值经过移位等运算,就可以算出该元素在哈希表中的存储位置。


 算出该元素在哈希表中的存储位置后
   情况1: 如果算出元素存储的位置目前没有任何元素存储,那么该元素可以直接存储到该位置上。

   情况2: 如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法与该位置的元素再比较一次
       ,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,

      如果equals方法返回的是false,那么该元素运行添加(元素能够在判断不一致后还可以添加主要是因为哈希表的一个存储位置存的是一个数组空间,就像二维数组一样)
 
 

import java.util.HashSet;
import javax.print.attribute.HashAttributeSet;

class Person1{
    int id;
    String name;

    public Person1(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "{ 编号:"+ this.id+" 姓名:"+ this.name+"}";
    }
    
    @Override
    public int hashCode() {
        return this.id;
    }
    
    @Override
    public boolean equals(Object obj) {
        Person1 p = (Person1)obj;
        return this.id==p.id;
    }    
}

public class Demo4 {
    
    public static void main(String[] args) {
        HashSet set = new HashSet();
        set.add(new Person1(110,"李杰"));
        set.add(new Person1(220,"李英"));
        set.add(new Person1(330,"李汉三"));
        System.out.println("添加成功吗?"+set.add(new Person1(110,"李杰")));
        System.out.println("集合的元素:"+set);    
    }
}

这个代码中HashCode调用了4次,equals调用一次,因为重写两个方法后,只有当HashCode返回值相同时才会调用equals

 

 

登陆程序窗口重做

 

import java.util.ArrayList;
import java.util.Collection;

public class windows {
    static Collection <databaseku> collection = new ArrayList();
    
    public static void main(String[] args) {
        new loginWindows();
    }
}
import java.awt.*;
import javax.swing.*;
import java.awt.Event.*;
import java.awt.event.ActionListener;

public class loginWindows extends JFrame {
    static JTextField accountjt = new JTextField(10);
    JPasswordField passwordjt = new JPasswordField(10);
     
    JLabel accountjl = new JLabel("用户名:");
    JLabel passwordjl = new JLabel("密    码:");
    
    JButton loginjb = new JButton("登陆");
    JButton signjb = new JButton("注册");
    
    messageListener listener = new messageListener();
    
    public loginWindows() {
        setBounds(100,100,400,250);
        setVisible(true);
        setTitle("QQ_Design_by_杰");
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        init();
    }

    private void init() {
        setLayout(null); 
        Container con=getContentPane();
          
        accountjl.setBounds(70,15,100,60);  
        accountjt.setBounds(135,30,150,25);  

        passwordjl.setBounds(70,50,100,60);  
        passwordjt.setBounds(135,65,150,25);  

        loginjb.setBounds(100,130,70,35);   
        signjb.setBounds(200,130,70,35);  
 
        con.add(accountjl);  
        con.add(accountjt);  
        con.add(passwordjl);  
        con.add(passwordjt);  
        con.add(loginjb);  
        con.add(signjb);
     
        loginjb.addActionListener(listener);
        signjb.addActionListener(listener);
    }        
}
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import javax.swing.*;
import javax.swing.JOptionPane;

class databaseku {
    String account;  
     String password;  

    public String getaccount() {
        return account;
    }

    public void setaccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public databaseku(String account, String password) {
        this.account = account;
        this.password = password;
    }
    
    @Override
    public boolean equals(Object obj) {
        databaseku user = (databaseku)obj;
        return this.account == user.account;
    }

    public String toString() {
        return "{ 账号:"+this.account+" 密码:"+this.password+"}";
    }

    
    public void setAccount(String account) {
        this.account = account;
    }
}

public class messageListener  implements  ActionListener{

    public void actionPerformed(ActionEvent e) {
        // TODO 自动生成的方法存根    
        databaseku value=null;
        Iterator it=windows.collection.iterator();
        String account0 = loginWindows.accountjt.getText();
         String password0 = loginWindows.accountjt.getText();
        String buttonName = e.getActionCommand();    
        
             if(buttonName.equals("登陆")){
                while(it.hasNext()) {
                    value=(databaseku)it.next();    
                    if(value.getaccount().equals(account0) && value.getPassword().equals(password0)) {
                        JOptionPane.showMessageDialog(null, "欢迎登陆...");
                    }
                    else{
                        JOptionPane.showMessageDialog(null, "用户名或者密码错误或者该用户不存在,登陆失败...");
                    }
                }
             }
             if(buttonName.equals("注册")){
                boolean flag=true;
                while(it.hasNext()){
                    value=(databaseku)it.next();
                    if(windows.collection.contains(value)){
                        flag=false;
                        break;
                    }    
                }if(flag==false){
                    JOptionPane.showMessageDialog(null, "该账号已经存在,请重新输入账号");
                }else{
                    windows.collection.add(new databaseku(account0, password0));
                    JOptionPane.showMessageDialog(null, "注册成功!");
                    JOptionPane.showMessageDialog(null, "当前注册的人员:"+windows.collection);
                }    
             }
    }
}

 




 

 

 

转载于:https://www.cnblogs.com/JYDesigner/p/9350331.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值