与现代的数据结构类库的常见情况一样,Java集合类库也将接口与实现分离。
1,队列(FIFO先进先出),采用循环数组、链表两种方式实现,循环数组效率高,但是一个有界数组,如果对象数量没有上限,建议选择链表;
2,集合类的基本接口是Collection接口
3,iterator方法,用于实现了Iterator接口的对象,Java SE5.0后,采用了for each循环这种更加简练的方式;for each循环可以与实现了Iterator接口的对象一起工作;
for(String element: c){ do something }
4,for each扩展了Iterator接口,标准库的任何集合都可以用for each循环;ArrayList会按顺序循环,下标从0开始;HashSet集合会按照某种次序随机循环。
5,数组与动态的ArrayList类,删除一个中间元素要付出很大代价,原因是删除元素后后面的元素会向前端移动;增加一个中间元素也是如此;
6,Java中的链表都是双向链表,LinkedList,其中listIterator可以向前或向后遍历链表
List<String> staff = new LinkedList<String>(); staff.add("Amy"); staff.add("Bob"); staff.add("Carl"); ListIterator<String> iter = staff.listIterator(); iter.previous(); iter.next();
7,链表不支持随机访问,如果要查看第N个元素,需要越过N-1个元素。下面这种方式访问效率丰常低。
List<String> staff = new LinkedList<String>(); staff.get(0);
8,ArrayList,LinkedList都是List接口的实现类
9,散列表HashTable,可以快速的查找所需对象;
Set set = new HashSet();//无序 SortedSet set = new TreeSet();//有序
10,
1)集合类有两个基本接口:Collection和Map;
2)List是有序集合接口;向List某个位置增加元素时,可以使用ArrayList数组或LinkedList链表;
3)RandomAcess是空接口(标记接口),instanceof来判断是否支持高效随机访问;
4)遗留容器类,在Collection之前就已经存在:Vector,Stack,HashTable,Properties。
11,
List<String> list = Collections.nCopies(100, "test");//创建100个字符串List List<String> list = Arrays.asList("a", "b", "c"); String[] values = {"a", "b", "c"}; HashSet<String> staffHashSet = new HashSet<String>(Arrays.asList(values));
12,增加,删除数组的操作较多,采用LinkedList(随机访问效率低,基本采用迭代的方式访问链表),如果随机访问较多,采用ArrayList(增加,删除操作会移动后续数组,效率低下);
13,二分法查找,排序-折半查找;实现了RandomAccess接口;如果没实现采用线性查找;