java 集合体系
java集合体系
集合分为两组(单列集合,双列集合)
单列:Collection
主要子接口:List(有序可重复)、Set(无序)
双列:Map
主要实现类:HashTable、HashMap、TreeMap
单列
List(有序可重复)
所有实现类:
主要实现类:Vector、ArrayList、LinkedList
List的特征
- List是有序可重复的
- 支持索引
List的遍历方法
- 迭代器遍历
- 增强for遍历
- 普通for遍历
public class Demo {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(new Dog("Dog1", 12));
list.add(new Dog("Dog2", 13));
list.add(new Dog("Dog3", 14));
// 1.迭代器遍历
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
// 2.增强for遍历
for (Object dog : list) {
System.out.println(dog);
}
// 3.普通for遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
class Dog {
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
练习:List的冒泡排序
public class ListDemo {
public static void main(String[] args) {
// 实例化一个List
List list = new ArrayList<>();
// 实例化三本书
Book b1 = new Book("红楼梦", 12, "曹雪芹");
Book b2 = new Book("西游记", 13, "吴承恩");
Book b3 = new Book("水浒传", 10, "施耐庵");
// 添加
list.add(b1);
list.add(b2);
list.add(b3);
// 调用冒泡排序
sort(list);
System.out.println("排序后:");
for (Object o : list) {
System.out.println(o);
}
}
// 静态排序方法(冒泡排序)
// 价格从小到大
public static void sort(List list) {
int size = list.size();
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - 1 - i; j++) {
// 取出对象
Book book1 = (Book) list.get(j);
Book book2 = (Book) list.get(j + 1);
if (book1.getPrice() > book2.getPrice()) {
// 交换
list.set(j, book2);
list.set(j + 1, book1);
}
}
}
}
}
ArrayList
- 底层是Object[]
- ArrayList可以放null值
- 可以放多个null值
- 由数组来实现的
- 基本等同于Vector
- ArrayList是线程不安全的
- 但是执行效率高
- 源码分析:ArrayList扩容源码分析 - CoderDreams - 博客园 (cnblogs.com)
Vector
- 底层也是Object[]
- 线程安全的
- 源码分析:Vector源码分析 - CoderDreams - 博客园 (cnblogs.com)
LinkedList
- 底层是一个双向链表
- 可添加任何元素,包括null
- 线程不安全的
- 源码分析:LinkedList源码分析 - CoderDreams - 博客园 (cnblogs.com)
Set(无序不可重复)
所有实现类:
主要实现类:HashSet、TreeSet
Set的特征
- 无序(取出的顺序和存入的顺序不一致,但是取出的顺序是固定的)
- 不可重复(最多一个null值)
- 没有索引
Set的遍历方法
- 迭代器遍历
- 增强for遍历
- 不可以普通for遍历(因为没有索引)
HashSet
- 实现Set接口
- 底层实际上是HashMap()
- 源码分析:HashSet源码分析 - CoderDreams - 博客园 (cnblogs.com)
无参构造器:
private transient HashMap<E,Object> map;
public HashSet() {
// 实际上是实例化了一个HashMap
map = new HashMap<>();
}
LinkedHashSet
- LinkedHashSet是HashSet的子类
- 底层是一个LinkedHashMap(HashMap的子类),维护了一个数组加双向链表
- 根据hashCode值决定元素的存储位置,同时使用链表维护元素的次序,使得元素看起来是以插入顺序保存的
- 不允许添加重复元素
- 源码分析:LinkedHashSet源码分析 - CoderDreams - 博客园 (cnblogs.com)
双列
Map的特点
- 保存具有映射关系的数据:Key-Value(双列元素)
- Key和Value都可以是任何引用类型的数据,会封装到HashMap$Node对象中
- Key不允许重复
- Value可以重复
- Key可以为null,但是不能多个null,Value可以为null并且可以多个
- 3-5的原因可见:HashSet源码分析 - CoderDreams - 博客园 (cnblogs.com)
未写完,待续