文章目录
集合(Collection)
Java中集合类是用来存放对象的
集合相当于一个容器,里面包含着一组对象——容器类
其中的每个对象作为集合的一个元素出现
Java API提供的集合类位于java.util包内
Java中集合框架层次结构:
集合接口:
方法 | 含义 |
---|---|
boolean add(Object) | 集合中加入一个对象,成功时返回true |
boolean addAll(Collection) | 集合中加入另外一个集合对象 |
int size() | 集合内容纳的元素数量 |
boolean isEmpty() | 集合是否为空 |
boolean contains(Object) | 集合内是否含有参数对象 |
Iterator iterator() | 产生一个迭代器 |
Object[] toArray() | 返回一个包含所有元素的对象数组 |
我们平时自己设计工具类时,像add这样的方法要给返回值,调用的时候可以看是否添加成功。
集合在工作中用得很多…
工具类里面有很多重载(不同参数类型、列表)。我们自己设计工具类时,完成同一功能的方法用重载。
调用现成的比自己写的快…
Set接口
包含一组无序无重复的对象 。
Set接口的实现类:
HashSet:特性在于其内部对象的散列存取,即采用哈希技术。
TreeSet:存入的顺序与存储的顺序不同,存储是按照排序存储的。(存时没顺序,存进去就有顺序了,自然排序-从小到大。
对于筛去重复对象的,直接加到Set中(舍了if)
List接口
包含一组有序有重复的对象。
List集合的实现类:ArrayList、LinkedList
存储结构:ArrayList是线性顺序存储;LinkedList对象彼此串联起来的一个链表。
操作性能:ArrayList适合随机查询的场合;LinkedList元素的插入和删除操作性高。
从功能上,LinkedList要多一些。
LinkedList
方法 | 含义 |
---|---|
void addFirst(Object o) | 将给定元素插入此列表的开头 |
void addLast(Object o) | 将给定元素追加到此列表的结尾 |
Object getFirst() | 返回此列表的第一个元素 |
Object getLast() | 返回此列表的最后一个元素 |
Object removeFirst() | 移除并返回此列表的第一个元素 |
Object removeLast() | 移除并返回此列表的最后一个元素 |
Iterator接口
所有实现了Collection接口的集合类都有一个 iterator( )方法,返回一个实现了Iterator接口 的对象。
方法 | 含义 |
---|---|
Object next() | 返回游标右边的元素并将游标移动到下一个位置 |
boolean hasNext() | 判断游标右边是否有元素 |
void remove() | 删除游标左边的元素,在执行完next之后,该操作只能执行一次 |
Collections类
集合操作的工具类
方法 | 含义 |
---|---|
Object max(Collection c, Comparator comp) | max算法采用Comparator比较算法 |
Object max(Collection c) | 返回集合中的最大元素,需要考虑比较接口的实现 |
Object min(Collection c) | 返回集合中的最小元素 |
void reverse(Collection c) | 把集合中的元素顺序反转 |
void copy(List dest, List src) | src集合中元素复制到dest集合 |
void fill(List list, Object o) | 填充list集合,填充元素为o |
int binarySearch(List list, Object key) | 对排序后的集合list进行查询元素操作 |
void sort(List list) | 对一种List做排序 |
Map接口
HashMap:key/value对是按照Hash算法存储的。
TreeMap:key/value对是排序(按key排序)存储的。
key值是唯一的(不能重复),而key对象是与value对象关联在一起的。
key一般用简单类型(int),虽然它也能是Object,但是用int的很多,方便。
方法 | 含义 |
---|---|
Object put(Object key, Object value) | 将制定的值与此映射中的指定键相关联 |
void putAll(Map t) | 将映射t中所有映射关系复制到此映射中 |
Object get(Object key) | 返回此映射中映射到指定键的值 |
Object remove(Object key) | 若存在此键的映射关系,将其从映射中移除 |
boolean containsKey(Object key) | 若此映射包含指定键的映射关系,返回true |
boolean containsValue(Object key) | 若此映射为指定值映射一个或多个键,返回true |
HashMap与TreeMap的比较
- HashMap基于哈希表实现;TreeMap基于树实现。
- HashMap可以通过调优初始容量和负载因子,优化HashMap空间的使用;TreeMap没有调优选项,因为该树总处于平衡状态。
- HashMap性能优于TreeMap。
用HashMap建图书信息:Book,id,name,author,ISBN。
HashMap<key, value>,key为id,value为Book类型。
HashMap比TreeMap灵活,增大负载因子,减少HashMap使用内存空间。
HashMap与HashTable的比较
- HashTable是基于陈旧的Dictionary类的;HashMap是Java 1.2引进的Map接口的一个实现。
- HashTable是线程安全的,也就是说是同步的;HashMap是线程不安全的,不是同步的。
- HashMap允许将null作为一个entry的key或value,而HashTable不允许。
集合的那些事
集合类的特点
- Set内存放的元素不允许重复,List存放的元素有一定的顺序。
- Map的应用主要在利用键/值对进行快速查询。
- ArrayList和LinkedList的区别在于随机查询性能上ArrayList要好,但LinkedList的中间元素的插入与删除性能好。
- HashSet和TreeSet的区别在于集合内元素是否排序。
集合中的问题
集合中的add()方法接受的是一个Object对象的参数,在获取集合中的对象时,必须进行造型(强制类型转换)操作。
因为什么类型都可以存进去,再取出来就出问题了,在放进去前限制放入的类型,取出就不需要强制类型转换了。
集合中泛型的使用
- 在对象放入集合前,为其做限制。
- 在获取集合中的对象时,不用进行造型(强制类型转换)操作。
- 当有不同类型的对象添加到集合中的时候,编译时就能检查出错误。
ArrayList<E> 变量名;
E是变量类型
ArrayList<String> arr;
arr = new ArrayList<String>();
HashMap<Integer, String> hm = new HashMap<Integer, String>();