1.集合的分类
---|Collection: 单列集合
---|List: 有存储顺序, 可重复
---|ArrayList: 数组实现, 查找快, 增删慢
由于是数组实现, 在增和删的时候会牵扯到数组增容, 以及拷贝元素. 所以慢。数组是可以直接按索引查找, 所以查找时较快
---|LinkedList: 链表实现, 增删快, 查找慢
由于链表实现, 增加时只要让前一个元素记住自己就可以, 删除时让前一个元素记住后一个元素, 后一个元素记住前一个元素. 这样的增删效率较高但查询时需要一个一个的遍历, 所以效率较低
---|Vector: 和ArrayList原理相同, 但线程安全, 效率略低
和ArrayList实现方式相同, 但考虑了线程安全问题, 所以效率略低
---|Set: 无存储顺序, 不可重复
---|HashSet
---|TreeSet
---|LinkedHashSet
---| Map: 键值对
---|HashMap
---|TreeMap
---|HashTable
---|LinkedHashMap
2.collection接口的共性方法
增加:
1:add(E e) 将指定对象存储到容器中
add 方法的参数类型是Object 便于接收任意对象
2:addAll(Collection<? extends E> c) 将指定集合中的元素添加到调用该方法和集合中
删除:
3:remove(Object o) 将指定的对象从集合中删除
4:removeAll(Collection<?> c) 将指定集合中的元素删除
修改
5:clear() 清空集合中的所有元素
判断
6:isEmpty() 判断集合是否为空
7:contains(Object o) 判断集合何中是否包含指定对象
8:containsAll(Collection<?> c) 判断集合中是否包含指定集合
使用equals()判断两个对象是否相等
获取:
9:int size() 返回集合容器的大小
转成数组
10:toArray() 集合转换数组
3.List集合特有的方法
1:增加
void add(int index, E element) 指定位置添加元素
boolean addAll(int index, Collection c) 指定位置添加集合
2:删除
E remove(int index) 删除指定位置元素
3:修改
E set(int index, E element) 返回的是需要替换的集合中的元素
4:查找:
E get(int index) 注意: IndexOutOfBoundsException
int indexOf(Object o) // 找不到返回-1
lastIndexOf(Object o)
5:求子集合
List<E> subList(int fromIndex, int toIndex) // 不包含toIndex
4.在迭代器迭代元素 的过程中,不允许使用集合对象改变集合中的元素个数,如果需要添加或者删除只能使用迭代器的方法进行操作。
如果使用过了集合对象改变集合中元素个数那么就会出现ConcurrentModificationException异常。 迭代元素 的过程中: 迭代器创建到使用结束的时间。
5.ArrayList
ArrayList底层维护了一个Object[] 用于存储对象,默认数组的长度是10。可以通过 new ArrayList(20)显式的指定用于存储对象的数组的长度。
当默认的或者指定的容量不够存储对象的时候,容量自动增长为原来的容量的1.5倍。
6.HashSet
元素的哈希值是通过元素的hashcode方法来获取的, HashSet首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals方法,如果 equls结果为true ,HashSet就视为同一个元素,如果equals 为false就不是同一个元素。
7.TreeSet
TreeSet指定排序规则。
方式一:元素自身具备比较性
元素自身具备比较性,需要元素实现Comparable接口,重写compareTo方法,也就是让元素自身具备比较性,这种方式叫做元素的自然排序也叫做默认排序。
方式二:容器具备比较性
当元素自身不具备比较性,或者自身具备的比较性不是所需要的。那么此时可以让容器自身具备。需要定义一个类实现接口Comparator,重写compare方法,并将该接口的子类实例对象作为参数传递给TreeSet集合的构造方法。
8.Map接口的共性方法
1、添加
V put(K key, V value) (可以相同的key值,但是添加的value值会覆盖前面的,返回值是前一个,如果没有就返回null)
putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。
2、删除
remove() 删除关联对象,指定key对象
clear() 清空集合对象
3、获取
value get(key); 可以用于判断键是否存在的情况。当指定的键不存在的时候,返回的是null。
4、判断:
boolean isEmpty() 长度为0返回true否则false
boolean containsKey(Object key) 判断集合中是否包含指定的key
5、boolean containsValue(Object value) 判断集合中是否包含指定的value
6、长度
Int size()
7、将map 集合中所有的键取出存入set集合。
Set<K> keySet() 返回所有的key对象的Set集合再通过get方法获取键对应的值。
8、 values() ,获取所有的值.
Collection<V> values()不能获取到key对象
9、 Map.Entry对象 推荐使用 重点
Map.entrySet()方法返回Set<Map.Entry<k,v>> ,Entry将map 集合中的键值映射关系打包成一个对象Entry对象,通过Map.Entry 对象的getKey,getValue获取其键和值。
9.Collections与Arrays
collections:
1, 对list进行二分查找:
前提该集合一定要有序。
int binarySearch(list,key);//必须根据元素自然顺序对列表进行升级排序,要求list 集合中的元素都是Comparable 的子类。
int binarySearch(list,key,Comparator);
2,对list集合进行排序。
sort(list);//对list进行排序,其实使用的是list容器中的对象的compareTo方法
sort(list,comaprator);//按照指定比较器进行排序
3,对集合取最大值或者最小值。
max(Collection)
max(Collection,comparator)
min(Collection)
min(Collection,comparator)
4,对list集合进行反转。
reverse(list);
5,可以将不同步的集合变成同步的集合。
Set synchronizedSet(Set<T> s)
Map synchronizedMap(Map<K,V> m)
List synchronizedList(List<T> list)
arrays:
1,二分查找,数组需要有序
binarySearch(int[] a, int key)
binarySearch(double[],double key)
2,数组排序
sort(int[])
sort(char[])……
3, 将数组变成字符串。
toString(int[])
4, 复制数组。
copyOf();
5, 复制部分数组。
copyOfRange(int[] original, int from, int to):
6, 比较两个数组是否相同。
equals(int[],int[]);
7, 将数组变成集合。
List asList(T[]);
这样可以通过集合的操作来操作数组中元素,但是不可以使用增删方法,add,remove。因为数组长度是固定的,会出现UnsupportOperationExcetion。可以使用的方法:contains,indexOf。
如果数组中存入的基本数据类型,那么asList会将数组实体作为集合中的元素。
如果数组中的存入的引用数据类型,那么asList会将数组中的元素作为集合中的元素。