Collection
需要主动导入依赖:java.util.*;
包含List, Set, Map
List
和python list同名的数据类型,具有相似的特性(Java要求元素类型一致)
ArrayList
- 可以通过下标索引查找元素
- 允许元素值重复
- 底层通过顺序表实现,所以查询操作的时间复杂度为O(1),增加和删除的时间复杂度为O(n)
LinkedList
- 可以通过下标索引查找元素
- 允许元素值重复
- 底层通过链表实现,所以查询操作的时间复杂度尾O(n),增加和删除的时间复杂度为O(1)
import java.util.*;
public class TestList {
public static void main(String[] args){
List<Photo> album = new LinkedList<>(); // 尖括号的表示是一种泛型
album.add(new Photo("one", new Date(), "classroom")); // 添加元素
album.add(new Photo("two", new Date(), "library"));
album.add(new Photo("three", new Date(), "gym"));
album.add(new Photo("three", new Date(), "dorm"));
Iterator<Photo> iterator = album.iterator(); // 获取到队列的迭代器
while(iterator.hasNext()){
Photo photo = iterator.next();
System.out.println(photo.toString());
}
for(Photo photo : album){
System.out.println(photo);
}
}
}
class Photo{
String title;
Date date;
String memo;
Photo(String title, Date date, String memo)
{
this.title = title;
this.date = date;
this.memo = memo;
}
@Override
public String toString()
{
return title + "(" + date + ")" + memo;
}
}
打印内容如下:
one(Fri Jun 26 18:12:09 CST 2020)classroom
two(Fri Jun 26 18:12:09 CST 2020)library
three(Fri Jun 26 18:12:09 CST 2020)gym
three(Fri Jun 26 18:12:09 CST 2020)dorm
one(Fri Jun 26 18:12:09 CST 2020)classroom
two(Fri Jun 26 18:12:09 CST 2020)library
three(Fri Jun 26 18:12:09 CST 2020)gym
three(Fri Jun 26 18:12:09 CST 2020)dorm
Set
和python set同名的数据类型,也是具有相似的特性(Java要求元素类型一致)
HashSet
- 无序,通过HashMap实现,相当于是HashMap的key
- 不允许元素值重复
HashSet通过比较元素hashcode来判断是否重复以及其排序,所以它要求元素必须实现hashCode方法。由于使用的hash排序算法涉及的因素比较多,而且元素增多后引起的扩容会打乱原有的排序,这也就是无序的原因所在。
package com.company;
import java.util.*;
public class TestSet {
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("Brazil");
set.add("Russia");
set.add("India");
set.add("China");
set.add("South Africa");
System.out.println(set.contains("China")); // 判断集合是否包含某元素
for(String obj : set)
System.out.println(obj);
}
}
打印内容如下:
true
China
Brazil
South Africa
Russia
India
TreeSet
- 有序,可以通过下标索引查询(底层由TreeMap实现)
- 不允许元素值重复
Map
和python dict相似,都是以键值对作为元素的数据结构。Java要求
HashMap
- 遍历时取得的数据是完全随机的
- 最多允许一个元素的key位Null
- 不支持线程同步。如需要同步可以使用Collections的synchronizedMap
HashTable
- 不允许元素的key或者值为空
- 支持线程同步,即同一时刻只有一个线程能写HashTable,因此也导致了多线程下其效率较慢
- 其他和HashMap相似
LinkedHashMap:和HashMap相似,但是有序的数据类型
TreeMap
- 无序(元素顺序和添加顺序不一致)
- value可以是null,但key不可以是nul
- TreeMap是一个能比较元素大小的Map集合,会对传入的key进行大小排序。
- 可以使用元素的自然排序,也可以使用自定义的比较器来进行排序
package com.company;
import java.util.*;
public class TestMap {
public static void main(String[] args)
{
Map<String, String> map = new TreeMap<>();
map.put("b", "Brazil");
map.put("r", "Russia");
map.put("i", "India");
map.put("c", "China");
map.put("k", "South Africa");
System.out.println(map.get("c"));
for(String key : map.keySet())
System.out.println(key + ":" + map.get(key));
for(String value : map.values())
System.out.println(value);
for(Map.Entry<String, String> entry : map.entrySet())
System.out.println(entry.getKey() + ":" + entry.getValue());
Iterator it = map.entrySet().iterator();
while(it.hasNext()) {
Map.Entry<String, String> entry = (Map.Entry<String, String>)it.next();
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
}
China
b:Brazil
c:China
i:India
k:South Africa
r:Russia
Brazil
China
India
South Africa
Russia
b:Brazil
c:China
i:India
k:South Africa
r:Russia
b:Brazil
c:China
i:India
k:South Africa
r:Russia