javase集合

集合框架简介

1.集合框架是一个用来代表和操纵集合的统一架构。
2.组成
	1).接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
	2).实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。		
	3).算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

在这里插入图片描述
在这里插入图片描述

collection

在这里插入图片描述

1.list:允许集合内存在重复值,有序、可以添加多个null值 (所以只要添加元素即为true)
	1) arrayList:相当于一个自增的数组,查询快、增删改慢
		a) 常用方法

在这里插入图片描述
在这里插入图片描述

		b) 案例:模仿数据库(用户登陆、注册、修改 )
public class User {

	private int uid;
	private String username;
	private String password;
	private String tel;

	public User() {
	}

	public User(int uid, String username, String password, String tel) {
		super();
		this.uid = uid;
		this.username = username;
		this.password = password;
		this.tel = tel;
	}

	@Override
	public String toString() {
		return "User [uid=" + uid + ", username=" + username + ", password=" + password + ", tel=" + tel + "]";
	}

	public int getUid() {
		return uid;
	}

	public void setUid(int uid) {
		this.uid = uid;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

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

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}
}


public class UserDao {

	//	用集合List模拟整个数据源
	private static List<User> datas = new ArrayList<>() ;
	
	static {
		datas.add(new User(1, "zhangsan", "888888", "13333333"));
		datas.add(new User(2, "lisi", "888888", "13333333"));
		datas.add(new User(3, "wangwu", "888888", "13333333"));
	}
	
	/**
	 * 模拟一个用户注册功能,将给定的用户对象存入datas数据源
	 * @param u
	 * @return
	 */
	public boolean registry(User u) {
		
		if(datas.add(u)) {
			return true;
		}
		
		return false;
	}
	
	/**
	 * 查询目前数据源中的所有用户的信息
	 * @return
	 */
	public List<User> getAllUsers(){
		return datas;
	}

	
	/**
	 * 判断用户是否登录成功
	 * @param username:用户的用户名
	 * @param password:用户的密码
	 * @return true代表登录成功,否则false
	 */
	public boolean login(String username, String password) {
		
		for (User u : datas) {
			if(username.equals(u.getUsername()) && password.equals(u.getPassword())) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		new UserDao().remove();
	}

	/**
	 * 删除的两种方法
	 */
	public void remove() {
		System.out.println(datas);
		datas.remove(0);
		System.out.println(datas);
		System.out.println("=========");
		System.out.println(datas);
		datas.remove(0);
		System.out.println(datas);
		System.out.println("=========");
		System.out.println(datas);
		datas.remove(datas.get(0));
		System.out.println(datas);
	}

	/**
	 * 修改
	 * @param pass
	 */
	public void update(String pass) {
		for (User data : datas) {
			if (!pass.equals(data.getPassword())){
				data.setPassword(pass);
			}
		}
	}
}

public class TestUserDao {

	//	创建UserDao对象
	private static UserDao userDao = new UserDao();
	
	private static Scanner input = new Scanner(System.in);

	public static void main(String[] args) {
		
		while(true) {
			System.out.println("//****************************//");
			System.out.println("//********1. 查询所有用户********//");
			System.out.println("//********2. 注册用户***********//");
			System.out.println("//********3. 用户登录***********//");
			System.out.println("//****************************//");
			
			System.out.println("请输入您要做的操作的编号:");
			int op = input.nextInt();
			
			switch (op) {
				case 1:
					getAllUser();
					break;
				case 2:
					register();
					break;
				case 3:
					login();
					break;
				default:
					break;
			}
		}
		
		//input.close();
	}

	/**
	 * 登陆
	 */
	public static void login() {
		
		System.out.println("请输入用户名:");
		String username = input.next();
		
		System.out.println("请输入密码:");
		String password = input.next();
		
		if(userDao.login(username, password)) {
			System.out.println("您好:欢迎" + username + "进入系统");
			update();
		}else {
			System.out.println("登录失败");
		}
	}

	/**
	 * 查询所有用户
	 */
	public static void getAllUser() {
		List<User> list = userDao.getAllUsers();
		
		if(list == null || list.isEmpty()) {
			System.out.println("\r\n----------------------------");
			System.out.println("------目前还没有用户存在!--------");
			System.out.println("----------------------------\r\n");
			return;
		}
		
		System.out.println("----------------------------");
		for (User u : list) {
			System.out.println(u);
		}
		System.out.println("----------------------------");
	}

	/**
	 * 注册
	 */
	public static void register() {
		
		System.out.println("请输入用户的id");
		int uid = input.nextInt();
		System.out.println("您输入的id是:"+ uid);
		
		System.out.println("请输入用户的用户名");
		String username = input.next();
		System.out.println("您输入的用户名是:"+ username);
		
		System.out.println("请输入用户的密码");
		String password = input.next();
		System.out.println("您输入的密码是:"+ password);
		
		System.out.println("请输入用户的电话");
		String tel = input.next();
		System.out.println("您输入的电话是:"+ tel);
		
		User u = new User(uid, username, password, tel);
		
		//	判断用户的注册结果
		if(userDao.registry(u)) {
			System.out.println("用户注册成功!");
		}else {
			System.out.println("用户注册失败!");
		}
		
		System.out.println(userDao.getAllUsers());
	}

	/**
	 * 修改密码
	 */
	public static void update() {
		System.out.println("是否需要修改信息请输入:yes/no");
		String trg = input.next();
		if ("yes".equals(trg)){
			System.out.println("输入新密码:");
			String pass = input.next();
			userDao.update(pass);
		}else{
			return;
		}
	}
}

	2) linkedList:一个双向链表,增删改快、查询慢
		a) 常用方法

在这里插入图片描述
在这里插入图片描述

		b) 案例
			i.模拟一个队列
public class Stack {
    //定义一个队列
    private LinkedList<String> link ;
    /**定义获取队列中元素方法*/
    public LinkedList<String> getLink(){
        return link;
    }

    public Stack() {
        link = new LinkedList<String>();
    }

    /**
     * 插入元素
     * @param element
     */
    public void insertElement(String element){
        link.add(element);
    }

    /**
     * 删除最后一个元素,FILO
     */
    public void delete(){
        link.removeLast();
    }

    /**
     * 判断队列是否为空
     * @return
     */
    public boolean isEmpty(){
        return link.isEmpty();
    }
}

public class TestStack {
    public static void main(String[] args) {
        Stack stack = new Stack();
        stack.insertElement("k");
        stack.insertElement("i");
        stack.insertElement("l");
        stack.insertElement("l");
        stack.insertElement("e");
        stack.insertElement("r");
        System.out.println(stack.getLink());

        //模拟堆栈 FILO
        while (!stack.isEmpty()){
            stack.delete();
            System.out.println(stack.getLink());
        }
    }
}

在这里插入图片描述

			ii.模拟一个堆栈

在这里插入图片描述
在这里插入图片描述

	3) vactor:线程安全(和arraylist的区别)		
2.set:不允许存在重复值、只能添加一个null值、数据顺序不由程序员控制
	i. 自定义规则:
		1) 利用hashSet方法时考虑重写equals方法在其中再重写hashcode方法(元素去重)
		2) treeSet:实现排序,实现接口Comparable,根据要求重写comparaTo方法
		3)实现以上两种
public class Dept implements Comparable<Dept>{

	private String did;
	private String dname;
	private String loc;

	public Dept() {
	}

	public Dept(String did, String dname, String loc) {
		super();
		this.did = did;
		this.dname = dname;
		this.loc = loc;
	}
	
	/**
	 * 重写该方法,目的是即使是不同的部门对象,调用hashCode()方法后得到的哈希码值一样,
	 * 则被认为是相同的部门对象
	 * 	相同的部门对象不能被重复插入set集合中
	 */
	@Override
	public boolean equals(Object obj) {
		
		Dept dept = (Dept) obj;
		
		return this.hashCode() == dept.hashCode();
	}
	
	/**
	 * 自定义规则,只要不同的两个部门对象的部门编号和部门名称分别相同,
	 * 即使是不同的部门对象,也能保证hashCode()方法的返回值相同
	 * 	只要hashCode的返回值相同,则被认为是相同的对象,不能被重复插入
	 */
	@Override
	public int hashCode() {
		return did.hashCode() + dname.hashCode();
	}

	@Override
	public String toString() {
		return "Dept [did=" + did + ", dname=" + dname + ", loc=" + loc + "]";
	}

	public String getDid() {
		return did;
	}

	public void setDid(String did) {
		this.did = did;
	}

	public String getDname() {
		return dname;
	}

	public void setDname(String dname) {
		this.dname = dname;
	}

	public String getLoc() {
		return loc;
	}

	public void setLoc(String loc) {
		this.loc = loc;
	}

	@Override
	public int compareTo(Dept o) {
		return did.compareTo(o.did);
	}
}


public class TestSet {

	public static void main(String[] args) {
		//去重
		Set<Dept> sets = new HashSet<>();
		
		Dept d1 = new Dept("1", "java", "xian");
		Dept d2 = new Dept("2", "java02", "xian");
		Dept d3 = new Dept("3", "aaa", "xian02");
		Dept d4 = new Dept("4", "zzz", "xian02");
		Dept d5 = new Dept("5", "fff", "xian02");
		Dept d6 = new Dept("6", "bbb", "xian02");
		Dept d7 = new Dept("6", "bbb", "xian02");
		
		System.out.println(d1.equals(d2));
		
		System.out.println(sets.add(d1));
		System.out.println(sets.add(d2));
		System.out.println(sets.add(d3));
		System.out.println(sets.add(d4));
		System.out.println(sets.add(d5));
		System.out.println(sets.add(d6));
		System.out.println(sets.add(d7));
		
		System.out.println(sets);
		
		System.out.println("=============");

		//排序
		Set<Dept> sets2 = new TreeSet<Dept>();
		
		System.out.println(sets2.add(d1));
		System.out.println(sets2.add(d2));
		System.out.println(sets2.add(d3));
		System.out.println(sets2.add(d4));
		System.out.println(sets2.add(d5));
		System.out.println(sets2.add(d6));
		
		System.out.println(sets2);
	}

}


3.list、set联系案例

/**
 *生成0~9的随机数
 */
public class Random02 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        Set<Integer> set = new HashSet<>();

        while (set.size() < 10){
            int num =(int) (Math.random() * 10);
            if (set.add(num)){
                list.add(num);
            }
        }
        System.out.println(list);
    }
}

map

1.简介:
	1).双列集合,键和值,键不能重复,值可以重复,键、值和键值对均可以为null
	2).map的put()方法完成数据的插入,返回值为上次该key对应的value值
		对于返回为null的情况有两种,
			一种是第一次添加该key
			一种是该key上次本身的值就是null
2.常用方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

hashMap和treeMap的比较
public static void main(String[] args) {
		Map<Integer, Object> m = new TreeMap<>();
		
		m.put(1, 1);
		m.put(9527, "zhouxingxing");
		m.put(2, new Object());
		m.put(3, new User(1, "tangsanzang", "999999"));
		
		System.out.println(m);
		
		System.out.println("===========");

		Map<Integer, Object> m2 = new HashMap<>();
		
		m2.put(1, 1);
		m2.put(9527, "zhouxingxing");
		m2.put(2, new Object());
		m2.put(3, new User(1, "tangsanzang", "999999"));
		
		System.out.println(m2);
		System.out.println(m.equals(m2));
		System.out.println("===========");

		//获取指定键的值
		System.out.println(m2.get(1));
		System.out.println(m2.get(3));

		//移除
		System.out.println(m2);
		m2.remove(3);
		System.out.println(m2);
	}
}
3.应用:comparable去实现treemap的自定义排序
public class Emp implements Comparable<Emp> {

	private int eid;
	private String name;
	private double salary;

	public Emp() {
		super();
	}

	public Emp(int eid, String name, double salary) {
		super();
		this.eid = eid;
		this.name = name;
		this.salary = salary;
	}

	@Override
	public String toString() {
		return "Emp [eid=" + eid + ", name=" + name + ", salary=" + salary + "]";
	}

	public int getEid() {
		return eid;
	}

	public void setEid(int eid) {
		this.eid = eid;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	/**
	 * 重写接口Comparable的方法compareTo,实现自定义功能排序
	 * @param o
	 * @return
	 */
	@Override
	public int compareTo(Emp o) {
		return new Integer(o.getEid()).compareTo(new Integer(eid));
		//return o.getName().compareTo(name) ;
		//return new Double(o.getSalary()).compareTo(new Double(salary));

	}
}

public class TestTreemap {

	public static void main(String[] args) {
		Map<String, Emp> map = new TreeMap<>();
		
		Emp e1 = new Emp(1, "sunkongkong", 888888);
		Emp e2 = new Emp(2, "zhubajie", 666666);
		Emp e3 = new Emp(3, "shanseng", 333333);
		Emp e4 = new Emp(4, "tangseng", 100000000);
		
		map.put("齐天大圣", e1);
		map.put("净坛使者", e2);
		map.put("卷帘大将", e3);
		map.put("金蝉子", e4);
		
		System.out.println(map);
		
		System.out.println("----------------");
		
		Map<Emp, String> map2 = new TreeMap<Emp, String>();
		
		map2.put(e1, "齐天大圣");
		map2.put(e2, "净坛使者");
		map2.put(e3, "卷帘大将");
		map2.put(e4, "金蝉子");
		
		System.out.println(map2);
	}

}


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值