单列集合的顶层接口是java.util.Collection
将集合转成数组的方法是toArray()
线程不安全===线程不同步
遍历的方法有迭代(有并发问题,List会出现异常,Set不会出现异常(List可以用迭代器添加)),for循环加size和get方法(无并发问题),还有增强for循环(有并发问题,都会出现异常)输出为[T1,T2,…]
List:存储的对象是有序的(集合中对象的顺序和添加对象的顺序是一致的),可以重复的,元素可以有多个null
ArrayList:底层使用的数据结构是数组,线程不安全的(不是线程同步的,可以多个线程来对其进行操作),查找速度快,增删速度慢,初始容量为10
LinkedList:底层使用的数据结构是链表,线程不安全的,查找速度慢,增删速度快
Vector:底层使用的数据结构是数组,线程安全的,查找速度快,增删速度慢,(可以用枚举来遍历$Vector.elements(),且没有并发问题)
Set:元素是无序,元素不可以重复((地址相同||equals()方法相等)&&hashCode()的值相等的两个元素重复)(元素重复时不报错,但不会存入),元素最多有一个可以为null
HashSet:无序的,线程不安全的,
LinkedHashSet:有序性,线程不安全的
TreeSet:线程不安全的,自然排序,元素不可以为null(利用CompareTo()方法(升序排序))
存储到TreeSet集合中的对象必须实现Comparable接口
List:特有方法,可以操作下标,有特定的迭代器ListIterator(有add方法,不会出现并发问题,可以边迭代边添加,添加完成后迭代器并不会立刻输出)
增:
void add(intindex, E element)
booleanaddAll(int index, Collection<? extends E> c)
删
E remove(int index)
改
E set(int index, E element)
查
ListIterator<E> listIterator()
返回此列表元素的列表迭代器(按适当顺序)。
ListIterator<E> listIterator(int index)
List<E> subList(int fromIndex, inttoIndex)
E get(int index)
intindexOf(obj):获取指定元素的位置。
LinkedList特有的方法:
addFirst()
addLast()
getFirst()//获取的对象不存在会发生异常
getLast()
removeFirst()//删除的对象不存在会发生异常
removeLast()
从jdk1.6开始出现以下方法
offerFirst()
offerLast()
peekFirst()//获取的对象不存在会返回null
peekLast()
pollFirst()//删除的对象不存在会返回null
pollLast()
自定义泛型的类名不用加<T>
可变参数
public static int add(int ... p){
int sum = 0;
for(int i=0;i<p.length;i++){
sum+=p[i];
}
return sum;
}
Arrays工具类
Arrays.toString(Object[] a) (String类型)
Arrays.sort() (升序排序void)
Arrays.hashCode(Object[]a) (int类型)
Arrays.fill(Object[]a, Object val) (void类型)
Arrays.equals(Object[] a, Object[] a2) (boolean类型)
Arrays.binarySearch(short[] a, short key) (二分法查找索引int类型)
Arrays.asList(T... a) ( 返回一个受指定数组支持的固定大小的列表。List<T>不能改变长度(添加或删除))
Arrays. copyOf(T[]original, int newLength) (返回newLength长度的T数组,复制源数组的值)
集合工具类Collections
Collections.reverse(List<?>list) (反转指定列表中元素的顺序void类型)
Collections.shuffle(List<?>list, Random rnd) (洗牌void类型)
Collections.sort(List<T>list) (根据自然顺序排序)
Collections.synchronizedList(List<T>list) 返回指定列表支持的同步(线程安全的)列表。
Map<K,V>:键key不能重复,最多有一个null,值value可以重复,可以有多个null,输出为{key1=value1,key2=value2,…},(K常为String)
遍历:
Set<K> set=map.keySet();
for(K key : set){
Vvalue=map.get(key);
System.out.println(value);
}
Set<Entry<String,String>> entry = map.entrySet();
for(Entry<String,String> ss : entry){
System.out.println("键:"+ss.getKey()+"值:"+ss.getValue());
}
HashMap:无序的,线程不安全的(不同步的)
TreeMap:根据键值的自然顺序排序,key不可以为null,线程不安全的(不同步的)
Hashtable:无序的,线程同步的(安全的),key和value均不能为null,
LinkedHashMap:有顺序(添加的顺序),不是线程安全的(不同步的)
Map方法:
boolean containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Objectvalue) 如果此映射将一个或多个键映射到指定值,则返回 true。
Set<K> keySet() 将Map映射中的键存储到Set视图的方法
V get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
Collection<V> values() 返回此映射中包含的值的 Collection 视图。
V put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。(返回key的上一个值,正常情况为null)
V remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
void putAll(Map<? extends K,?extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。
boolean isEmpty() 如果此映射不包含键-值映射关系,则返回 true。
HashMap和Hashtable的区别:
都是键值对集合
HashMap允许一个空键和多个空值,Hashtable不允许空键和空值;
HashMap线程不安全(不同步),Hashtable线程安全(同步)
Map集合(映射)和Collectin集合的区别:
①Map集合是键值对的集合,Collection是单一出现的数据的集合;
②Map的键是唯一的,而Collection的子接口List集合中的元素是可以重复的,Set是唯一的;
③Map是夫妻对,Collection是光棍;
④Map输出为{key1=value1,key2=value2,…},Collection输出为[T1,T2,…]
数组与集合的区别:
一:数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。
二:一个数组实例具有固定的大小,不能伸缩。集合则可根据需要动态改变大小。
三:数组是一种可读/可写数据结构没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly只读方式来使用集合。该方法将返回一个集合的只读版本。