文章目录
前言
针对最近几天对集合的学习,做出一些自己的理解,有不对的地方请指出。
一、集合的体系结构
二、Collection
1.概述
-
是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
-
JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现
2.常用方法
- boolean add (E e):添加元素
- boolean remove(Object o):从该集合中删除指定元素的单个实例
- void clear():清空集合中的元素
- boolean contains(Object o):如果此集合包含指定的元素,则返回true
- boolean isEmpty():如果此集合不包含元素,则返回 true
- int size():集合的长度,也就是集合中元素的个数
3.案例
import java.util.ArrayList;
import java.util.Collection;
public class collectionDemo02 {
public static void main(String[] args) {
//创建集合对象
ArrayList<String> c = new ArrayList<>();
//添加元素
c.add("hello");
c.add("world");
c.add("java");
//删除指定元素
System.out.println(c.remove("world" ));
//没有指定元素则返回false
System.out.println(c.remove("javas" ));
//清空集合中的元素
c.clear();
//如果此集合包含指定的元素,则返回true,否则返回false
System.out.println(c.contains("world"));
//如果此集合不包含元素,则返回 true,否则返回false
System.out.println(c.isEmpty());
//返回集合的长度,也就是集合中元素的个数
System.out.println(c.size());
//输出集合对象
System.out.println(c);
}
}
三、List
1.特点
- 有序:存储和取出元素顺序一致
- 可重复:存储的元素可以重复
2.子类
- ArrayList:底层数据结构为数组,查询快,增删慢,线程不安全,效率高;
- Vector:底层数据结构为数组,查询快,增删慢,线程安全,效率慢,一般不用;
- LinkedList:底层数据结构为链表,查询慢,增删快,线程不安全,效率高
3.常用方法
- boolean add(E o) 向列表的尾部追加指定的元素
- void add(int index,E element) 在列表的指定位置插入指定元素。
- boolean addAll(Collection<? extends E> c) 追加指定 collection中的所有元素到此列表的结尾,顺序是指定collection的迭代器返回这些元素的顺序。
- boolean addAll(int index,Collection<? extends E> c) 将指定collection中的所有元素都插入到列表中的指定位置。
- void clear() 从列表中移除所有元素。
- boolean contains(Object o) 如果列表包含指定的元素,则返回true。
- boolean containsAll(Collection<?> c) 如果列表包含指定collection的所有元素,则返回true。
- boolean equals(Object c) 比较指定的对象与列表是否相等。
- E get(int index) 返回列表中指定位置的元素。
- int hashCode() 返回列表的哈希码值。
- int indexOf(Object o) 返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回-1。
- boolean isEmpty() 判断集合是否为空 如果为空 则返回true,否则返回false
- Iterator iterator() 返回以正确顺序在列表的元素上进行迭代的迭代器。
- int lastIndexOf(Object o) 返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回-1。
- ListIterator listIterator() 返回列表中元素的列表迭代器(以正确的顺序)。
- ListIterator listIterator(int index)返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始。
- E remove(int index) 移除列表中指定位置的元素。
- boolean remove(Object o) 移除列表中出现的首个指定元素。
- boolean removeAll(Collection<?> c) 从列表中移除指定collection中包含的所有元素。
- boolean retainAll(Collection<?> c)仅在列表中保留指定collection中所包含的元素。
- E set(int index,E element) 用指定元素替换列表中指定位置的元素。
- int size() 返回列表中的元素数。
- List subList(int forIndex,int toIndex) 返回列表中指定的formIndex(包括) 和toIndex(不包括)之间的部分视图。
- Object toArray() 返回以正确顺序包含列表中的所有元素的数组。
4.遍历方式
public class TraversalList {
//http://www.cnblogs.com/interdrp/p/3663602.html
public static void main(String args[]){
List<String> list = new ArrayList<String>(
list.add("hello");
list.add("world");
list.add("java");
//方法1 用迭代器迭代
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//方法2 增强型for循环遍历
for(String value:list){
System.out.println(value);
}
//方法3 一般型for循环遍历
for(int i = 0;i < list.size(); i ++){
System.out.println(list.get(i));
}
}
}
四、Set
1.特点
- 存储的数据无序(不等于随机,因为是按照特定的规则制订的)
- 不可重复
2.子类
- HashSet : 内部数据结构是哈希表, 是不同步的
- LinkedHashSet : 存入和取出的顺序一致(有序)
- TreeSet : 内部数据结构是红黑树,可以对 Set 集合中的元素进行排序, 是不同步的.
3.HashSet 与 TreeSet 区别
一方面(联系):它们是set的子类,都具有无序、无重复、无索引的特点;
另一方面(区别):
(1)Hashset接口是无序、不可重复的集合;而TreeSet是有序的;
(2)HashSet底层是Hash实现(数组+链表),线程不安全;而TreeSet底层是红黑树数据结构,默认就对元素排序了;
(3)底层:HashSet实现了Set接口,由于是Hash表,实际上采用一个HashMap的实例,所有元素存储在HashMap的Key上,而value有一个固定的值,HashSet不存储重复元素iu是重写Hashcode()和equals()方法;TreeSet底层是用TreeMap实现的,构造方法中会采用一个TreeMap实例存放元素,添加元素时先判断有无比较器,如果有就根据比较器规则进行比较,没有比较器的话,就根据元素本身特性进行添加。
4.Comparable 和Comparator的区别
-
Comparable 自然排序 ,实体类实现Comparable接口,可以去重写compareTo()方法,解决实际排序问题。 把元素放到TreeSet里面去,就会自动的调用CompareTo方法; 但是这个Comparable并不是专为TreeSet设计的;只是说TreeSet顺便利用而已; 就像haashCode和equals 也一样,不是说专门为HashSet设计一样;只是你顺便利用而已;
-
Compartor第三方的比较器接口,也不是专门为TreeSet设计。 用法:设计一个比较器. 创建一个类,实现这个接口,覆写compare()方法,解决不同问题的需求。
五、Map
1.特点
-
map集合特点就是采用了 Key-value键值对映射的方式进行存储
-
key在Map里面是唯一的但是value可以重复,一个key对应一个value。
-
key是无序、唯一的
-
value是无序不唯一的
2.子类
HashMap:
-
HashMap是map的实现类
-
允许多个null值和一个null键
-
HashMap中的元素没有顺序(跟添加的顺序无关)
-
HashMap不是线程安全的。
TreeMap:
-
可以按着key来做排序
-
Key不能为null,key不能重复,值可以有多个null
-
不是线程安全的
3.常用方法
- Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
- void putAll(Map m):将m中的所有key-value对存放到当前map中
- Object remove(Object key):移除指定key的key-value对,并返回value
- void clear():清空当前map中的所有数据
- Object get(Object key):获取指定key对应的value
- boolean containsKey(Object key):是否包含指定的key
- boolean containsValue(Object value):是否包含指定的value
- int size():返回map中key-value对的个数
- boolean isEmpty():判断当前map是否为空
- boolean equals(Object obj):判断当前map和参数对象obj是否相等
- Set keySet():返回所有key构成的Set集合
- Collection values():返回所有value构成的Collection集合
- Set entrySet():返回所有key-value对构成的Set集
4.HashMap与TreeMap的区别
相同点:
- HashMap非线程安全,TreeMap非线程安全
- 都继承了AbstractMap
不同点:
-
HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()(可以重写hashCode()和equals()),为了优化HashMap空间的使用,您可以调优初始容量和负载因子。
-
TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
-
HashMap :适用于在Map中插入、删除和定位元素。Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
-
HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。
-
HashMap的结果是没有排序的。TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map中插入、删除和定位元素,HashMap是最好的选择。TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了关于我自己对于集合的一些使用,有不对的地方也请大家指出。