Java - 集合
一、集合框架体系(重要!要记住!)
集合主要分为两组:单列集合(存放单个元素),双列集合(存放类似键值对元素)
Collection 接口有两个重要的子接口:List、Set,他们是实现的子类都是单列集合。
Map 接口的实现子类是 双列集合,存放的是键值对
二、Collection 接口
1. Collection接口实现类的特点
2. Collection接口常用方法,以实现子类
3. Collection接口遍历元素方式
(1)使用 Iterator(迭代器)
- 迭代器的执行原理:
- 迭代器接口的方法:
- 示例
package collection_;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionIterator {
@SuppressWarnings({"all"})
public static void main(String[] args) {
Collection col = new ArrayList();
col.add((new Book("三国演义","罗贯中",10.1)));
col.add((new Book("小李飞刀","古龙",5.1)));
col.add((new Book("红楼梦","敬雪晴",34.1)));
System.out.println("col = " + col);
//希望能够遍历 col 集合
//1. 先得到 col 对应的 迭代器
Iterator iterator = col.iterator();
//2. 使用 while 循环遍历
//可以输入 itit 快捷生成 while 语句
//显示所有快捷键的快捷键 ctrl + j
while (iterator.hasNext()) { //判断是否还有数据
// 返回下一个元素,类型是 Object
Object next = iterator.next();
System.out.println("next = " + next);
}
//3. 当退出 while 循环后,这时 iterator 迭代器指向最后的元素
// iterator.next(); // NoSuchElementException
//4. 如果希望再次遍历,需要重置我们的迭代器
iterator = col.iterator();
System.out.println("=====第二次遍历======");
while (iterator.hasNext()) { //判断是否还有数据
// 返回下一个元素,类型是 Object
Object next = iterator.next();
System.out.println("next = " + next);
}
}
}
class Book {
private String name;
private String author;
private double price;
public Book(String name, String author, double price) {
this.name = name;
this.author = author;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
运行结果:
(2)for循环增强
增强 for 底层还是 Iterator 迭代器
Collection col = new ArrayList();
for(Object book : col) {
System.out.println("book = " + book);
}
三、List 接口
1. 接口介绍
2. 接口常用方法
3. List 的三种遍历方式(ArrayList、LinkedList、Vector)
(1)使用 iterator
(2)使用增强for
(3)使用普通for
4. ArrayList 注意事项
(1)ArrayList的底层操作机制源码分析(重点、难点)
- 先说结论:
- 分析使用无参构造器
- 分析使用有参构造器
5. Vector 基本介绍
(1)Vector和ArrayList的比较
6. LinkedList底层结构
(1)LinkedList的全面说明
(2)LinkedList的底层操作机制
(3)ArrayList和LinkedList的比较
四、Set 接口
1. Set 接口基本介绍
2. Set接口的常用方法和遍历方式
3. HashSet
(1)HashSet说明
(2)HashSet底层机制
HaspSet底层是HashMap,HashMap底层是(数组+链表+红黑树)
4. LinkedHashSet
(1)LinkedHashSet的说明
(2)LinkedHashSet底层机制
5. HashSet和TreeSet分别如何去重的?
五、Map接口
1. Map接口实现类的特点(很实用)
2. Map接口的常用方法
3. Map接口的遍历方式
Map map = new HashMap();
map.put("邓超","孙俪");
map.put("王宝强","马蓉");
map.put("宋吉","马蓉");
map.put("aaa",null);
map.put(null,"刘亦菲");
第一组:先取出 所有的Key,通过Key 取出对应的Value
Set keyset = map.keySet();
(1)增强for
//(1) 增强for
for(Object key : keyset){
System.out.println(key + "-" + map.get(key));
}
(2) 迭代器
//(2) 迭代器
Iterator iterator = keyset.iterator();
while (iterator.hasNext()){
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}
第二组:把所有的values取出
Collection values = map.values();
//这里可以使用所有Collection使用的遍历方式
(1)增强for
//(1) 增强for
for (Object value : values){
System.out.println(value);
}
(2)迭代器
//(2) 迭代器
Iterator iterator1 = values.iterator();
while (iterator1.hasNext()) {
Object value = iterator1.next();
System.out.println(value);
}
运行结果:
第三组:通过EntrySet 来获取 k-v
Set entrySet = map.entrySet();
(1)增强for
//(1) 增强for
for (Object entry : entrySet){
//将entry 转成 Map.Entry
Map.Entry m = (Map.Entry)entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
(2)迭代器
//(2) 迭代器
Iterator iterator2 = entrySet.iterator();
while (iterator2.hasNext()) {
Object entry = iterator2.next();
//System.out.println(entry.getClass());//HashMap$Node -实现-> Map.Entry(getKey,getValue)
//向下转型 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
运行结果:
4. HashMap底层机制
- 扩容机制
5. Hashtable基本介绍
(1)Hashtable的底层
(2)Hashtable和HashMap对比
6. Map接口实现类-Properties
六、总结-开发中如何选择集合实现类(记住)
七、Collections工具类
示例1:
package Collections_;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
@SuppressWarnings({"all"})
public class collections_ {
public static void main(String[] args) {
List list = new ArrayList();
list.add("tom");
list.add("smith");
list.add("king");
list.add("milan");
//reverse(List) 反转 List 中元素的顺序
Collections.reverse(list);
System.out.println("list = " + list);
//shuffle(List) 对 List 集合元素进行随机的排序
Collections.shuffle(list);
System.out.println("list = " + list);
//sort(List) 根据元素的自然顺序对指定 List 集合元素按升序排序
System.out.println("自然排序后:");
Collections.sort(list);
System.out.println("list = " + list);
//sort(List,Comparator) 根据指定的 Comparator 产生的顺序对 List 集合排序
//比如,字符串的长度大小排序
System.out.println("按字符串长度排序后:");
Collections.sort(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//可以加入校验代码
return ((String)o1).length() - ((String)o2).length();
}
});
System.out.println(list);
System.out.println("交换位置0和1的元素后:");
//swap(List,int,int) 将指定 List 集合中的 i 处元素和 j 处元素进行互换
Collections.swap(list,0,1);
System.out.println(list);
}
}
代码运行结果:
示例2:
package Collections_;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
@SuppressWarnings({"all"})
public class collections02_ {
public static void main(String[] args) {
List list = new ArrayList();
list.add("tom");
list.add("smith");
list.add("king");
list.add("milan");
//Object max(Collection) 根据元素的自然顺序,返回给定集合中的最大元素
System.out.println("自然顺序的最大元素 = " + Collections.max(list));
//Object max(Collection,Comparator) 根据 Comparator 指定的顺序, 返回给定集合中的最大元素
//比如返回长度最大的元素
Object maxObject = Collections.max(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((String)o1).length() - ((String)o2).length();
}
});
System.out.println("长度最长的元素="+maxObject);
//Object min(Collection) 根据元素的自然顺序,返回给定集合中的最小元素
//Object min(Collection,Comparator) 根据 Comparator 指定的顺序, 返回给定集合中的最小元素
//此处参考 max 即可
//int frequency(Collection,Object) 返回指定集合中指定元素的出现次数
System.out.println("tom出现的次数="+Collections.frequency(list,"tom"));
//void copy(List dest,List src) 将 src 中的内容复制到 dest 中
ArrayList dest = new ArrayList();
//为了完成一次完整的拷贝,我们需要先给dest赋值,大小和list.size()一样
for(int i = 0; i < list.size(); i++){
dest.add("");
}
//拷贝
Collections.copy(dest,list);
System.out.println("dest = " + dest);
//boolean replaceAll(List list,Object oldVal,Object newVal) 使用新值替换 List 对象的所有值
Collections.replaceAll(list,"tom","汤姆");
System.out.println("list替换后 = "+list);
}
}
代码运行结果: