目录
1、Queue-先进先出(FIFO)
队列是一种接口,不特殊说明即为单向队列(Queue)
方法:
2、Deque双向队列
双向队列是Queue的子接口,对队列中元素的操作可以在队首或队尾执行,一般使用ArrayDeque类实现Deque。
方法:
3、LinkedList
LinkedList数据结构为双向链表,由多个存储在不同位置的节点(元素)组成,每个节点分为三部分:前驱(引用)— 数据—后继(引用)
内部使用方法与ArrayList基本一致。也有额外的方法,因为同时实现了Deque(双队列)接口
4、LinkedList与ArrayList的区别
- ArrayList内部是动态数组结构,LinkedList是双向链表结构
- ArrayList插入和移除数据时需要转移数据的位置,不适合做插入和删除;依据索引查找数据,适合做查询。LinkedList插入和移除时直接操作当前数据的前驱和后继就可以,适合做插入和删除;没有索引不适合做查询。
5、HashSet
HashSet—集(和),与List类似,也可以存储各种类型的数据,但是元素不能重复,而且无序(不同于添加顺序),其内部结构与HashMap完全一致,顺序是按 元素的hashCode值对容量的余数 排序的。
构造方法
常用方法
6、TreeSet
SortedSet接口的子类,可以按照元素的自然顺序排序的集合,内部以树的结构存储数据
- TreeSet的泛型必须实现Comparable接口,否则报错
java.lang.ClassCastException: xxx cannot be cast to java.lang.Comparable
构造方法
方法(相对于Set方法的扩展)
7、Map(映射)
java.util.Map是一个接口(jdk1.2版本),替换掉了原来的Dictionary(jdk1.0版本)抽象类
Map也是一种集合,但是元素的内容必须是以键值对(key-value)形式出现
Map中不能包含重复的key 比如:人的信息不能有两个姓名,两个年龄
Map中的每个key最多只能对应一个value值
常用方法
JDK1.8版本之后的新方法
内部接口Entry
一个Entry(记录)表示一个键值对元素
常用方法
8、HashMap
Hash—“散列”,尽可能地让数据分散存储
HashMap—动态数组+链表+红黑树的数据结构
HashMap原理
1、使用数组结构(默认容量16)存储元素,通过计算key的hashCode值对桶数取余,余数决定此元素所在位置
2、由于不同的key,hashCode值可能相同(取余结果相同);key相同,hashcode值一定相同的规则:如果新元素的key的hashCode值与原数组中的key的hashCode值一样,就产生了哈希冲突。解决哈希冲突的方式是在数组的同一个位置以链表的形式向下链接新元素。3、如果在哈希冲突的基础上,key的内容还相同,此时新元素value会覆盖原元素的value值(根据方法调用)
4、如果链表上的元素个数达到了8个,此时数据结构就变成了红黑树,如果元素减少到 6个,恢复链表结构
流程图
9、HashTable
HashTable是早期版本的HashMap,继承Dictionary类。
HashTable是线程安全的
HashMap是线程不安全的(可以通过Collections.synchronizedMap(new HashMap<>());实现线程
安全
HashMap支持key和value都为null,HashTable不支持
10、TreeMap
继承了SortedMap,所以可以按照key进行排序,树数据结构存储数据
相对于Map多出来的方法
1.higherKey()/lowerKey()
2. higherEntry()/lowerEntry()
3. firstKey()/lastKey()
4. firstEntry()/lastEntry()
5. floorKey()/ceilingKey()
6. floorEntry()/ceilingEntry()
7. headMap(key[,boolean])
8. tailMap(key[,boolean])
9. subMap(key[,boolean])
10. pollFirstEntry()/pollLastEntry()
练习
有如下Student 对象
其中,classNum 表示学生的班号,例如“class05”。
有如下List
List list = new ArrayList();
list.add(new Student(“Tom”, 18, 100, “class05”));
list.add(new Student(“Jerry”, 22, 70, “class04”));
list.add(new Student(“Owen”, 25, 90, “class05”));
list.add(new Student(“Jim”, 30,80 , “class05”));
list.add(new Student(“Steve”, 28, 66, “class06”));
list.add(new Student(“Kevin”, 24, 100, “class04”));
在这个list 的基础上,完成下列要求:1) 计算所有学生的平均年龄 2) 计算各个班级的平均分
package com.exercise;
import java.util.ArrayList;
import java.util.List;
public class Student {
private String name; //姓名
private int age; //年龄
private int score; //成绩
private String classNum; //班级
public Student(String name, int age, int score, String classNum) {
this.name = name;
this.age = age;
this.score = score;
this.classNum = classNum;
}
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;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public String getClassNum() {
return classNum;
}
public void setClassNum(String classNum) {
this.classNum = classNum;
}
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student("Tom", 18, 100, "class05"));
list.add(new Student("Jerry", 22, 70, "class04"));
list.add(new Student("Owen", 25, 90, "class05"));
list.add(new Student("Jim", 30, 80, "class05"));
list.add(new Student("Steve", 28, 66, "class06"));
list.add(new Student("Kevin", 24, 100, "class04"));
double avgAge=0;
for (Student student : list) {
avgAge += student.getAge();
}
avgAge /= list.size();
System.out.println("所有学生的平均年龄:" + avgAge);
double avgScore05=0,avgScore04=0,avgScore06=0;
int count05 = 0, count04 = 0, count06 = 0;
for (Student student : list) {
if (student.getClassNum().equals("class05")) {
avgScore05 += student.getScore();
count05++;
} else if (student.getClassNum().equals("class04")) {
avgScore04 += student.getScore();
count04++;
} else if (student.getClassNum().equals("class06")) {
avgScore06 += student.getScore();
count06++;
}
}
System.out.println("class05的平均成绩:" + avgScore05 / count05+"\nclass04的平均成绩:"+avgScore04/count04+"\nclass06的平均成绩:"+avgScore06/count06);
}
}