如不了解集合与数组的区别可以点击链接查看Java集合与数组的区别
首先通过查看集合类的关系图来讲解常用的集合类
1.Collection类 :
Collection类:单列集合的根接口,提供了一些操作集合的基本方法,有两个重要的子接口List和Set。
-
List类: 继承了Collection接口,是单列集合的一个重要分支,其中集合中的元素有序,可出现重复元素。
- ArrayList和LinkedList都是List的子类在用法上没有区别,但是在功能上还是有区别的。LinkedList集合采用双链表结构来存储数据,所以经常用在增删操作较多而查询操作很少的情况下,ArrayList则相反。
类名 | 底层数据结构 | 线程是否安全 | 效率 |
---|---|---|---|
Vector | 动态的数组结构 | 线程安全 | 无论增删还是查询都非常慢(现在基本不用) |
ArrayList | 动态的数组结构 | 线程不安全 | 增删的效率很慢(因为要移动数据),但是随机查询的效率很高。 |
LinkedList | 链表数据结构 | 线程不安全 | 对元素的增删的操作效率很高,随机查询的效率低(因为要移动指针寻址) |
- Set类:Set里存放的对象是无序,不能重复的,没下标 插入的顺序跟遍历的顺序是不一样的。
- HashSet集合(掌握):A:底层数据结构是哈希表(是一个元素为链表的数组)
B:哈希表底层依赖两个方法:hashCode()和equals()
执行顺序:
首先比较哈希值是否相同
相同:继续执行equals()方法
返回true:元素重复了,不添加
返回false:直接把元素添加到集合
不同:就直接把元素添加到集合
C:如何保证元素唯一性的呢?
由hashCode()和equals()保证的
D:开发的时候,代码非常的简单,自动生成即可。
E:HashSet存储字符串并遍历
F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素) - TreeSet集合
A:底层数据结构是红黑树(是一个自平衡的二叉树)
B:保证元素的排序方式
a:自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
b:比较器排序(集合具备比较性)
让集合构造方法接收Comparator的实现类对象
C:把我们讲过的代码看一遍即可 - 案例:
A:l编写一个程序,获取10个1至20的随机数,要求随机数不能重复。
B:l键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台
- HashSet集合(掌握):A:底层数据结构是哈希表(是一个元素为链表的数组)
A
package com.miaoxiake.day03.collection;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set numbers=new HashSet<>();
Random random=new Random();
//获取10个无重复的随机数
while (numbers.size()<10) {
numbers.add(random.nextInt(20)+1);
}
//输出集合
System.out.println(numbers.toString());
}
}
B
public class Student {
private String name;
private double chineseScore;
private double mathScore;
private double englishScore;
}
首先创建Student类将(姓名,语文分数,数学分数,英语分数)属性封装,然后创建get和set,toString等方法,其中如果要计算计较总分还要实现Comparable接口重写compareTo方法
@Override
public int compareTo(Object o) {//返回一个负整数,零或正整数,因为该对象小于,等于或大于指定对象。
Student student=(Student) o;
double sumObj=student.chineseScore+student.mathScore+student.englishScore;//计算添加对象的总分数
double sumThis=this.chineseScore+this.mathScore+this.englishScore;//计算本对象的总分数
if(sumObj-sumThis>0) {//如果比此对象大就往右移
return 1;
}else if (sumObj-sumThis==0&&student.getName().equals(this.getName())) {//成绩相同时判断是否姓名相同
return 0;
}
return -1;
}
最后编写测试类如图
测试结果
B测试题下载地址 集合练习题B
2. Map类:
(1)将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
(2)Map和Collection的区别?
A:Map 存储的是键值对形式的元素,键唯一,值可以重复。夫妻对
B:Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复。
(4)Map集合的遍历
A:键找值
a:获取所有键的集合
b:遍历键的集合,得到每一个键
c:根据键到集合中去找值
B:键值对对象找键和值
a:获取所有的键值对对象的集合
b:遍历键值对对象的集合,获取每一个键值对对象
c:根据键值对对象
目录