学习Java的第16天
1.Java集合框架的概述
-
集合和数组都是对多个数据进行操作的结构,简称Java容器。
此时的存储主要指的是内存的存储,不涉及到持久化的存储。
-
数组存储多个数据的特点:
- 一旦初始化以后,数组的长度就确定了。
- 声明类型后,元素的类型也就确定了。
- 缺点:
- 不可以修改长度。
- 数组提供的方法非常有限,对于添加,删除,插入数据等操作十分不便。
- 获取数组实际元素的个数的需求,数组没有现成的方法可以用。
- 数组存储数据的特点:是有序的,可重复,对于无序,不可重复的需求,不可满足。
-
Java集合可分为Collection和map两种体系。
- collection接口:单例数据,定义了存取一组对象的方法的集合
- List:子接口:元素有序,可重复的集合。
- Set:子接口:元素无序,不可重复的集合。
- Map接口:双列数据,保存具有映射关系的key—value的集合
- collection接口:单例数据,定义了存取一组对象的方法的集合
2.集合框架
-
|----collection:单例集合,存储一个一个的对象。
|-----list:存储有序,可重复的数据。//动态数组
|-----实现类:Arraylist Vector LinkList
|------set:存储无序的,不可重复的数据。//
|-----实现类hashSet,LinkHashMap,TreeSet
|-----map:双列集合,用来存取一对的数据。一一对应//y= f(x)
|-------HashMap,LinkHashMap,tree,Hashtable,propeties
3.Collection接口中的方法的使用
注意:在添加对象时,要重写类中的equals方法
- size(): 获取元素的个数。
4.集合元素的遍历操作,使用迭代器Iterator接口
-
遍历集合的格式:
@Test public void test1(){ Collection c1 = new ArrayList(); c1.add(123);//自动装箱 c1.add(new String("小米最垃圾")); System.out.println(c1); Iterator iterator = c1.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } }
-
内部定义了remove()可以在迭代的时候删除集合中的元素。
- 不能连续两次调用迭代器中的remove()。
5.增强for循环
- 利用迭代器赋值不会改变集合内部元素的值
6.List接口的概述
- List的三个实现类异同:
- ArrayList :线程不安全,效率高,底层使用Object[]
- LinkList: 底层使用的是双向链表。有利于频繁的遍历。
- vector:线程安全,效率低。底层使用的是Object[]
- 三个实现类的源码分析
- ArrayList:jdk7中底层先造一个10的数组 之后不够了,在按照当前数组长度的1.5倍去扩容,jdk8中先初始化为0,添加时在初始化为10,相比较于之前比较节省内存空间。
- LinkList:底层是用双向链表实现的。
- Vector:底层也是构造了一个10的数组,当长度不够时,增加长度为当前的2倍。
7.Set接口
-
Set存储的无序性和不可重复性
- 无序性:利用hash值通过算法算出具体位置.
- 不可重复性:
-
添加元素的过程
- 我们在向HashSet中添加元素a,首先调用a所在类的HashCode()方法,计算出元素的哈希值,此哈希值接着通过某种算法算出在HashSet底层数组中的存放位置
- 判断此数组的该位置是否有元素存在,没有则直接添加.
- 如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a和b的hash值,如果hash值不同,元素a添加成功,如果相同就通过Equals()方法比较,如果相同就添加失败。
- 注意指定位置上的如果存在多个不同hash值的数据,按照链表的形式存储 jdk8是后继存储 jdk7是前驱存储。
-
LinkHashSet作为HashSet的子类,在添加数据的同时,每个数据还添加了两个指针,记录了前一个数据的地址和后一个数据的地址。
-
TreeSet的使用:
- 1.向TreeSet中添加的数据,要求是相同类的对象。
- 2.并且按照指定方法排序。列如int按照从小到大。
- 3.在自定义类中可以通过实现Comparable接口,重写compara方法,来进行自然排序,comparaTo():返回值为0,那么相同.
8.Map接口
- Map的实现类
- HashMap():Map的主要实现类, 线程不安全的,效率高.可以存储null的key和value.
- 底层:数组+链表+红黑树
- LinkhashMap:保证在遍历map元素时,可以按照添加的顺序遍历
- 对于频繁的遍历操作,效率较高.
- HashTable():线程安全的,效率低.不可以存储null的key和value.
- TreeMap:可以保证按照添加的key_value对进行排序,实现排序遍历. 底层使用的是红黑树.
- 添加的key_value必须是同一个类的key,因为要按照key来排序
- properties:常用来处理配置文件. key_value都是String类型.
-
Map结构的理解
- Map中的key,无序的不可重复的,使用set存储所有的key.
- map中的value:无序的,可重复的,使用Collection 存储所有的Value
- 一个键值对构成了一个Entry对象.
- Map中的Entry: 无序的,不可重复的,使用Set存储所有的Entry
-
HashMap的底层实现原理
略
-
TreeMap
- 可以自定义排序通过实现comparable接口
9.Collections工具类的使用
- Collections 是一个操作 Set、List 和 Map 等集合的工具类
- Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作, 还提供了对集合对象设置不可变、对集合对象实现同步控制等方法
- Collections 类中提供了多个 synchronizedXxx(list) 方法,将线程不安全的ArrayList和HashMap变成安全的.