在昨天,笔者曾表明要在不久的将来会专门开一个有关集合的专题,没想到这一天这么快就到了,在复习的第四天我们就把Java中有关集合的概念具体的说说,下面开始正式的内容。
一. 复习与回顾
在昨天的最后我们复习了有关集合的具体含义(它是一种专门装东西的玩意儿),它和显示生活中的练习(比如衣柜,和药箱,不过他们有不同的存储规则,还记得吗?),最后介绍了遍历集合的方法,也就是迭代器。在今天,我会扩展一下集合的知识,大家注意看哦!
二. 泛型
泛型了规定类,集合,方法所能接受的数据类型,如果你说,如果接受的数据类型与规定的数据类型不一样,编译器不会报错吗?为什么要单独设置泛型的概念呢?确实,但如果穿进来的数据他的数据类型是不确定的呢?这时我们就可以用E 来设置if语句来分类讨论。
1. 含有泛型的类
public class A <E>{
private E name;
A <integer> a=new A<>(); }
我们没法向类中传入参数,但是我们可以向类的成员方法中传入参数,这时候类的泛型就有了意义,需要注意的是如果类的泛型与方法的泛型所规定的字符不一,比如过一个是E,一个是T,那么类的方法中仍然可以传递方法中所规定的参数。
2. 含有泛型的方法
public <m> void B(m b){}
3. 泛型通配符<?>
通配符可以接受所有的引用数据类型,在方法没有规定泛型之前,如果我们有<Object>接受参数,那么就会报错,因为Object与其他类是平行的关系,不存在继承关系,但是我们有<?>就可以解决这个问题。(简化代码?没怎么感觉其实。。)?是所有类型的超类,只能用Object中的方法,一般与extends和super一起,声明边界。
三. List接口
1. 特点
有序、带索引、允许储存相同的元素
2. 特有方法
add()、get()、remove()、set()
3. ArrayList实现了List接口
优势:查询快,曾删慢
原因是ArrayList的底层实现是一个数组,数组的优势就是查询非常的快,不过呢这个数组是随时变化的,也就是每次往里面添加一个元素,便重新建立一个数组,这就导致增删会很慢。
4. LinkedList
几种方法:
pop() removeFirst() 拿走第一个数据
push() addFirst() 添加第一个数据
remove() 拿走最后一个数据
四. set接口
1. 特点
不允许有相同的元素、无索引
主要是HashSet、LinkerHashSet实现了该接口
如果想遍历,要用迭代器实现,因为没有索引!
2. 几个概念
- 哈希值:一个十进制的整数,每一个数据都会有一个哈希值,如果我们把该十进制的数转化为16进制,那么就成了我们所说的地址值。Object中有求哈希值的方法HashCode,String类重写了HashCode方法。
- 哈希表:一个数组加上链表(防止哈西冲突)
- 储存自定义的元素:要重写HashCode 和equals方法,确包HashSet不重复。
- 可变参数:方法的参数类型确定,但是参数的个数不确定,我们可以用一个下表不确定的数组来储存,具体例子:
method(int...arr) 其中arr为数组。
五. Collection中的常见操作
以下都是静态方法,也就是可以直接通过类名来访问。
- Collection.addAll(List,参数列表)直接添加多个元素
- shuffel (list)打乱集合的顺序
- sort (list)排序
注意:list中的元素必须实现了comparable接口,重写了comparaTo方法
- sort(list<T> list ,comparator<? super T>)
注意:实现comparator接口中的compare方法
即ret<0时,语义上等价于o1<o2;
ret==0时,语义上等价于o1==o2;
ret>0时,语义上等价于o1>o2.
六. Map集合
Map集合是一个双列集合,有两个泛型,一个是关键字Key,一个是值Value,两个是一对一的关系,在一个Map中,Key是不能重复的。
1. 常用的实现类
HashMap和LinkedHashMap
2. 常用的方法
- V put(K key ,V Value)添加,成功的话返回值
- V get(Object key)获取,成功的话返回值
- V remove(Object key)删除,成功的话返回被删除的值
- boolean containsKey(Object key)看看是否有这个Key
3. 遍历Map
- KeySet(),把该Map对象中的所有key取出,并添加到Set数组中(期间可以用增强For遍历),然后获得通过Key利用get方法获得value。
- 利用内部接口Entry
实现步骤:
1,调用Map集合中的entrySet()方法,将集合中的映射关系对象存储到Set集合中
2,迭代Set集合(增强For循环的话,接受的对象类型应该是Map.Entry<K,V>,因为Entry的类型是静态的,可以通过类名调用)
3,获取Set集合的元素,是映射关系的对象
4,通过映射关系对象的方法,getKey()和getValue(),获取键值对