阅读目录
1.集合
为什么要使用集合?
数组是定长的,可拓展性差
数组中经常有空余位置,造成空间的浪费,同时也不能获得实际元素个数
数组中元素是连续存在的,移动元素的效率很低
集合的分类:
Collection:是Iterable接口的子接口,主要有List、Queue、Set子接口
Map:主要有HashMap、TreeMap、HashTable三种实现类。
2.Set的方法:
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不会判断类型是否合适,需要自行判断。
3.HashSet如何判断元素存在?
先调用hashcode()判断哈希值是否相等,如果相等,再调用equals()判断是否内容是否相等。
如果泛型类是自定义类型,需要重写hashcode()和equals()。
hashcode 是对象的映射地址,而equals()用于比较两个对象。
4.如何重写hashcode()
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;
}
5.TreeSet
TreeSet实现了SortedSet接口和Set接口,可以自动排序,默认升序。TreeSet的泛型类如果是自定义类,需要实现Comparable接口。
6.内部比较器:Comparable接口
实现Comparable接口需要实现int compareTo(T t)方法,这个方法中返回1代表升序,返回-1代表降序,返回0代表相等。
7.外部比较器:Comparator接口
实现Comparable接口需要实现int compareTo(T t1,T t2)方法,这个方法中返回1代表升序,返回-1代表降序,返回0代表相等。
8.List
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):修改下标的元素
实现类:
ArrayList 实现了 List 接口,其底层采用的数据结构是数组。更适合元素访问。
LinkedList,它在存储方式上采用双端链表进行链式存储。更适合修改元素。
LinkedList常用方法:
void addFirst(Object o):链表头插入元素
void addLast(Object o):链表尾插入元素
Object getFirst():返回第一个元素
Object getLast():返回最后一个元素
Object removeFirst():删除第一个元素
Object removeLast():删除最后一个元素
9.Iterator接口
boolean hasNext():是否有下一个可迭代元素
Object next():获取下一个元素
void remove():删除上一个元素。(必须先使用next())
10.泛型
在之前使用集合的时候,装入集合的各种类型的元素都被当作 Object 对待,而非元素自身的类型。因此从集合中取出某个元素时,就需要进行类型转换,这种做法效率低下且容易出错。泛型解决了这个问题。
泛型类型必须是对象类型,不能是基本类型。
11.Collections工具类
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):交换下标的元素
12.Arrays工具类
Arrays 类是操作数组的工具类,和 Collections 工具类相似,Arrays 类主要有以下功能:
对数组进行排序。
给数组赋值。
比较数组中元素的值是否相等。
进行二分查找。
13.Map接口常用方法
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中元素个数。