Java集合
概念
概念:
Java中的集合是工具类,可以存储任意数量的具有共同属性的对象,注意与数组的区别
数组和集合的区别:
- 数组的长度是固定的且只能存储一种数据类型;集合的长度是动态扩展的可以存储多种数据类型(泛型会限制)
- 数组可以存储基本数据类型和引用数据类型,但是集合只能是引用类型
应用场景:
- 无法预测存储数据的数量
- 同时存储具有一对一关系的数据
- 需要进行数据的增删
- 数据的重复问题
体系结构
体系结构两种:Collection 与 Map
Collection (主要存储类的对象)有三个子接口:
- List接口 序列 有序且可重复,主要有ArrayList 和LinkedList 实现类
- Queue接口 队列 有序且可重复,主要有LinkedList 实现类
- Set接口 集 无序不可重复,主要有HashSet 和TreeSet 实现类
- ArrayList 的底层实现是数组,所以在内存中是连续存储的,查询速度快,增加和删除速度慢一些。
- LinkedList 底层是基于双向链表的,增加和删除是速度快,查询的速度慢。
- HashSet 是通过哈希表实现的,数据元素可以是null,但是只能有一个null
- TreeSet 是基于二叉树实现的,可以实现数据的自动排序,不允许放空值
Map(存储键值对的数据)有:
- 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());
}
}
}