集集合知识点总结 第1篇
实现类:Hashtable类、HashMap类、TreeMap类
Map
特点:无序、唯一,按照key进行总结的,因为底层key遵照哈希表的结构(数组+链表)
哈希表原理:比如放入这个集合的数据对应的那个类:必须重写hasCode方法和equals方法。
Hashtable
类与HashMap
类功能一样
Map接口常用方法
增加:put(K key, V value)
删除:clear()
remove(Object key)
remove(Object key, Object value)
修改:replace(K key, V value)
查看:entry(K k, V v)
entrySet()
get(Object key)
keySet()
size()
values()
判断:containsKey(Object key)
containsValue(Object value)
equals(Object o)
isEmpty()
LinkedHashMap实现类
特点:唯一,有序(按照输入顺序进行输出)
HashMap实现类的重要属性:
HashMap实现类的构造器:
特点:唯一、有序(按照升序或降序)
大致原理图:
原理:二叉树,key遵循二叉树的特点,放入集合的key的数据对应的类型内部一定要实现比较器(内部比较器与外部比较器,二选一)
【1】key的类型为String类型:
【2】key的类型为自定义类型:
(1)内部比较器
(2)外部比较器
增强for循环 底层也是通过迭代器实现的
出错原因:迭代器和list同时对集合进行操作。
解决办法:事情让一个完成—>引入新的迭代器:ListIterator
【1】以int 类型为例:
比较思路:将比较的数据做差,然后返回int类型的数据,将这个int类型的数值 按照=0 >0 <0 来做判断!
【2】比较String类型的数据:
String类实现了Comparable接口,这个接口中有一个抽象方法compareTo,String类重写这个方法即可
【3】比较double类型的数据:
Double类实现了Comparable接口,这个接口中有一个抽象方法compareTo
【4】自定义类型数据比较:
外部比较器和内部比较器 哪个更好?
答:外部比较器更好,因为外部比较器使用了多态,扩展性好!
资料整理于:xxx教育
集集合知识点总结 第2篇
泛型(Generic)相当于标签
形式:<>
集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在之前只能把元素类型设计为Object,之后使用泛型来解决,因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的。因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。
Collection,List,ArrayList 这个就是类型参数,即泛型。
如果不使用泛型的话,有缺点: 一般我们在使用的时候基本上往集合中存入的都是相同类型的数据 —>便于管理,所以现在什么引用数据类型都可以存入集合—>不方便!
加入泛型的优点:在编译时期就会对类型进行检查,不是泛型对应的类型就不可以添加入这个集合。
泛型总结:
泛型实际就是一个<>引起来的参数类型,这个参数类型具体在使用的时候才会确定具体的类型。
使用了泛型以后,可以确定集合中存放数据的类型,在编译时期就可以检查出来。
使用泛型你可能觉得麻烦,实际使用了泛型才会简单,后续的遍历等操作简单。
泛型的类型:都是引用数据类型,不能是基本数据类型。
ArrayList al = new ArrayList(); 在以后可以写为: ArrayList al = new ArrayList<>(); ----钻石运算符
【1】泛型类 实例化对象
【2】继承情况:
【3】注意细节:
什么是泛型方法?
不是带泛型的方法就是泛型方法 (T != E) 泛型方法有要求:这个方法的泛型的参数类型要和当前的类的泛型无关 换个角度:泛型方法对应的那个泛型参数类型和当前所在的这个类 是否是泛型类,泛型是哈 无关
泛型方法定义的时候,前面要加上 原因:如果不加的话,会把T当做一种数据类型,然而代码中没有T类型那么就会报错
调用方法: T的类型是在调用方法的时候确定的
泛型方法能否是静态方法:
泛型参数的继承关系:
A和B是子类父类的关系,但是G(A)和G(B)不存在继承关系,而是并列关系。
发现:
A和B是子类父类的关系,G和G不存在子类父类关系,是并列的;
加入通配符?后,G>就变成了G和GxB>的父类
集集合知识点总结 第3篇
实现类:ArrayList类、LinkedList类、Vector类(淘汰)
List接口常用方法 扩展的方法都跟索引有关 特点:不唯一,有序
增加:add(int index, E element)
删除:remove(int index)
remove(Object o)
修改:set(int index, E element)
查看:get(int index)
判断:
遍历方式:普通for循环、增强for循环、迭代器
源码类似:StringBuilder
ArrayList实现类底层有两个基本要素:(1)Object类型的数组elementData,(2)size:数组的有效长度
源码:底层数组,在调用构造器的时候,数组长度初始化为10;扩容时,扩展为原数组的倍。
源码:底层数组,在调用构造器时,底层数组为{},在调用add方法后底层数组才重新赋值新数组,新数组的长度为10–>节省了内存,在add后才创建长度为10的数组。
与ArrayList实现类的对比:
联系:底层都是数组的扩容
区别:
LinkedList接口常用方法
增加:addFirst(E e)
addLast(E e)
offer(E e)
offerFirst(E e)
offerLast(E e)
删除:poll()
pollFirst()
pollLast()
(<—推荐使用,以后新出的方法,提高代码的健壮性) removeFirst()
removeLast()
修改:
查看:element()
getFirst()
getLast()
indexOf(Object o)
lastIndexOf(Object o)
peek()
peekFirst()
peekLast()
判断:
遍历方式:普通for循环、增强for循环、迭代器
遍历方式:
ArrayList:数据结构
LinkedList:数据结构
模拟Linked List源码:
集集合知识点总结 第4篇
实现类:HashSet类、TreeSet类
Set接口特点:唯一,无序(相对于List接口,不等于随机)
没有跟索引相关的方法
遍历方式:
HashSet简要原理图: 哈希表=数组+链表;如果放入HashSet中的数据,一定要重写两个方法:hasCode,equals
HashSet
底层就是利用HashMap来完成的
【疑问:】
LinkedHashSet类实现唯一且有序
【1】存入Integer类型数据:(底层利用的内部比较器)
特点:唯一,无序(没有按照输入的顺序进行输出),有序(按照升序进行遍历)。
【2】原理:底层:二叉树(数据结构中的一个逻辑结构)
二叉树遍历:
【3】存放String类型数据:
同Integer类型一样
【4】放入自定义类型数据
同比较器案例
实际开发中利用外部比较器好,因为扩展性好(多态)
换一种写法:匿名内部类
集集合知识点总结 第5篇
子接口:List接口,Set接口
常用方法
增加:add(E e)
addAll(Collection extends E> c)
删除:clear()
remove(Object o)
removeAll(Collection> c)
修改:stream()
返回以此集合为源的顺序
查看:iterator()
遍历 size()
判断:contains(Object o)
equals(Object o)
isEmpty()
遍历方式:增强for循环、迭代器