一张图看透容器关系
List简单常用用法
/*
ArrayList和LinkList 线程不安全效率高
Vector线程安全效率低
*/
List list = new ArrayList();
/*add添加的是object类型,这里1被自动装箱为Integer类*/
list.add(1);
list.add(1.2);
list.add("hello");
list.remove(1.2);
/* 输出[1, hello] */
System.out.println(list);
List list2 = new ArrayList();
list2.add("bbb");
list2.add("ccc");
list.add(list2);
/*输出[1, hello, [bbb, ccc]] */
System.out.println(list);
/*get方法默认返回Obeject类,需要强转*/
String s = (String) list.get(1);
HashMap
思路:
用Entry类包装key和value,底层采用数组+链表(链表里的节点是放Entry类)存储,首先将key值的hashCode进行hash映射,映射到数组对应下标的位置里,有两种情况:
- 数组对应位置为空null(即没有产生hash冲突),则在新建链表存在数组对应的位置里,链表的首节点为key。
- 数组对应位置不为空已有链表(即产生hash冲突),则在该链表末尾添加key。
所以,HashMap重写hashCode和equals以防止存入两个相同的key
hashCode():变量的地址,是Integer
注意:Java中规定两个内容相同的对象应该具有相等的hashCode
HashSet
底层实现利用map的key存储(value为Object),因为HashMap的key值不能重复,所以HashSet里的value不能重复
迭代器
List list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
for (Iterator iterator = list.iterator();iterator.hasNext();){
System.out.println(iterator.next());
}
/*
源码:在AbstractList的内部类中
//当前游标
int cursor = 0;
//当前游标的前面 每次利用迭代器执行remove后lastRet都会设为-1 此时再执行remove会出错
int lastRet = -1;
public boolean hasNext() {
return cursor != size();
}
public E next() {
checkForComodification();
try {
int i = cursor;
E next = get(i);
lastRet = i;
cursor = i + 1;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
*/