java集合
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map)
Collection接口是 (java.util.Collection)是Java集合类的顶级接口之一,Collection 接口有 3 种子类型集合: List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、TreeSet、LinkedHashSet、Stack、Priorityqueue等.
常用Iterator来遍历。
List、Set、Map是这个集合体系中最主要的三个接口。
其中List和Set继承自Collection接口。
Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。
List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。
Map也属于集合系统,但和Collection接口不同。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是三个主要的实现类。
- ArrayList: 具体用法参照https://www.runoob.com/java/java-arraylist.html
add ArrayList<String> sites = new ArrayList<String>();
sites.add("Google");
set sites.set(2, "Wiki"); // 第一个参数为索引位置,第二个为要修改的值
get sites.get(1) //访问第二个元素
remove sites.remove(2); sites.remove("Wiki");
包含 sites.contains("Taobao")
大小 sites.size()
排序 Collections.sort(sites); // 此时字母排序
- LinkedList:https://www.runoob.com/java/java-linkedlist.html
List有序且允许元素重复
- 对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList
- ArrayList、HashSet/LinkedHashSet、PriorityQueue、LinkedList是线程不安全的,可以使用synchronized关键字,或者类似下面的方法解决:
List list = Collections.synchronizedList(new ArrayList(…));ArrayList是⼀个数组队列,相当于动态数组。它由数组实现,随机访问效率⾼,随机插⼊、随机删除效率低。
LinkedList是⼀个双向链表。它也可以被当作堆栈、队列或双端队列进⾏操作。LinkedList随机访问效率低,但随机插⼊、随机删除效率⾼。
树层序遍历用到Queue
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
queue.poll()
Queue用法
boolean add(E e);
将对象e插入队列尾部,成功返回true,失败(没有空间)抛出异常IllegalStateException;
boolean offer(E e);
将对象e插入队列尾部,成功返回true,失败(没有空间)返回false;
E remove();
获取并移除队列头部元素,如果队列为空,抛出NoSuchElementException异常;
E poll();
获取并移除队列头部元素,如果队列为空,返回null;
E element();
获取但不移除队列头部元素,如果队列为空,抛出NoSuchElementException异常;
E peek();
获取但不移除队列头部元素,如果队列为空,返回null;
Deque 双端队列用法
void addFirst(E e)/ void addLast(E e);
将对象e插入到双端队列头部/尾部,容间不足时,抛出IllegalStateException异常;
boolean offerFirst(E e)/boolean offerLast(E e);
将对象e插入到双端队列头部尾部;
E removeFirst()/E removeLast();
获取并移除队列第一个/最后一个元素,队列为空,抛出NoSuchElementException异常;
E pollFirst()/E pollLast();
获取并移除队列第一个/最后一个元素,队列为空,返回null;
E getFirst()/E getLast();
获取队列第一个/最后一个元素,但不移除,队列为空,抛出NoSuchElementException异常;
E peekFirst()/E peekLast();
获取队列第一个/最后一个元素,队列为空,返回null;
- HashSet
add(Object obj)方法用于向Set集合中添加元素,添加成功返回true,否则返回false。重复元素不会被添加,返回false。
size() 方法:返回Set集合中的元素个数
remove(Object obj)方法 : 删除Set集合中的元素,删除成功返回true,否则返回false。
isEmpty()方法 : 如果Set不包含元素,则返回 true ,否则返回false
clear() 方法: 移除此Set中的所有元素
contains(Object o)方法:如果Set包含指定的元素,则返回 true,否则返回false
不保证顺序
- TreeSet
Set不允许元素重复
HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方法,它使用了前面说过的哈希码的算法。
TreeSet则将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用类Comparable和Comparator。一个类是可排序的,它就应该实现Comparable接口
HashSet是哈希表结构,主要利⽤ HashMap 的 key 来存储元素,计算插⼊元素的 hashCode 来获取元素在集合中的位置;
TreeSet是红⿊树结构,每⼀个元素都是树中的⼀个节点,插⼊的元素都会进⾏排序;
- Priorityqueue
PriorityQueue用于存放含有**优先级**的元素,插入的对象必须可以比较,优先级由对象的自然顺序决定。
优先级队列的头部是基于自然排序或基于Comparator的排序的最小元素
具体使用参照:https://blog.csdn.net/u010675669/article/details/86503464
- HashMap:https://www.runoob.com/java/java-hashmap.html
// 创建 HashMap 对象 Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// 添加键值对
Sites.put(1, "Google");
Sites.get(3) //查看
Sites.remove(4); //删除
Sites.containsKey(1);
Sites.containsValue("G");
//循环方式1
for(Map.Entry<Integer, Integer> entry: map.entrySet()){
if(entry.getValue() == 1){
return entry.getKey();
}
}
- TreeMap
Map是键值对,键不可以重复,值可以重复。
HashMap也用到了哈希码的算法,以便快速查找一个键
TreeMap则是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等
- TreeMap 默认按照key升序排列
ref: https://www.cnblogs.com/taiwan/p/6954135.html