为什么要使用集合?
集合的分类:
boolean add(Object obj):添加不存在的元素,返回true,添加存在的元素,返回false。
void clear():移除所有元素
boolean contains(Object obj):判断元素是否存在
boolean isEmpty():判空
Iterator iterator():返回当前集合的迭代器
boolean remove(Object obj):移除指定元素
int size():set元素个数
Object[] toArray():转换为Object数组。注意无参方法数组类型不会随着泛型改变而改变。
Object[] toArray(T[] arr):转换为泛型数组。一般用toArray(new T[set.size()])。注意java不会判断类型是否合适,需要自行判断。
先调用hashcode()判断哈希值是否相等,如果相等,再调用equals()判断是否内容是否相等。
如果泛型类是自定义类型,需要重写hashcode()和equals()。
hashcode 是对象的映射地址,而equals()用于比较两个对象。
String中重写hashcode():
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { @Stable private final byte[] value; ... private int hash; // Default to 0 ... // String类对hashCode()的重写 public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i];//相当于转换为31进制的整数值 } hash = h; } return h; } }
public class Vehicle { private String name; private int oil; public int hashCode() { int result = 0; result = result * 31 + name.hashCode(); result = result * 31 + oil; return result; } }
为了简单,一般采用按位与的形式:
@Override public int hashCode() { return name.hashCode() & oil; }
TreeSet实现了SortedSet接口和Set接口,可以自动排序,默认升序。TreeSet的泛型类如果是自定义类,需要实现Comparable接口。
实现Comparable<T>接口需要实现int compareTo(T t)方法,这个方法中返回1代表升序,返回-1代表降序,返回0代表相等。
实现Comparable<T>接口需要实现int compareTo(T t1,T t2)方法,这个方法中返回1代表升序,返回-1代表降序,返回0代表相等。
List接口是元素有序且可以重复的。
常用方法:
void add(int index,Object o):指定位置插入元素
Object get(int index):获取下标的元素
int indexOf(Object o):获取元素第一次出现的下标
int lastIndexOf(Object o):获取元素最后一次出现的下标
Object remove(int index):删除下标的元素
Object set(int index,Object o):修改下标的元素
实现类:
LinkedList常用方法:
void addFirst(Object o):链表头插入元素
void addLast(Object o):链表尾插入元素
Object getFirst():返回第一个元素
Object getLast():返回最后一个元素
Object removeFirst():删除第一个元素
Object removeLast():删除最后一个元素
boolean hasNext():是否有下一个可迭代元素
Object next():获取下一个元素
void remove():删除上一个元素。(必须先使用next())
在之前使用集合的时候,装入集合的各种类型的元素都被当作 Object 对待,而非元素自身的类型。因此从集合中取出某个元素时,就需要进行类型转换,这种做法效率低下且容易出错。泛型解决了这个问题。
泛型类型必须是对象类型,不能是基本类型。
void sort(List list):默认升序排序元素。使用内部比较类的compareTo()。
void sort(List list, Comparator c):使用自定义的比较规则排序元素。
void shuffle(List list):打乱元素的顺序
void reverse(List list):反转元素顺序
Object max(Collection coll):获得集合中最大值
Object min(Collection coll):获得集合中最小值
int binarySearch(List list,Object o):二分查找队列元素
int indexOfSubList(List source,List target):如果target是source的一个子集合,那么返回第一次出现的下标,否则返回-1
int lastIndexOfSubList(List source,List target):如果target是source的一个子集合,那么返回最后一次出现的下标,否则返回-1
void copy(List dest,List src):复制队列
void fill(List list,Object o):填充队列
boolean replaceAll(List list,Object old,Object new):替换所有值为old的元素
void swap(List list,int i,int j):交换下标的元素
Arrays 类是操作数组的工具类,和 Collections 工具类相似,Arrays 类主要有以下功能:
Object put(Object key,Object value):将指定键值对(key 和 value)添加到 Map 集合中,如果此 Map 集合以前包含一个该键 key 的键值对,则用参数 key 和 value 替换旧值。
Object get(Object key):返回指定键 key 所对应的值,如果此 Map 集合中不包含该键 key,则返回 null。
Object remove(Object key):如果存在指定键 key 的键值对,则将该键值对从此 Map 集合中移除。
Set keySet():返回此 Map 集合中包含的键的 Set 集合。
Collection values():返回此 Map 集合中包含的值的 Collection 集合。
boolean containsKey(Object key):如果此 Map 集合包含指定键 key 的键值对,则返回 true。
boolean containsValue(Object key):如果此 Map 集合将一个或多个键 key 对应到指定值,则返回 true。
int size():map中元素个数。