Java集合

Java集合

概念

概念:

	Java中的集合是工具类,可以存储任意数量的具有共同属性的对象,注意与数组的区别

数组和集合的区别:

  1. 数组的长度是固定的且只能存储一种数据类型;集合的长度是动态扩展的可以存储多种数据类型(泛型会限制)
  2. 数组可以存储基本数据类型和引用数据类型,但是集合只能是引用类型

应用场景:

  1. 无法预测存储数据的数量
  2. 同时存储具有一对一关系的数据
  3. 需要进行数据的增删
  4. 数据的重复问题

体系结构

体系结构两种:Collection 与 Map
Collection (主要存储类的对象)有三个子接口:

  1. List接口 序列 有序且可重复,主要有ArrayList 和LinkedList 实现类
  2. Queue接口 队列 有序且可重复,主要有LinkedList 实现类
  3. Set接口 集 无序不可重复,主要有HashSet 和TreeSet 实现类
  • ArrayList 的底层实现是数组,所以在内存中是连续存储的,查询速度快,增加和删除速度慢一些。
  • LinkedList 底层是基于双向链表的,增加和删除是速度快,查询的速度慢。
  • HashSet 是通过哈希表实现的,数据元素可以是null,但是只能有一个null
  • TreeSet 是基于二叉树实现的,可以实现数据的自动排序,不允许放空值

Map(存储键值对的数据)有:

  1. HashMap 和TreeMap 实现类,存储的是键值对<Key,Value>
  • HashMap 基于哈希表实现,适用于在Map中插入、删除和定位元素
  • TreeMap 基于红黑树实现,适用于自然排序和自定义顺序遍历

实际应用

在List中存储并操作字符串信息

package com.project.set;

import java.util.ArrayList;
import java.util.List;

public class ListDemo1 {
	public static void main(String[] args) {
		//用ArrayList存储编程语言的名称,并输出
		List list=new ArrayList();
		list.add("Java");
		list.add("C");
		list.add("C++");
		list.add("Go");
		list.add("swift");
		//输出列表中元素的个数
		System.out.println("列表中元素的个数为:"+list.size());
		
		//遍历输出所有编程语言
		System.out.println("________________________________________");
		for(int i=0;i<list.size();i++) {
			System.out.print(list.get(i)+" ");
		}
		//移除列表中的C++
		System.out.println();
//		list.remove(2);
		list.remove("C++");
		System.out.println("________________________________________");

		System.out.print("移除C++以后的列表元素为:");
		for(int i=0;i<list.size();i++) {
			System.out.print(list.get(i)+" ");
		}
	}
}

在这里插入图片描述

例题一:使用集合ArrayList对字符串进行存储和管理

import java.util.ArrayList;
import java.util.List;
//使用集合ArrayList对字符串进行存储和管理
public class ListDemo1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List list=new ArrayList();
		list.add("语文");
		list.add("数学");
		list.add("英语");
		list.add("化学");
		list.add("物理");
		list.add("生物");
		System.out.println("列表中元素的个数为:"+list.size());
		for(int i=0;i<list.size();i++) {
			System.out.println("第"+(i+1)+"个为"+list.get(i));
		}
	}

}

在这里插入图片描述

例题二:定义一个员工信息类Employee,使用ArrayList对员工信息进行添加和显示

public class Employee {
	private int id;
	private String name;
	private double salary;
	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;
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public Employee() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Employee(int id, String name, double salary) {
		super();
		this.id = id;
		this.name = name;
		this.salary = salary;
	}
	
}
public class EmployeeTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Employee ey1=new Employee(1,"张三",5000.0);
		Employee ey2=new Employee(2,"李四",5500.0);
		Employee ey3=new Employee(3,"赵六",4000.0);
		ArrayList al=new ArrayList();
		al.add(ey1);
		al.add(ey2);
		al.add(ey3);
		System.out.println("员工姓名"+"			员工薪资");
		for(int i=0;i<al.size();i++) {
			System.out.println(((Employee)(al.get(i))).getName()+"				"+((Employee)(al.get(i)) ).getSalary());
		}
		
	}

}

在这里插入图片描述
hashCode 和 equals 方法的使用

HashSet中是不允许添加重复元素的,但是在自定义的类对象判断时,会发现能传入对象名不同的相同对象值的问题,所以引入hashCode 和equals 方法

hashCode()方法用于给对象返回hashCode值,equals()方法用于判断其他对象与该对象是否相等,需要在自定类中重写hashCode() 和equals() ,如果不重写默认每一个对象的hashCode()值都不一样

例题一:HashSet对类对象进行管理

package com.project.practice;

public class Student {
	private int stuld;
	private String name;
	private float score;
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(int stuld, String name, float score) {
		super();
		this.stuld = stuld;
		this.name = name;
		this.score = score;
	}
	public int getStuld() {
		return stuld;
	}
	public void setStuld(int stuld) {
		this.stuld = stuld;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public float getScore() {
		return score;
	}
	public void setScore(float score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "[学号:" + stuld + ", 姓名:" + name + ", 成绩:" + score + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + Float.floatToIntBits(score);
		result = prime * result + stuld;
		return result;
	}
	
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
		return true;
		if(obj.getClass()==Student.class) {
			Student st=(Student)obj;
			return st.getName().equals(name) && (st.getStuld()==stuld);
		}
		return false;
	}
	
	
}

package com.project.practice;

import java.util.HashSet;
import java.util.Iterator;

public class StudentTest {

	public static void main(String[] args) {
		//定义三个student类的对象及一个hashSet类对象
		Student s1=new Student(1,"Tom",87.0f) ;
		Student s2=new Student(2,"Lucy",95.0f) ;
		Student s3=new Student(3,"William",65.0f) ;
		HashSet set=new HashSet();
		//将Student类的对象添加到集合中
		set.add(s1);
		set.add(s2);
		set.add(s3);
		//使用迭代器显示Student类的对象中的内容
		Iterator it=set.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		//添加一个重复数据到Set中,观察输出结果
		Student s4=new Student(3,"William",65.0f) ;
		set.add(s4);
		System.out.println("");
		it=set.iterator();//因为上面已经遍历过,所以重新开始一次
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
		
	}

}

在这里插入图片描述
例题二:HashSet对类对象进行管理

package com.project.set;

public class Cat {
	private String name;
	private int month;
	private String species;
	
	
	public Cat(String name, int month, String species) {
		super();
		this.name = name;
		this.month = month;
		this.species = species;
	}
	
	public Cat() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getMonth() {
		return month;
	}
	public void setMonth(int month) {
		this.month = month;
	}
	public String getSpecies() {
		return species;
	}
	public void setSpecies(String species) {
		this.species = species;
	}

	@Override
	public String toString() {
		return " [姓名:" + name + ", 年龄:" + month + ", 品种:" + species + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + month;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + ((species == null) ? 0 : species.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		//判断对象是否相等,相等则返回true,不用继续比较属性了
		if(obj==this)
		return true;
		//判断obj是否是Cat类的对象
		if(obj.getClass()==Cat.class) {
			Cat cat=(Cat)obj;
			return cat.getName().equals(name) && (cat.getMonth()==month )&& cat.getSpecies().equals(species); 
		}
		return false;
	}

}

package com.project.set;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class CatTest {

	public static void main(String[] args) {
		// 定义宠物猫的对象
		Cat huahua= new Cat("花花",12,"英国短毛猫");
		Cat fanfan=new Cat("凡凡",3,"中华田园猫");
		//将宠物猫对象放入HashSet中
		Set<Cat> set=new HashSet<Cat>();
		set.add(huahua);
		set.add(fanfan);
		//显示宠物信息
		Iterator<Cat> it=set.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
		//再添加一个与花花属性一样的猫
		Cat huahua01=new Cat("花花",12,"英国短毛猫");
		set.add(huahua01);
		System.out.println("************************************");
		System.out.println("添加重复数据后的宠物猫信息:");
		it=set.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
		//重新添加一个新的宠物猫
		Cat huahua02=new Cat("花花二代",2,"英国短毛猫");
		set.add(huahua02);
		System.out.println("添加花花二代后的宠物猫信息");
		it=set.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
		
		System.out.println("************************************");
		//在集合中查找花花的信息并输出
		if(set.contains(huahua)) {
			System.out.println("花花找到了");
			System.out.println(huahua);
			
		}else
		System.out.println("花花没找到");
		
		//集合中使用名字查找花花的信息
		Cat c=null;
		boolean flag=false;
		it=set.iterator();
		while(it.hasNext()) {
			c=it.next();
			if(c.getName().equals("花花")) {
				flag=true;
				break;
			}
		}
		if(flag) {
			System.out.println("花花找到了");
			System.out.println(c);
		}else {
			System.out.println("花花没找到");
		}
		
		//删除花花二代的信息并重新输出
		for(Cat cat:set ) {
			if("花花二代".equals(cat.getName()))
				set.remove(cat);
		}
		System.out.println("************************************");
		System.out.println("删除花花二代后的数据");
		for(Cat cat:set)
			System.out.println(cat);
		
		//删除集合中的所有宠物猫信息
		System.out.println("************************************");
		boolean flag1=set.removeAll(set);
		if(set.isEmpty()) {//flag1
			System.out.println("猫都不见了");
		}else {
			System.out.println("猫还在");
		}	
	}

}

在这里插入图片描述
例题一:使用HashMap在字典中添加内容并显示

package com.project.set;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

public class DictionaryDemo {
	public static void main(String[] args){
		Map<String,String>animal=new HashMap<String,String>();
		System.out.println("请输入三组单词对应的注释,并存放到HashMap中");
		Scanner sc=new Scanner(System.in);
		//添加数组
		int i=0;
		while(i<3) {
			System.out.println("请输入key值(单词):");
			String key=sc.next();
			System.out.println("请输入value值(注释)");
			String value=sc.next();
			animal.put(key, value);
			i++;
		}
		//打印输出value的值(直接使用迭代器)
		System.out.println("*****************************************");
		System.out.println("使用迭代器输出所有的value");
		Iterator<String> it=animal.values().iterator();
		while(it.hasNext()) {
			System.out.print(it.next()+" ");
		}
		System.out.println();
		System.out.println("*****************************************");
		//打印输出key和value的值
		//通过entrySet方法
		System.out.println("通过entrySet方法得到key-value:");
		Set <Entry<String,String>>entrySet=animal.entrySet();
		for(Entry<String,String> entry:entrySet) {
			System.out.print(entry.getKey()+"-");
			System.out.println(entry.getValue());
		}
		
		//通过单词找到注释并输出
		//使用keySet方法
		System.out.println("请输入要查找的单词:");
		String s=sc.next();
		Set<String> keySet=animal.keySet();
		for(String key:keySet) {
			if(s.equals(key)) {
				System.out.println("找到了!"+"键值对为:"+key+"-"+animal.get(key));
				break;
			}
		}
	}


}

在这里插入图片描述
例题二:HashMap 商品管理

package com.project.set;

public class Goods {
	private String id;
	private String name;
	private double price;
	
	
	public Goods(String id, String name, double price) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
	}
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public String toString() {
		return "商品编号:"+id+",商品名称:"+name+",商品价格:"+price;
	}
}

package com.project.set;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;

public class GoodsTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		Map<String,Goods>goodsMap=new HashMap<String,Goods>();
		System.out.println("请输入三条商品信息:");
		int i=0;
		while(i<3) {
			System.out.println("请输入第"+(i+1)+"条商品信息:");
			System.out.println("请输入商品编号:");
			String goodsId=sc.next();
			//判断商品编号id是否存在
			if(goodsMap.containsKey(goodsId)) {
				System.out.println("该商品编号已经存在!请重新输入!");
				continue;
			}
			
			System.out.println("请输入商品名称:");
			String goodsName=sc.next();
			System.out.println("请输入商品价格:");
			double goodsPrice=0;
			try {
			goodsPrice=sc.nextDouble();
			}catch(java.util.InputMismatchException e) {
				System.out.println("商品价格的格式不正确,请输入数值型数据!");
				sc.next();
				continue;
			}
			Goods goods=new Goods(goodsId,goodsName,goodsPrice);
			//将商品信息添加到HashMap中
			goodsMap.put(goodsId, goods);
			i++;
			
		}
		//遍历Map,输出商品信息
		System.out.println("商品的全部信息为:");
		Iterator<Goods>itGoods=goodsMap.values().iterator();
		while(itGoods.hasNext()) {
			System.out.println(itGoods.next());
		}
	}

}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值