Collection 是一个接口
The JDK does not provide any direct implementations of this interface, it provides implementations of more specific sub interfaces like Set and List.
Queue 是接口
Set 不包含重复元素的collection,是接口
/** 仅保留此 collection (s1)中那些也包含在指定 collection (s2)的元素(可选操作) 换句话说,移除此 collection 中未包含在指定 collection 中的所有元素。
* */
s1.retainAll(s2);
/**在数据量较小时,add方法配合for循环遍历比addAll来得快.
* 但是在大量数据时,addAll的方法的效率更高.
* list.addAll()是浅拷贝,只是将内存中的地址进行了拷贝,指向了原先list的末尾做了拼接.
* */
s1.addAll(s2);
HashSet:无序,可以包括null
TreeSet:有序(继承SortedSet,),不能有null
List 有序的collection,也继承Iterable,是接口
LinkedList
ArrayList
/** LinkedList通常比ArrayList快
* LinkedList是一个由相互引用的节点组成的双向链表
* 当把数据插入至该链表某个位置时,该数据就会被组装成一个新的节点,
* 随后只需改变链表中对应的两个节点之间的引用关系,使它们指向新节点,即可完成插入
* 同样的道理,删除数据时,只需删除对应节点的引用即可
*
* 而ArrayList是一个可变长数组
* 插入数据时,则需要先将原始数组中的数据复制到一个新的数组,
* 随后再将数据赋值到新数组的指定位置
* 删除数据时,也是将原始数组中要保留的数据复制到一个新的数组
* */
Map<k,v> 是一个接口
A map cannot contain duplicate keys; each key can map to at most one value
SortedMap
AbstractMap
HashMap: 无序
遍历时,取得数据的顺序是完全随机的最多只允许一条记 录的键为Null;允许多条记录的值为 Null
LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现
TreeMap:有序
也实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
HashTable:线程安全
HashMap允许put进来一个null键
HashTable则不允许,put进来null键后抛异常
Collections 和Arrays都是类
Collections 是集合的一个工具类/帮助类
用于对集合中元素进行排序、搜索以及线程安全等各种操作
//其中提供了一系列 静态方法,属于该类本身,不需依靠实例化出instance才能调用
Collections.sort(list1);
Collections.rotate(list1,-1); //如果是负数,则正向移动,正数则方向移动
Collections.shuffle(l1); //随机排列
1) 排序(Sort)
2) 混排(Shuffling)
3) 反转(Reverse) 使用Reverse方法可以根据元素的原始顺序 对指定列表按降序进行排序。
4) 替换所以的元素(Fill) 使用指定元素替换指定列表中的所有元素。
Collections.fill(li,"aaa");
5) 拷贝(Copy)
6) 返回Collections中最小元素(min)
7) 返回Collections中最小元素(max)
8) lastIndexOfSubList 返回指定源列表中最后一次出现指定目标列表的起始位置
9) IndexOfSubList 返回指定源列表中第一次出现指定目标列表的起始位置
10) Rotate 根据指定的距离循环移动指定列表中的元素
Arrays 看起来是数组的一个工具类/帮助类
可以sort,search,toString啥的
equals() vs ==
==
基本类型Primitive Type:比较value
引用类型Reference type:比较地址
* 基本类型:
* 四种整数类型(byte、short、int、long)
* 两种浮点数类型(float、double)
* 一种字符类型(char)
* 一种布尔类型(boolean)
//数字的比较
* jvm在运行时创建了一个缓存区域,并创建了一个integer的数组。这个数组存储了-128至127的值。
* 因此如果integer的值在-128至127之间,则是去缓存里面获取。
//字符串的比较
* String的字符串“+”(拼接)其实是new了一个StringBuilder对象,
* 并执行其append方法实现拼接,最后通过其toString方法返回一个字符串对象。
equals()
在Object类里的实现如下,即跟==一样的
public boolean equals(Object obj){
return(this==obj);
}
equals()与hasCode()相关
* String类中有 private final char value[] 用于character存储
* String的hashCode()用hash法计算散列码,31作为散列系数
* 注意:不同String的hashCode()可能相同
Comparable vs Comparator
Comparable 是一个排序接口
若一个类实现了Comparable接口,就意味着该类支持排序
package java.lang;
import java.util.*;
public interface Comparable<T>
{
public int compareTo(T o);//this-o
}
Comparator 是一个比较接口
如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序
package java.util;
public interface Comparator<T>
{
int compare(T o1, T o2);//o1-o2 和汇编at&t相反
boolean equals(Object obj);//equals()与类的hasCode()相关
}
Iterator 和其子类 ListIterator
都是接口
package java.util;
import java.util.function.Consumer;
public interface Iterator<E> {
boolean hasNext();
E next();//JDK没有给这两个方法提供任何实现
default void remove() {
throw new UnsupportedOperationException("remove");
}
}
package java.util;
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int previousIndex();
void remove();
void set(E e);
//有add耶
void add(E e);
}