文章目录
1.List
1.1基本方法
- List的行为根据equals的行为有所变化
contansAll()
会遍历传入的List
并调用源List
的contains()
进行比较,无关顺序subList()
的操作都是针对源List
,包括subList.get()
方法都是基于源List
,偏移量(fromIndex
)加上索引值
方法 | 功能 |
---|---|
contains() | 传入对象引用,确定某个对象是否在列表中 |
containsAll() | 传入待比较的List ,如果被包含则返回Ture ,与顺序无关 |
get() | 获取指定索引的对象引用 |
add() | 添加元素到数组中 |
addAll(index,subList) | 将目标List 插入到指定的位置上 |
remove() | 传入对象引用,移除该对象 |
removeAll() | 从源List 中移除所有的目标List ,基于equals() |
indexOf() | 传入对象引用,获取对象在列表的索引 |
subList() | 传入起始、结束索引,获取子列表,但是一切的操作都是针对源List |
retainAll() | 保留了所有同时存在于源List、目标List 中的元素 |
isEmpty() | 判断是否为空数组 |
clear() | 清除数组内容 |
toArray() | 将List 变为Array |
1.2基本子类
1.2.1 ArrayList
ArrayList
:长于随机访问元素,但是插入和移除元素速度慢,有关删除和插入的操作与System.arraycopy
有关。
该方法的主要作用是复制
src
数组从srcPos
开始的length
长度的内容,复制到dest
目标数组中destPos
开始到destPost+length
范围。如果src=dest
那么就是对源数组进行操作
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
ArrayList
remove的本质:将i位置的值覆盖掉,就地覆盖
System.arraycopy(es, i + 1, es, i, newSize - i);
常用方法
-
构造方法:
方法 作用 ArrayList() 无参构造方法,创建空[] ArrayList(Collection<? extends E> c) 利用Arrays.copyOf(c.toArray())创建相应类型的内部数组 ArrayList(int initialCapacity) 根据给定的 initialCapacity
创建指定大小的内部数组 -
增
由于java不支持改变数组长度,所以该操作都涉及到创建新数组,复制原数组元素到新数组的操作,创建新数组操作Object[] grow(int minCapacity)
(内部具体方法是Arrays.copyOf()
),复制操作为System.arraycopy()
,方法 作用 boolean add(E e) 新增元素到新数组末尾 void add(int index, E element) 将元素插入到数组的指定位置,将index开始的元素复制到index+1开始的位置 boolean addAll(Collection<? extends E> c) 将c插入到内部数组末尾. System.arraycopy(a, 0, elementData, s, numNew);
boolean addAll(int index, Collection<? extends E> c) 将c插入到内部数组index开始的位置,原处于index后的元素后移 -
删
方法 作用 void clear() 将size设为0,内部数组元素全部指向null E remove(int index) 删除index位置的元素(fastRemove) boolean remove(Object o) o.equals比较,删除第一个内容相等的元素(fastRemove) boolean removeAll(Collection<?> c) 删除被c包含的元素(首先原数组修改,然后使用shiftTailOverGap,复制出无尾部元素的新数组) boolean removeIf(Predicate<? super E> filter) 删除所有符合条件的元素(首先原数组修改,然后使用shiftTailOverGap,复制出无尾部元素的新数组) boolean retainAll(Collection<?> c) 保留所有被c包含的元素,删除其他元素(batchRemove(c, true, 0, size)) -
改
方法 作用 void ensureCapacity(int minCapacity) 若内部数组大小小于minCapacity则增加数组长度 E set(int index, E element) 修改index位置的元素 -
查
方法 作用 E get(int index) 获取index位置的元素 int indexOf(Object o) 返回第一个equals的元素的索引,不存在元素则返回-1 int lastIndexOf(Object o) 获取从尾部开始第一个equals的元素的index boolean isEmpty() 是否为空,检查size是否等于0 boolean contains(Object o) 直接调用indexOf方法,大于等于0则表示元素存在于内部数组中 size() 返回内部维护的成员变量size List< E > subList(int fromIndex, int toIndex) 返回子数组 Object[] toArray() 返回ArrayList的数组形式 T[] toArray(T[] a) 将当前ArrayList对象维护填充到a数组中。T应该与源数组一致。
1.2.2 LinkedList
LinkedList
链表操作,以较低的代价在List中间进行插入和删除操作,提供优化的顺序访问
2. Set
对于每个值只保存一个,不重复保存
HashSet
:以相当复杂的方式存储元素,提供最快的元素获取方式,但是数据存储无序
以HashMap
保存数据,通过add
方法插入的数据作为HashMap的键存储,无get
方法,contain()
方法也仅判断数据在HashMap
是否作为建存在
TreeSet
按照比较结果的升序保存数据
LinkedHashSet
按照被添加的顺序保存对象
3. Map
3.1基本方法
方法 | 功能 |
---|---|
size() | 返回当前持有的键值对数量 |
isEmpty() | 当前是否持有键值对 |
containsKey(Object o)/containsValue(Object o) | 是否持有该键/值 |
get(Object key) | 取得键对应的值,如果没有则返回null |
put(K key, V value) | 将键值对保存到容器中,若键已存在,对应的值将会被更新 |
remove(Object key) | 删除键值对,如果不存在返回null,否则返回被删除的值 |
putAll(Map<? extends K, ? extends V> m) | 遍历m,将键值对put进Map |
clear() | 清空数组 |
Set keySet() | 返回Map的所有键,(The set is backed by the map, so changes to the map are reflected in the set, and vice-versa) |
Collection values() | Returns a Collection view of the values contained in this map. The collection is backed by the map, so changes to the map are reflected in the collection, and vice-versa. |
Set<Map.Entry<K, V>> entrySet() | 获取map映射关系,修改会影响到Map |
interface Entry<K, V>.getKey() | 获取Entry对应的键 |
interface Entry<K, V>.getValue() | 获取Entry对应的值 |
3.1.1 遍历Map的一种方法
public static void main(String[] args) {
Map<String,Object> map = new HashMap<>();
map.put("name","adfadf");
map.put("age","24");
map.put("phone","15912312228");
System.out.println(map.entrySet());
for (Map.Entry<String,Object> e:map.entrySet()){
System.out.println(e.getKey());
System.out.println(e.getValue());
}
}
3.1.2 修改会影响到Map
The set is backed by the map, so changes to the map are reflected in the set, and vice-versa.
public static void main(String[] args) {
Map<String,Object> map = new HashMap<>();
map.put("name","adfadf");
map.put("age","24");
map.put("phone","15912312228");
System.out.println(map.entrySet());
for (Map.Entry<String,Object> e:map.entrySet()){
System.out.println(e.getKey());
System.out.println(e.getValue());
e.setValue(e.getValue()+"_abc");
}
System.out.println(map);
}
//======== 输出
//[phone=15912312228, name=adfadf, age=24]
//phone
//15912312228
//name
//adfadf
//age
//24
//{phone=15912312228_abc, name=adfadf_abc, age=24_abc}
3.2基本子类
HashMap
提供了最快的查找速度,但是不保证元素顺序
TreeMap
按照比较结果的升序保存。
LinkedHashMap
按照插入的顺序保存元素,同时保留了HashMap
的查找速度