文章目录
Java集合类简介
java中集合主要包括:Set、List、Map、Queue。其中Set是一种无序的结构,不允许有重复的元素。List是一种有序的结构,允许有重复的元素。Map是一种键值对的结构,用来存储键值对之间的关系,Map中的key不允许重复。Queue是一种队列结构,符合先进先出的特性。
java集合与数组的关系
1.数组中存储的可以是对象也可以是基本类型的值,而集合中存储的都是对象,基本数据类型的变量需要转换成对应的包装类才可以存储。
2.数组的长度在创建时就被指定好了,且之后不可以改变。而集合的长度可以更改,以ArrayList为例,就会在长度不够时,增加一倍的当前长度。
Java集合类之间的继承关系
set、Queue、List都是继承自Collection。
而HashMap、TreeMap都是继承自Map。
Collection简介
Collection中包含很多方法,可以看出Set与Collection的方法其实都是一样的。只不过add方法不同,因为Set不允许存在相同的元素。这里要记住一点,我们在使用的时候可能用add,contains比较多,但是不要忘记set也同样有size方法可以获取长度。
迭代器(值得再看一下例子)
继续简单讲一下迭代器。
Iterator接口中主要定义了2个方法,使用起来比较简单,但要注意一点,集合元素的值传给了迭代变量。仅仅传递了对象引用,保存的仅仅是指向对象内存空间的地址。
以下边的例子可以更好地理解什么是仅仅传递了对象引用,
public class IteratorExample {
public static void main(String[] args) {
List<MyObject> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(new MyObject(i));
}
System.out.println(list.toString());
Iterator<MyObject> iterator = list.iterator();//集合元素的值传给了迭代变量,仅仅传递了对象引用。保存的仅仅是指向对象内存空间的地址
while (iterator.hasNext()) {
MyObject next = iterator.next();
next.num = 99;
}
System.out.println(list.toString());
}
static class MyObject {
int num;
MyObject(int num) {
this.num = num;
}
@Override
public String toString() {
return String.valueOf(num);
}
}
}
输出为:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[99, 99, 99, 99, 99, 99, 99, 99, 99, 99]
List简介
List继承自Collection,List允许存储重复的元素。集合中每个元素都有其对应的顺序索引,可以通过索引来访问指定位置的集合元素。
相应的,List中也添加了一些基于索引位置的方法。其中用的比较多的就是get,remove,indexOf。
void add(int index, Object element): 在列表的指定位置插入指定元素(可选操作)。
boolean addAll(int index, Collection<? extends E> c) : 将集合c 中的所有元素都插入到列表中的指定位置index处。
Object get(index): 返回列表中指定位置的元素。
int indexOf(Object o): 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
int lastIndexOf(Object o): 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
Object remove(int index): 移除列表中指定位置的元素。
Object set(int index, Object element): 用指定元素替换列表中指定位置的元素。
List subList(int fromIndex, int toIndex): 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的所有集合元素组成的子集。
Object[] toArray(): 返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。
以及我们经常使用的方法:
void sort(Comparator c): 根据Comparator参数对List集合的元素排序。
Queue简介
队列核心就是先进先出的结构,具体就是先进入(offer)队列的会率先出(poll)队列。注意:队列不允许随机访问队列中的元素。
常用函数如下。
Map简介
Map总是成对的存储键值,因此Map中存储的是两组数据,而存储key的结构是Set,存储value的类似于List。
与Set集合的关系(值得再看一下)
如果把Map里的所有key放在一起看,它们就组成了一个Set集合(所有的key没有顺序,key与key之间不能重复),实际上Map确实包含了一个keySet()方法,用户返回Map里所有key组成的Set集合。
与List集合的关系(值得再看一下)
如果把Map里的所有value放在一起来看,它们又非常类似于一个List:元素与元素之间可以重复,每个元素可以根据索引来查找,只是Map中索引不再使用整数值,而是以另外一个对象作为索引。
主要方法
我们这里最常用的就是containsKey(判断是否有该key的映射关系),get(获取该key所映射的value值),put(存储进map中一对key-value映射关系),isEmpty(map中是否存在映射)。我们偶尔也想获取整个map中的所有key(keySet()),我们也会使用remove(Object key),但要注意这里的remove是删去了当前key与value的映射。
我们有时候想要遍历整个map,我们就需要借助entrySet方法来获取一个Set,进而遍历Map,但获取的Set中数据类型为Map.Entry<K,V>。
我们先来看下Map的内部类Entry所包含的一些方法,通过getKey和getValue就可以获取Map中的对应键值对关系。
我们看一下实际代码:
public static void map(){
Map<Integer,String>map = new HashMap<>();
map.put(1,"one");
map.put(2,"two");
map.put(3,"three");
Set<Map.Entry<Integer,String>>set = map.entrySet();
for (Map.Entry<Integer,String>e:set){
System.out.println("key:"+e.getKey()+",value:"+e.getValue());
}
}