集合
数组就是一个集合,集合实际上就是一个容器。
集合不能直接存储基本数据类型,另外集合也不能直接存储java对象,集合当中存储的都是java对象的内存地址。
Collection
Collection中的常用方法
Collection c = new ArrayList();
-
boolean add(Object e) 想集合中添加元素
-
int size() 获取集合中元素的个数
-
void clear() 清空集合
-
boolean contains(Object o) 判断当前集合中是否包含元素o
contains方法在底层调用了equals方法进行必读
Collection c = new ArrayList(); String s1 = new String("abc"); c.add(s1); String s2 = new String("def"); c.add(s2); String x = new String("abc"); System.out.println(c.contains(x)); //true
-
boolean remove(Object o) 删除集合中的某个元素
底层也调用了equals方法
-
boolean isEmpty() 判断集合是否为空
-
Object toArray() 将集合转换为数组
Iterator
Collection c = new ArrayList();
c.add("abc");
c.add(100);
c.add(new Object());
//1.获取集合对象的迭代器对象Iterator
Iterator it = c.iterator();
//2.通过以上获取的迭代器对象开始迭代/遍历集合
/*
boolean hasNext() 如果仍有元素可以迭代,则返回true
Object next() 返回迭代的下一个元素
*/
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
当集合中的元素变动需要重新获取迭代器
在迭代元素的过程中,一定要使用迭代器Iterator的romove方法删除元素,不能使用集合自带的remove方法删除
List
存储元素的特点:有序可重复
List中特有的常用方法
-
void add(int index, Object element)
在列表指定位置插入元素
-
Object get(int index)
根据下标获取元素
-
int indexOf(Object o)
获取指定对象第一次出现处的索引
-
int lastIndexOf(Object o)
获取指定对象最后一次出现处的索引
-
Object remove(int index)
删除指定下标位置的元素
-
Object set(int index, Object element)
修改指定位置元素
ArrayList
ArrayList集合底层是Object数组,是非线程安全的
初始化容量是10(底层先创建一个长度为0的数组,当添加第一个元素的时候初始化容量10)
扩容是扩容到原容量的1.5倍,建议给定一个预估的初始化容量,减少数组的扩容次数,这是ArrayList集合比较重要的优化策略
检索效率比较高,随机增删效率比较低,另外数组无法存储大数据量(很难找到一块非常大的内存空间)
LinkedList
LinkedList集合底层采用了双向链表数据结构
链表优点:由于链表上的元素在空间存储上内存地址不连续,所以随机增删元素的时候不会有大量有大量元素移动,因此随机增删效率较高。
链表缺点:不能通过数学表达式计算被查找的元素的内存地址,每一次查找都是从头节点开始遍历,直到找到为止。
Set
HashSet
无序不可重复
存储时顺寻和取出的顺序不同
放到HashSet集合中的元素实际上是放到HashMap集合的key部分
TreeSet
无需不可重复,但是存储的元素可以自动按照大小顺序排序成为:可排序集合
Map
Map集合和Collection集合没有关系
Map集合以key和value的这种键值对的方式存储元素
key和value都是存储java对象的内存地址
所有Map集合的key特点:无需不可重复
Map中的常用方法
-
V put(K key, V value)
向Map集合中添加键值对
-
V get(Object key)
通过key获取value
-
void clear()
清空Map集合
-
boolean containsKey(Object key)
判断Map中是否包含某个key
-
boolean containsValye(Object value)
判断Map中是否包含某个value
-
boolean isEmpty()
判断Map集合中元素个数是否为0
-
Set keySet()
获取Map集合所有的key(所有的键是一个set集合)
-
V remove(Object key)
通过key删除键值对
-
int size()
获取Map集合中键值对的的个数
-
Collection values()
获取Map集合中所有的value,返回一个Collection
-
Set<Map.Entry<K,V>> entrySet()
获取Map集合中所有的value,返回一个Collection
map -------------------- 1 zhangshan 2 lisi 3 wangwu 4 zhouliu Set set = map.entrySet(); set集合对象 1=zhansgan 2=lisi 3=wangwu 4=zhaoliu //Map集合通过entrySet()方法转换成这个Set集合,Set集合中元素的类型是Map.Entry<K,V> //Map.Entry和String一样,都是一种类型的名字,只不过Map.Entry是Map静态内部类
HashMap
HasMap集合底层是哈希表数据结构,是非线程安全的。
在JDK8以后,如果哈希单向链表中元素超过8个,单向链表这种数据结构会变成红黑树数据结构,当红黑树上的节点数量小于6以后,会重新把红黑树变成单向链表数据结构。
HasMap集合的默认初始化容量是16,默认加载因子是0.75(默认加载因子是当HashMap集合底层数组的容量达到75%的时候,数组开始扩容)
HashMap集合初始化容量必须是2的倍数,这也是官方推荐的,这是因为达到散列均匀,为了提高HashMap集合的存取效率所必需的