Java集合类存放于 java.util 包中,是一个用来存放对象的容器。Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。
1)集合中只能存放对象;
2)集合存放的是对象的引用,对象本身仍在堆内存中;
3)集合可以存放不同类型、不同数量的数据类型(Map)。
图片来源:http://blog.csdn.net/u010887744/article/details/50575735
高清图地址:https://img-blog.csdn.net/20160124221843905
Collection集合框架
顶层接口:
public interface Iterable {
/**
* 返回类型 T元素的迭代器。
*/
Iterator iterator();
/**
* 执行给定的操作的每个元素 Iterable直到所有的元素都已经被处理或行动将抛出一个异常。
* @since 1.8
*/
default void forEach(Consumer super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
/**
* 在Iterable描述的元素上创建一个spliterator
* @since 1.8
*/
default Spliterator spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
迭代器接口:
public interface Iterator {
/**
* 如果仍有元素可以迭代,则返回 true。
*/
boolean hasNext();
/**
* 返回迭代的下一个元素
*/
E next();
/**
* 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
*/
default void remove() {
throw new UnsupportedOperationException("remove");
}
/**
* 为每个剩余元素执行给定的操作,直到所有的元素都已经被处理或行动将抛出一个异常。
* @since 1.8
*/
default void forEachRemaining(Consumer super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
核心接口:
public interface Collection extends Iterable {
..........
}
子接口:
1)、List
public interface List extends Collection {
.........
}
实现类:
List list1 = new ArrayList<>();
List list2 = new LinkedList<>();
List list3 = new Vector<>();
ArrayList
特点:底层数据结构是数组,查询快,增删慢;线程不安全,效率高;
LinkedList
特点:底层数据结构是链表,查询慢,增删快;线程不安全,效率高;
Vector
特点:底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合;
其他:
Stack:vector提供的子类,用于模拟"栈"这种数据结构(LIFO后进先出)
CopyOnWriteArrayList:
CopyOnWriteArrayList是ArrayList的线程安全的变体,其中的所有可变操作(add, set等)都是对底层数组进行一次新的复制来实现的,相比ArrayList的要慢一些,适用于读多写少的场景 ;
在并发操作容器对象时不会抛出ConcurrentModificationException,并且返回的元素与迭代器创建时的元素是一致的 ;
容器对象的复制需要一定的开销,如果对象占用内存过大,可能造成频繁的YoungGC和Full GC ;
CopyOnWriteArrayList不能保证数据实时一致性,只能保证最终一致性
2)、Set
public interface Set extends Collection {
.........
}
实现类:
Set set1 = new HashSet<>();
Set set2 = new LinkedHashSet<>();
Set set3 = new TreeSet<>();
HashSet
HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值相等
特点:底层数据结构是数组;无序、不可重复;线程不安全;
LinkedHashSet
特点:底层采用 链表和哈希表的算法,链表保证元素的添加顺序,哈希表保证元素的唯一性;有序、不可重复;线程不安全;
TreeSet
特点:底层使用红黑树算法,擅长于范围查询;有序、不可重复;线程不安全;
3)、Queue
public interface Queue extends Collection {
...........
}
Map集合框架
key-value 的键值对,key 不允许重复,value 可以;双列
Map接口的三个实现类:
HashMap
HashTable:线程安全,低效,不支持null;
SortedMap:有一个实现类:TreeMap
ConcurrentHashMap
遍历ArrayList
import java.util.*;
/**
* 三种方法都是用来遍历ArrayList集合,第三种方法是采用迭代器的方法,该方法可以不用担心在遍历的过程中会超出集合的长度。
*/
public class Test{
public static void main(String[] args) {
List list=new ArrayList();
list.add("Hello");
list.add("World");
list.add("HAHAHAHA");
//第一种遍历方法使用foreach遍历List
for (String str : list) { //也可以改写for(int i=0;i ite=list.iterator();
while(ite.hasNext())//判断下一个元素之后有值
{
System.out.println(ite.next());
}
}
}
遍历Map
import java.util.*;
public class Test{
public static void main(String[] args) {
Map map = new HashMap();
map.put("1", "value1");
map.put("2", "value2");
map.put("3", "value3");
//第一种:普遍使用,二次取值
System.out.println("通过Map.keySet遍历key和value:");
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
//第二种
System.out.println("通过Map.entrySet使用iterator遍历key和value:");
Iterator> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第三种:推荐,尤其是容量大时
System.out.println("通过Map.entrySet遍历key和value");
for (Map.Entry entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第四种
System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values()) {
System.out.println("value= " + v);
}
}
}
遍历Set
import java.util.HashSet;
import java.util.Iterator;
public class SetTest {
public static void main(String[] args) {
HashSet sets = new HashSet<>();
sets.add("h");
sets.add("e");
sets.add("l");
sets.add("l");//不可重复
sets.add("0");
//方法一:迭代遍历
for (Iterator iterator = sets.iterator(); iterator.hasNext();){
System.out.println(iterator.next());
}
//输出结果:
/*
0
e
h
l
*/
//可以看出Set集合是不可重复(添加重复操作不会报错)且无序的
//方法二:foreach循环(没有普通for循环方法)
for (String value:sets) {
System.out.println(value);
}
}
}