集合
Github地址 有空继续补代码
参考自廖雪峰java教程
出现的原因:
- 数组初始化后大小不能变
- 数组只能按顺序存取
java提供了List,Set,Map三种集合类接口,支持泛型,统一用Iterator遍历
List
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()
- boolean contains(Object o)
- int indexOf(Object o)
多用ArrayList实现该接口
遍历代码
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
String s = it.next();
System.out.println(s);
}
List内部并不是通过==判断两个元素是否相等,而是使用equals()方法判断两个元素是否相等,因此,要正确使用List的contains()、indexOf()这些方法,放入的实例必须正确覆写equals()方法
equals()方法的编写方法:
- 先确定实例“相等”的逻辑,即哪些字段相等,就认为实例相等;
- 用instanceof判断传入的待比较的Object是不是当前类型,如果是,继续比较,否则,返回false;
- 对引用类型用Objects.equals()比较(因为用引用对象的equals时传入null会报错),对基本类型直接用==比较。
- 使用Objects.equals()比较两个引用类型是否相等的目的是省去了判断null的麻烦。两个引用类型都是null时它们也是相等的
示例代码
public boolean equals(Object o) {
if (o instanceof Person) {
Person p = (Person) o;
return Objects.equals(this.name, p.name) && this.age == p.age;
}
return false;
}
补充基本类型和引用类型的区别
Map
Map<String, Student> map = new HashMap<>();
map.put("Xiao Ming", s);
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);
}
正确使用Map必须保证:
- 作为key的对象必须正确覆写equals()方法,相等的两个key实例调用equals()必须返回true;
- 作为key的对象还必须正确覆写hashCode()方法,且hashCode()方法要严格遵循以下规范:
- 如果两个对象相等,则两个对象的hashCode()必须相等;
- 如果两个对象不相等,则两个对象的hashCode()尽量不要相等
Deque
Deque<String> dq = new LinkedList<>();
接口:
- 将元素添加到队尾或队首:addLast()/offerLast()/addFirst()/offerFirst();
- 从队首/队尾获取元素并删除:removeFirst()/pollFirst()/removeLast()/pollLast();
- 从队首/队尾获取元素但不删除:getFirst()/peekFirst()/getLast()/peekLast();
注:
- 用来取代List,Queue和Stack
- 不要把null添加到队列中,否则poll()方法返回null时,很难确定是取到了null元素还是队列为空
Collections
Collections类提供了一组工具方法:
- 创建空集合
- 创建单元素集合
- 创建不可变集合
- 排序/洗牌等操作
有空再研究
附类图
具体解释见:链接