Java.util包源码学习
java.util包接口
util包主要提供了集合、日历和随机数的工具包。
集合的两个super接口collection和map
Collection接口
public interface Collection<E> extends Iterable<E> {
Collection 的子接口:List、Set、Queue接口
a) Collection的方法:参考链接
- 添加功能
i. boolean add(object obj)添加一个元素
ii. boolean addAll(Collection c)将集合c的全部元素添加到原集合元素后返回true
iii. 添加功能永远返回true - 删除功能
i. void clear();移除所有元素
ii. boolean remove(Object o)移除一个元素
iii. boolean removeAll(Collection c)移除一个集合的元素,只要有一个被移除就返回true,改变原集合,删除原集合中和c中相同的元素
iv. 删除功能只有删除成功后才返回true - 判断功能
i. boolean contain(object o)判断集合中是否包含指定的元素。
ii. boolean containsAll(Collection c)判断原集合中是否包含指定集合c的所有元素,有则true,
iii. boolean isEmpty()判断集合是否为空 - 获取功能
i. Iterator iterator()迭代器,集合的专用方式,实现遍历的功能
ii. Object next()获取当前元素,并移动到下一个位置
iii. boolean hasNext()判断此位置是否有元素
iv. 迭代器遍历实例在下面 - 长度功能
i. int size()元素的个数
ii. 数组和字符串中都是length()方法获取元素个数,集合中是size()方法
因为object包括集合、字符串、数组,所以其不能直接用length方法。 - 交集功能boolean retainAll(Collection c)
两个集合交集的元素给原集合,并判断原集合是否改变,改变则true,不变则false - 把集合转换为数组
i. Object [] toArray()
List接口
public interface List<E> extends Collection<E> {
List接口对Collection进行了简单的扩充,它的具体实现类常用的有ArrayList和LinkedList。你可以将任何东西放到一个List容器中,并在需要时从中取出。ArrayList从其命名中可以看出它是一种类似数组的形式进行存储,因此它的随机访问速度极快,而LinkedList的内部实现是链表,它适合于在链表中间需要频繁进行插入和删除操作。在具体应用时可以根据需要自由选择。前面说的Iterator只能对容器进行向前遍历,而ListIterator则继承了Iterator的思想,并提供了对List进行双向遍历的方法。参考链接
常用实现类:
ArrayList、LinkList、Vector 三个类
ArrayList:快速访问使用-动态数组
LinkedList:增加删除适用-链表
Vector:线程安全使用
特点
- List集合是有序的,有序就是怎么存就怎么取出来,顺序不会乱
- 元素可以重复,就是你放进去一个了你还可以放一个相同的
- List 集合是有索引的Index每个元素唯一对应一个index
List方法
List list = new ArrayList(); //声明list
list.add("aa"); //向列表尾部插入指定元素
list.add(1, "bb"); //向列表指定位置插入指定元素,索引从0开始
list.addAll(new ArrayList()); //追加指定 collection中的所有元素到此列表的结尾
list.clear(); //从list中移除所有元素
list。contains("cc"); //若list包含指定元素返回true
list.equals(new ArrayList()); // 比较指定的对象与列表是否相等
list.get(0); // 返回列表中指定位置的元素
list.toArray(); // 返回以正确顺序包含列表中的所有元素的数组
list.indexOf("aa"); // 返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1
list.lastIndexOf("dd"); // 返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回 -1
list.isEmpty(); // 如果列表不包含元素,则返回 true
list.remove(0); // 移除列表中指定位置的元素
list.remove("lwc"); // 移除列表中出现的首个指定元素
list.removeAll(new ArrayList()); // 从列表中移除指定 collection中包含的所有元素
list.set(0, "lp"); // 用指定元素替换列表中指定位置的元素
list.size(); // 返回列表中的元素数
list.subList(1, 2); // 返回列表中指定的fromIndex(包括)和toIndex(不包括)之间的部分视图
list.hashCode(); // 返回列表的哈希码值
list.toArray(new String[] {
"a", "b" }); // 返回以正确顺序包含列表中所有元素的数组
Set接口
public interface Set<E> extends Collection<E> {
Set接口也是Collection的一种扩展,而与List不同的时,在Set中的对象元素不能重复,也就是说你不能把同样的东西两次放入同一个Set容器中。它的常用具体实现有HashSet和TreeSet类。HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方法,它使用了前面说过的哈希码的算法。而TreeSet则将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用类Comparable和Comparator。一个类是可排序的,它就应该实现Comparable接口。有时多个类具有相同的排序算法,那就不需要在每分别重复定义相同的排序算法,只要实现Comparator接口即可。集合框架中还有两个很实用的公用类:Collections和Arrays。Collections提供了对一个Collection容器进行诸如排序、复制、查找和填充等一些非常有用的方法,Arrays则是对一个数组进行类似的操作。
实现类
HashSet、TreeSet
HashSet:快速访问使用-哈希表-
TreeSet:排序使用-红黑树
特点
- 不包含重复元素
- 集合中的元素是无序的
List和Set的区别
- List有序、set无序
- List可以重复、set不可以重复
- List可以下表访问、set不可以
Queue接口
public interface Queue<E> extends Collection<E> {
队列,先进先出
Queue用于模拟"队列"这种数据结构(先进先出 FIFO)。队列的头部保存着队列中存放时间最长的元素,队列的尾部保存着队列中存放时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素,队列不允许随机访问队列中的元素。
E poll();//出队
Map接口
public interface Map<K,V> {
Map是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射。对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的。当然在使用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。对于值对象则没有唯一性的要求。你可以将任意多个键都映射到一个值对象上,这不会发生任何问题(不过对你的使用却可能会造成不便,你不知道你得到的到底是那一个键所对应的值对象)。Map有两种比较常用的实现:HashMap和TreeMap。HashMap也用到了哈希码的算法,以便快速查找一个键,TreeMap则是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。键和值的关联很简单,用pub(Object key,Object value)方法即可将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所对