Map的不同实现类单独再搞一章讲
目录
数组的特点、弊端与集合框架体系介绍
数组
特点
弊端
Java集合框架体系(java.util包下)
java.util.Collection:存储一个一个的数据(主要讲两个子接口)
java.util.Map:存储一对一对的数据(key-value键值对。类似于高中的函数)(没有子接口)
学习的把握(怎么掌握)
Collection接口中的方法的测试
常用方法
向Collection中添加元素的要求:
集合和数组之间的转换
Iterator(迭代器)的作用
代码实现
增强for循环
作用:
格式:
说明:
List接口常用方法
特点:
常用方法:
List不同实现类的对比
Set不同实现类的对比及无序性,不可重复性的剖析
区别
方法:
开发中使用频率和场景:
理解无序性和不可重复性
无序性:不是指随机性
不可重复性
添加到HashSet\LinkedHashSet中元素的要求
TreeSet的使用
数组的特点、弊端与集合框架体系介绍
数组
特点
- 一旦初始化,长度就确定了
- 数组中的多个元素是依次紧密排列的,有序的,可重复的
- (优点)数组一旦初始化完成,其元素的类型就是确定的,不是此类型的元素,就不能添加到数组中
- (优点)元素的类型既可以是基本数据类型,也可以是引用数据类型
弊端
- 一旦初始化,长度就不可变了
- 数组中存储数据特点的单一性,对于无序的,不可重复的场景的多个数据就无能为力了
- 数组中可用的方法和属性都极少。具体需求都需要自己来组组织相关代码逻辑
- 对于数组中的删除和插入操作性能较差。
Java集合框架体系(java.util包下)
从接口角度下分类
java.util.Collection:存储一个一个的数据(主要讲两个子接口)
- 子接口:List:存储有序的、可重复的数据(“动态”数组)
- 实现类:ArrayList(主要的实现类)、LinkedList、Vector(老的)
- 子接口:Set:存储无序的、不可重复的数据(高中学习的集合)
- 实现类:HashSet(主要的实现类)、LinkedHashSet、TreeSet
java.util.Map:存储一对一对的数据(key-value键值对。类似于高中的函数)(没有子接口)
实现类HashMap(主要的实现类)、LinkedHashMap、TreeMap、Hashtable、Properties(Hashtable的子类)
HashSet底层原理和HashMap一样(value=null).
学习的把握(怎么掌握)
- ①针对具体特点的多个数据,知道选择相应的适合的接口的主要实现类,会实例化、会调用常用的方法
- ②区分接口中不同的实现类的区别。
- ③针对常用的实现类,需要熟悉底层的源码,熟悉常见的数据结构(后面讲)
Collection接口中的方法的测试
常用方法
添加相关add,addAll,contains,containsAll,equals,size,isEmpty
删除相关的clear,remove,removeAll,retainAll
其他toArray,hashCode,iterator
向Collection中添加元素的要求:
- 要求元素所属的类一定要重写equals()!
- 原因:Collection中的相关方法(比如:contains/remove),都会涉及到equals的使用
集合和数组之间的转换
- 集合——>数组:toArray()
- 数组——>集合:调用Arrays的静态方法asList()
Iterator(迭代器)的作用
作用:用来遍历集合元素的
代码实现
如何使用迭代器
Collection coll = new ArrayList();
//创建迭代器对象
Iterator iterator = coll.iterator();//使用,每使用一次next(),会向下读一次
System.out.println(iterator.next());
所以使用迭代器一般使用循环,所以结合hasNext(),我们有更高级的写法
增强for循环
作用:
用来遍历数组和集合
格式:
for(要遍历的集合或者数组元素的类型 临时变量名 : 要遍历的集合或数组(容器))
{
操作临时变量的输出
}
说明:
- 对于集合来说,增强for循环的底层仍然使用的是迭代器
- 增强for循环执行过程中,是将集合或数组中的元素依次赋值给临时变量,所以循环体中对临时变量的修改,可能不会导致原有集合或数组元素的修改
List接口常用方法
特点:
有序的,可重复的数据——>替代数组,看作“动态数组”
常用方法:
1.Collection里面的15个方法
2.因为List是有序的,进而就有索引,就会增加一些对索引的操作…………等等
- 增
- add(Object obj)
- addAll(Collection coll)
- 删
- remove(Object object)
- remove(int index)
- 改
- set(int index,Object obj)
- 查
- get(int index)
- 插
- add(int index,Object obj)
- add(int index,Collection coll)
- 长度
- size()
- 遍历
- iterator()
- 增强for循环
- 一般for循环
List不同实现类的对比
- ArrayList: List的主要实现类,线程不安全的,效率高,底层使用的Object[ ]数组存储。
- 在添加数据和查找数据时效率高,在插入和删除数据时效率低。
- 后面还有源码(回来写)
- LinkedList:底层使用双向链表的方式进行存储,在对集合数据进行频繁的删除和插入操作时,建议使用此类
- 在添加数据和查找数据时效率低,在插入和删除数据时效率高。
- Vector:List古老的实现类,线程安全的,效率低,底层使用的Object[ ]数组存储。
Set不同实现类的对比及无序性,不可重复性的剖析
区别
- HashSet主要实现类,底层使用的是HashMap,即使用数组+单向链表+红黑树结构进行存储。
- LinkedHashSet是HashSet的子类,在现有的数组+单向链表+红黑树结构的基础上,又添加了一组双向链表,用于记录添加元素的先后顺序,即可以按照添加元素的顺序实现遍历。便于频繁的查询操作
- TreeSet:底层使用红黑树存储。可以按照添加元素的指定的属性的大小的顺序进行遍历
方法:
Set中常用的方法和Collection中的15个一样,没有新增的方法
开发中使用频率和场景:
- 相较于List、Map来说,Set使用频率较少
- 用来过滤重复数据的
理解无序性和不可重复性
无序性:不是指随机性
- 添加元素的顺序和遍历元素的顺序不一致指的不是无序性,
- 无序性与添加元素的位置有关,不像ArrayList一样是依次紧密排列的。
- 这里根据添加元素的Hash值计算的其在数组中的存储值。此位置不是依次排列的,表现为无序性
不可重复性
- 添加到Set中的元素是不能相同的。
- 比较的标准,需要判断HashCode() 得到的哈希值以及equals()方法得到的boolean型的结果
- 哈希值相同且equals()返回true,则认为元素是相同的。
添加到HashSet\LinkedHashSet中元素的要求
要求元素所在的类要重写两个方法:equals()和hashCode()。同时要求这两个方法保持一致性!只需要我们在idea中自动生成两个方法的重写即可。
TreeSet的使用
- 底层数据结构:红黑树
- 添加数据后的特点:可以按照添加元素的顺序实现遍历。
- 要求:
- 要求添加的元素必须是同一个类型,否则汇报ClassCastException
- 添加的元素需要考虑排序:①自然排序②定制排序
- 判断数据是否相同的标准:
- 不再是考虑hashCode( )/equals()方法了,也就是意味着添加到TreeSet中的元素所在的类不需要重写他们了
- 比较元素大小的或比较元素是否相等的标准就是考虑自然排序或定制排序中compare()或compareTo()的返回值,如果他们的返回值为0,则认为两个对象是相等的。由于TreeSet中不能存放相同的元素,则后一个相等的元素就不能添加到TreeSet中