







2)remove可以是一个对象也可以是一个下标
7)addAll可以加入一个新的list
8)containsAll可以查找是否包含一个list


快捷键itit
while (iterator.hasNext()) {
Object next = iterator.next();
}
注意:当退出while循环后,此时迭代器指向最后的元素,如果再取iterator.nxet()会报错,如果仍要使用可以重新让Inerator iterator = list.iterator()

注意:也可以用在数组上


1)add方法第一个参数可以是索引,用来指定插入的位置
2)addAll方法同上
7)set方法相当于指定一个下标,把元素给替换掉
8)subList方法返回的集合是前闭后开的集合

tip:扩容时因为无参,所以临时(0,10)1.5倍;如果有参直接1.5倍





linkedList.add()其实就是l存放当前链表中的尾结点,然后加入新节点(构造器中prev指向了l),l的next指向新节点,节点的添加过程就完成了
linkedList.remove(index),删除指定下标的结点,不加index默认删除下标0的结点

注意:这两个集合都是不安全的,所以推荐在单线程中使用
特点:

注意:不能用传统for遍历




注意:链表长度大于 8,总长度大于 64时树化,如果总长度小于 64 而链长度大于 8 了,会进行扩容(table长度*2)

@Override
//值相同返回true
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
//基本数据类型直接使用==比较值,引用数据类型就用Object的equals方法比较地址
return age == employee.age && Objects.equals(name, employee.name);
}
@Override
//当前对象的name和age值相同就返回相同的hashcode
public int hashCode() {
return Objects.hash(name, age);
}

特点:插入顺序和读取顺序一致

Set的底层是Map,不过只用了Map的key值,value用了常量填充

键值对是匿名内部类HashMap$Node类型的,为了遍历方便map提供的entrySet()方法会返回EntrySet集合,里面存放的元素是Entry类型的,而Entry的key和value分别指向Node的key和value


返回set集合,方便遍历
Set set = hashMap.entrySet();
for (Object o : set) {
System.out.println(((Map.Entry) o).getValue());
}
返回一个Set,里面存放key
返回一个Collection,里面存放value

//法一
Set set1 = map.keySet();
for (Object key : set1) {
System.out.println(key + " " + map.get(key));
}
//法二
Set set2 = map.entrySet();
for (Object entry : set2) {
Map.Entry e = (Map.Entry) entry;
System.out.println(e.getKey() + " " + e.getValue());
}
注意:链表长度大于 8,总长度大于 64时会树化,如果总长度小于 64 而链长度大于 8 了,会进行扩容()table长度*2)







最大的特点是有序的(通过比较器),默认按比如数值、字符(ASCII码值)
补充:LinkedHashSet也是有序的(通过链表维系次序)
public TreeMap(Comparator<? super K> comparator){
this.comparator = comparator
}
if (cpr != null) {//cpr就是我们自己写的匿名内部类(对象)
do {
parent = t;
cmp = cpr.compare(key, t.key);//动态绑定到我们的匿名内部类(对象)
if (cmp < 0)
t = t.left:
else if (cmp > 0)
t = t.right;
else//如果相等,即返回0,这个key就没加入
return t.setValue(value):
} while(t != null);






6)注意是右到左,且长度是List里的size()方法值,我们都知道new ArrayList()初始化的时候size()等于0,即便是你使用new ArrayList(10)来初始化,也只是预设了一个initialCapacity==10的存储空间,size()还是等于0。因此在使用Collections.copy之前,需要把目的List加一些空的元素,直到目的List的size()值与源List的size()值等长(或更长)

4. treeSet会优先使用我们传进去的的Comparator匿名对象,如果没传,会以添加进去的对象实现Comparable接口的compareTo去重,如过传进去的对象没有实现Comparable接口,会报错具体见第五题
5.
// 如果没有传入comparator,会尝试把添加的对象转换成Comparable类型,如果添加的对象没有实现Comparable接口,会报类型转换错误
return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)

