Java集合
List接口,可以看到几个主要的接口方法:
在末尾添加一个元素:void add(E e)
在指定索引添加一个元素:void add(int index, E e)
删除指定索引的元素:int remove(int index)
删除某个元素:int remove(Object e)
获取指定索引的元素:E get(int index)
获取链表大小(包含元素的个数):int size()
创建List
除了使用ArrayList和LinkedList,我们还可以通过List接口提供的of()方法,根据给定元素快速创建List:
List list = List.of(1, 2,
5);
但是List.of()方法不接受null值,如果传入null,会抛出NullPointerException异常。
始终坚持使用迭代器Iterator来访问List。Iterator本身也是一个对象,但它是由List的实例调用iterator()方法的时候创建的。Iterator对象知道如何遍历一个List,并且不同的List类型,返回的Iterator对象实现也是不同的,但总是具有最高的访问效率。
Iterator对象有两个方法:boolean
hasNext()判断是否有下一个元素,E next()返回下一个元素。因此,使用Iterator遍历List代码如下:
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List list = List.of(“apple”, “pear”,
“banana”);
for (Iterator it = list.iterator(); it.hasNext(); ) {
String s = it.next();
System.out.println(s);
}
}
}
只要实现了Iterable接口的集合类都可以直接用for each循环来遍历,Java编译器本身并不知道如何遍历集合对象,但它会自动把for each循环变成Iterator的调用,原因就在于Iterable接口定义了一个Iterator iterator()方法,强迫集合类必须返回一个Iterator实例。
List和Array转换
第一种是调用toArray()方法直接返回一个Object[]数组。(丢失类型信息)
第二种方式是给toArray(T[])传入一个类型相同的Array,List内部自动把元素复制到传入的Array中:
Integer[] array = list.toArray(new
Integer[3]);
Array变为List就简单多了,通过List.of(T…)方法最简单:
Integer[] array = { 1, 2, 3 };
List list = List.of(array);
对只读List调用add()、remove()方法会抛出UnsupportedOperationException。
List还提供了boolean
contains(Object o)方法来判断List是否包含某个指定元素。此外,int indexOf(Object o)方法可以返回某个元素的索引,如果元素不存在,就返回-1。
编写equals
如何正确编写equals()方法?equals()方法要求我们必须满足以下条件:
自反性(Reflexive):对于非null的x来说,x.equals(x)必须返回true;
对称性(Symmetric):对于非null的x和y来说,如果x.equals(y)为true,则y.equals(x)也必须为true;
传递性(Transitive):对于非null的x、y和z来说,如果x.equals(y)为true,y.equals(z)也为true,那么x.equals(z)也必须为true;
一致性(Consistent):对于非null的x和y来说,只要x和y状态不变,则x.equals(y)总是一致地返回true或者false;
对null的比较:即x.equals(null)永远返回false。
Map
import java.util.HashMap;
import java.util.Map;
Map<String, Student> map = new
HashMap<>();
调用put(K key, V value)方法时,就把key和value做了映射并放入Map,如果放入的key已经存在,put()方法会返回被删除的旧value。
调用V get(K key)时,就可以通过key获取对应的value ,不存在,返回null.
Map也是一个接口
如果查询某个key是否存在,可以调用boolean
containsKey(K key)
遍历Map
for (String key : map.keySet()) {
Integer value = map.get(key);
System.out.println(key + " = " + value);
}
-
for (Map.Entry<String, Integer> entry
- map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " = " + value);
}
以上遍历的时候不保证顺序
HashMap是一种以空间换时间的映射表,他的实现原理决定了内部的key是无序的
SortedMap在内部会对key进行排序,SortedMap是接口,实现类是TreeMap。
SortedMap保证遍历时以Key的顺序进行排序。
Map<String, Integer> map = new
TreeMap<>();
使用TreeMap必须key实现comparable接口。String,Integer已经实现了,可以直接使用。没有实现的必须在创建时同时指定一个自定义排序算法。
Map<Person, Integer> map = new
TreeMap<>(new Comparator() {
public int compare(Person p1, Person p2) {
return
p1.name.compareTo(p2.name);
}
});
使用Properties