Java集合专门用来存放多个对象,方便程序处理数据。Java提供了多种集合类,以便满足不同的应用需求,这些集合类分为两大系列:Collection和Map
- List
List的通用方法
boolean add(Object obj);//添加指定元素 boolean remove(Object obj);//删除指定元素 void clear();//清空元素 int size();//获得元素个数 boolean contains(Object obj);//判断是否包含指定元素 void add(int index, Object obj);//在指定位置添加指定元素 Object remove(int index);//删除指定位置的元素 Object get(int index);//获得指定位置的元素 int indexOf(Object o);//返回指定元素第一次出现的位置
List的遍历
//使用for循环遍历 for (int i = 0; i < list.size(); i++) { Object obj = list.get(i); System.out.println(obj); } //使用Iterator遍历 Iterator it = list.iterator(); while (it.hasNext()) { Object obj = it.next(); System.out.println(obj); } //使用增强for循环遍历 for (Object obj : list) { System.out.println(obj); }
- List的子类ArrayList
ArrayList内部结构是数组,这就决定了ArrayList在进行相关操作时有以下特点:
1 元素可重复
2 元素添加顺序(add(obj))和遍历顺序一致
3 add时如果需要扩充内部数组容量则会降低程序执行效率
4 add(index, obj)时index位置及其后面的元素都会往后挪动一个位置,造成效率降低
5 remove时被删除元素后面的元素都会往前挪动一个位置,造成效率降低
6 get(index)时可直接定位并返回指定位置的元素,效率很高
其实当ArrayList元素个数不太多时,效率降低的影响可忽略不计,所以ArrayList仍非常常用
- List的子类LinkedList
LinkedList内部结构是链表,这就决定了LinkedList在进行相关操作时有以下特点:
1 元素可重复
2 元素添加顺序(add(obj))和遍历顺序一致
3 add、remove时只需要修改链接,性能很高
4 get(index)时内部会遍历链表,相对ArrayList的效率稍低一些
可见,如果元素个数不多,ArrayList和LinkedList各种操作的效率差别可忽略,如果元素个数很多,如果需要频繁进行增删操作,建议使用LinkedList。如果需要频繁执行get(index)操作,建议使用ArrayList
- Set
Set的通用方法
boolean add(Object obj);//添加指定元素 boolean remove(Object obj);//删除指定元素 void clear();// 清空元素 int size() ;// 获得元素个数 boolean contains(Object obj);// 判断是否包含指定元素
Set的遍历
//使用Iterator遍历 Iterator it = set.iterator(); while (it.hasNext()) { Object obj = it.next(); System.out.println(obj); } //使用增强for循环遍历 for (Object obj : set) { System.out.println(obj); }
- Set的子类HashSet
HashSet内部借助HashMap实现,其实是哈希表结构,这就决定了HashSet在进行相关操作时有以下特点:
1 元素不可重复
2 不支持索引操作
3 元素添加顺序和遍历顺序不一致
4 add、remove的效率和LinkedList基本一样
5 get的效率比LinkedList高(所用时间大概为Linked的1/16)
可见,无论何种操作,HashSet的效率都很不错
- Set的子类LinkedHashSet
LinkedHashSet是在HashSet的基础上增加了链表结构,这样就可以让元素添加顺序和遍历顺序一致,其他操作特点和HashSet一样
- Set的子类TreeSet
TreeSet内部借助TreeMap实现,其实是二叉树结构,这就决定了TreeSet在进行相关操作时有以下特点:
1 元素不可重复
2 不支持索引操作
3 元素添加顺序和遍历顺序不一致,遍历时元素按自然顺序排序
4 add、remove的效率高
5 get的效率也高
可见,无论何种操作,TreeSet的效率都很不错
- Collection的其他子类
Stack
通过对List的封装定义了一组方法,用来实现先进后出的操作特点
Stack stack = new Stack(); stack.push(obj);//把指定对象放在栈顶 stack.pop();//删除并返回栈顶元素 stack.peek();//获得栈顶元素
Queue
queue是个接口,定义了一组方法,用来实现先进后出的操作特点,LinkedList就是Queue的实现类
Queue queue = new LinkedList(); queue.offer(obj); //把元素添加到队尾,等同于add(obj) queue.poll(); //删除并返回队首元素 queue.peek(); //返回队首元素
- Map
Map的通用方法
Object put(Object key,Object value);//把键值对添加到map中 Object get(Object key) ;//根据key获取value Object remove(Object key);//根据key删除键值对 void clear();//清空map中的键值对 void size() ;//返回map中键值对的个数
Map的遍历
//遍历key Set Set keys = map.keySet(); for (Object key : keys) { Object value = map.get(key); System.out.println(value); } //遍历value Collection Collection values = map.values(); for (Object value : values) { System.out.println(value); } //遍历Entry Set Set<Entry> entries = map.entrySet(); for (Entry entry : entries) { Object key = entry.getKey(); Object value = entry.getValue(); System.out.println(value); }
- Map的子类HashMap
HashMap内部是哈希表,其实就是数组和链表的组合形式
HashMap操作key时和HashSet非常相似(HashSet内部就是HashMap实现的)
1 key不可重复
2 key不支持索引操作
3 key的添加顺序和遍历顺序不一致
4 增、删、查操作效率和HashSet一样都很高
- Map的子类LinkedHashMap
LinkedHashMap是在HashMap的基础上对key增加了链表结构,这样就可以让key的添加顺序和遍历顺序一致,其他操作特点和HashMap一样
- Map的子类TreeMap
TreeMap内部是二叉树结构,操作特点和TreeSet相似:
1 key不可重复
2 key不支持索引操作
3 key添加顺序和遍历顺序不一致,遍历时key按自然顺序排序
4 增、删、查操作效率和TreeSet一样都很高
- 集合工具类Collections
Collections是Java集合框架中的工具类,提供了很多工具方法操作集合对象
Collections.sort(list); //对list的元素进行自然排序,要求元素实现Comparable接口 Collections.sort(list, comparator); //使用自定义排序规则对list的元素进行排序 Collections.binarySearch(list, key); //使用已经排序的list进行二分查找 Collections.shuffle(list); //洗牌、打乱list元素位置