List
List 是有序、可重复的容器。
有序:List中每个元素都有索引标记。可以根据元素的索引标记(在list中的位置)
访问元素,从而精确控制这些元素。
可重复:List 允许加入重复的元素。更准确的讲,List通常允许满足e1,equals(e2)
的元素重复加入容器
List 接口常用的实现类有3个:ArrayList LinkedList Vector
ArrayList底层是用数组实现的存储
特点:查询效率高,删除效率低,线程不安全。与数组相比,ArrayList可以扩容
LinkedList底层是用双向循环链表的存储
特点:查询效率低,增删效率高,线程不安全。
Vector 底层是用数组实现的List
特点:线程安全,效率低
如何选择ArrayList LinkedList Vector?
1.需要线程安全时,用Vector。
2.不存在线程安全问题时,并且 查找较多用ArrayList
3.不存在线程安全问题时,增加或删除元素较多用LinkedList
容器中的所有比较方式都是用的equals
Set
Set是无序、不可重复的容器。
set 和list 接口都是Collection的子接口
set中没有索引,若要查找则只能遍历
Set接口常用的实现类有2个:HashSet TreeSet
HashSet底层实际是用HashMap实现的
TreeSet底层实际是用TreeMap实现的
Map
Map就是用来存储“键值对”即Key-Value。
Map类中存储的“键值对”通过键来标志,所以“键对象”不能重复
Map接口的实现类有HashMap TreeMap HashTable Properties等
HashMap
底层实现采用了哈希表,这是一种非常重要的数据结构
数据结构中由数组和链表来实现对数据的存储,他们各有特点:
1.数组:占用连续空间,寻址容易,查询速度快。但是增加和删除效率非常低。
2.链表:占用空间不连续。寻址困难,查询速度慢。但是,增加和删除效率非常高。
若利用数组和链表的优点即哈希表,其本质就是数组+链表
PS:java中规定两个内容相同(equals()为true)的对象必须具有相同的hashCode。
TreeMap
是红黑二叉树的典型表现,一般需要在排序的时候才使用TreeMap
HashMap 与HashTable区别:
HashMap:线程不安全,效率高。允许key 或value 为null
HashTable:线程安全,效率低。不允许key 或value 为null
迭代器
迭代器为我们提供了统一的遍历容器(list map set)的方式,测试如下:
package cn.sxt.collection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* 测试迭代器
* @author l
*
*/
public class TestIterator {
public static void main(String[] args) {
testIteratorList();
testIteratorSet();
testIteratorMap();
}
//遍历List
public static void testIteratorList(){
List<String> l = new ArrayList<>();
l.add("a");
l.add("b");
l.add("c");
for(Iterator<String> iter =l.iterator();iter.hasNext();){
String temp = iter.next();
System.out.println(temp);
}
}
//遍历Set
public static void testIteratorSet(){
Set<String> l = new HashSet<>();
l.add("a");
l.add("b");
l.add("c");
for(Iterator<String> iter =l.iterator();iter.hasNext();){
String temp = iter.next();
System.out.println(temp);
}
}
//遍历Map
public static void testIteratorMap(){
Map<Integer,String> l = new HashMap<>();
l.put(1, "li");
l.put(2, "wang");
l.put(3, "www");
Set<Entry<Integer,String>> ss = l.entrySet();
for(Iterator<Entry<Integer,String>> iter =ss.iterator();iter.hasNext();){
Entry<Integer, String> temp = iter.next();
System.out.println(temp);
}
}
}
运行结果:
a
b
c
a
b
c
1=li
2=wang
3=www
文章仅用于个人学习,如有错误请指出!