集合
LIST
List 有序,可重复
- ArrayList 数组结构,访问效率高,操作效率低
- 以数组实现,但数组有容量限制。超出限制时会增加50%的容量,用System.arraycopy()复制到新数组。默认第一次插入元素时创建大小为10的数组
- 按数组下标访问元素,性能很高,这是数组的基本优势。按下标插入删除,则要用System.arraycopy()来复制移动部分受影响的元素,性能就变差了,越是靠前,修改时要移动的元素越多。直接在末尾添加或删除则无影响
- LinkedList 链表结构,访问效率低,操作效率高
- 以双向链表实现,链表无容量限制,但双向链表本身使用了很多空间,每插入一个元素都要构造一个额外的Node对象,也需要额外的链表指针操作
- 按数组下标访问元素,要部分遍历链表将指针移动到位(如果i>数组大小的一半,会从末尾移起)。插入删除时,修改前后节点的指针即可,不需要复制移动,但还是要部分遍历链表的指针才能移动到下标所指的位置。只有在链表两头的操作,能省掉指针的移动
ArrayList常用方法
toArray() 返回一个包含集合所有元素的Object数组
add(E e) 增加元素
addAll(Collection c) 将集合里的所有元素追加到后面
size() 集合大小
isEmpty() 集合不包含元素,返回true
contains(Object o) 包含元素返回true
set(int index,E element) 将元素替换到指定位置
get(int index) 返回集合指定的元素
indexOf(Object o) 返回此列表中指定元素的第一个出现的索引,如果此列表不包含元素返回-1
lastIndexOf(Object o) 返回此列表中指定元素的最后一个出现的索引,如果此列表不包含元素返回-1
remove() 移除元素
removeAll(Collection c) 移除集合中的所有元素
clear() 移除所有元素
isEmpty 与 null
isEmpty()和size()==0是等价的,都是判断元素是否为空
直接看代码
ArrayList al1 = new ArrayList();
ArrayList al2 = null;
System.out.println(al1==null);
System.out.println(al1.isEmpty());
System.out.println(al2==null);
// System.out.println(al2.isEmpty()); -->NullPointerException
运行结果为:
false
true
true
- isEmpty()对象在内存中有被分配空间,只是对象的内部没有内容而已。isEmpty()等价于size()==0
- null表示对象在内存中没有被分配空间,在通过 . 调用属性或方法时会出现NullPointerException
SET
Set 无序,不重复
- HashSet 允许null
- TreeSet 不允许null 只当需要产生一个经过排序的序列时,才有TreeSet
Set的三种遍历方式:
- Iterator it = hashSet.iterator();
- for each
- Object[] array = hashSet.toArray();
Iterator it = hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("-------");
//---2-------------------------------------------------------
for (Object obj : hs) {
System.out.println(obj);
}
System.out.println("-------");
//---3-------------------------------------------------------
Object[] array = hs.toArray();
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
MAP
Map 映射 键值对
HashMap 允许存在null 不安全 重新计算hash值,用于代替求模 hash数组默认大小16,2的指数 基于 AbstractMap类
HashTable 都不允许有null 安全 直接使用对象的hashCode hash数组默认大小11,old*2+1 基于Dictionary类
TreeMap 键不允许有null
put(K key , V value) 添加键值对
get(Object key) 返回指定键的值
contains(Object key) 否存有这个键,有true, 无false
contains(Object value) 否存有这个值
Set keySet() 返回键的一个Set集合
Collection values() 返回一个值的Collection
Set entrySet() 返回一个以键值对形式的Set集合 以 key=value 的形式返回