java中的集合
首先我们需要了解什么是集合?
简称集,主要就是用于存储多个元素的容器
集合和数组的区别
元素类型:
集合:引用类型(存储基本类型自动装箱)
数组:基本类型和引用类型
元素个数:
集合:不固定,可任意扩容
数组:固定,不能改变容量
集合的好处:不受容器大小限制,可以随时添加,删除元素,提供了大量操作元素的方法(判断,获取等)
java的集合体系
单列集合(Collection(单列集合的顶级接口))
List:因为是接口,要直接调用需要用子类进行调用,ArrayList
Set(接口): :HashSet(子类)
双列集合(Map:key,value)
Map:HashMap
如图:
List集合的特点
特点:
可重复,有序(存取顺序相同)
应用:
List list = new ArrayList(); :父接口指向子接口(多态)
案例:
需求:向List集合中添加三个元素,并遍历打印
分析:
A:向集合中添加元素的方法为:add()
B:遍历集合的方式:for
C:获取集合中元素个数的方式:size()
步骤:
1.创建集合对象
List list = new ArrayList();
2.分别创建三个Student(学生)对象
3.使用add方法将Student对象添加到集合中
4.使用for循环遍历集合并打印
代码:
package dome7; public class Student { //学生类 private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
测试类:
package dome7; import java.util.ArrayList; import java.util.List; public class Test { //测试类 public static void main(String[] args) { //创建集合对象 List list = new ArrayList(); //创建学生对象 Student stu = new Student("乔峰",19); Student stu1 = new Student("虚竹",18); Student stu2 = new Student("段誉",199); //添加到集合中 list.add(stu); list.add(stu); list.add(stu); System.out.println(list); //集合的大小 System.out.println(list.size()); //循环打印集合 for (int i = 0; i <list.size() ; i++) { //get(索引):获取到集合中指定的元素 System.out.println(list.get(i)); } } }
输出结果:
[Student{name='乔峰', age=19}, Student{name='乔峰', age=19}, Student{name='乔峰', age=19}] 3 Student{name='乔峰', age=19} Student{name='乔峰', age=19} Student{name='乔峰', age=19}
Set集合
set集合是接口,使用时需要通过子类实例化:Set<t> 变量 = new HashSet<>()
特点:无序(元素的存取顺序不一样),唯一
注意:Set集合保证元素的唯一性主要依赖与:equals(),hashCode()两个方法,要使用,需要在子类中重
写,不然就默认调用的是Object对象。
Map集合
Map集合时接口,使用时需要通过子类实例化:Map<T1,T2> map = new HashMap<>();
特点:双列集合,元素由键值段(Entry)构成:key = value(key不可以重复,value可以重复)
常见的元素对象:
V put(Key,Value) :添加元素(键值段的形式)需要注意的是在元素第一次添加,会返回null,而重复添加,会用新值
覆盖旧值,并返回旧值
V get(object Key): 根据键获取其对应的值
Set<K> keySet(): 获取所有键,并转换成set集合
栗子:
package dome7; import java.util.*; public class sljh { //需求:向map集合中添加三个学生类 //分析 public static void main(String[] args) { //创建集合对象 //值 :学生的编号 //键:具体的学生对象 Map<Integer,student> map = new HashMap<>(); //创建学生对象 student s1 = new student(19,"刘备"); student s2 = new student(19,"张飞"); student s3 = new student(19,"关羽"); //将元素添加到集合中,键是唯一 student a = map.put(1,s1); //添加到集合中,键是唯一 student b = map.put(2,s2); student c = map.put(3,s3); System.out.println(a); //第一次添加a为null System.out.println(b); // System.out.println(map); //根据键获取其对应的值 System.out.println(map.get(1)); //遍历集合 //遍历步骤 //1.获取所有键的集合 keySet() //2.遍历所有的键,获取到每一个值 迭代器/增强for //3.根据键,获取指定的值 //获取所有键的集合,因为键只能是唯一,所以用Set Set<Integer> keys = map.keySet(); //创建迭代器对象 Iterator<Integer> it = keys.iterator(); while(it.hasNext()){ //判断迭代器中是否有元素 Integer key = it.next(); //获取迭代器中的元素 student value = map.get(key); //根据键获取值 System.out.println("key:"+ key +"....value:"+value); } } } //学生类 class student{ private int age; private String name; public student() { } public student(int age, String name) { this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "student{" + "age=" + age + ", name='" + name + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; student student = (student) o; return age == student.age && name.equals(student.name); } @Override public int hashCode() { return Objects.hash(age, name); } }