Java集合总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值