前言
数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作。
提示:以下是本篇文章正文内容,下面案例可供参考
一、集合框架
1.什么是集合
概念:集合是对象的容器。定义了对多个对象进行操作的常用方法。可实现数组的功能
2.集合和数组有什么区别:
- 数组长度固定,集合长度不固定。
- 数组可以存储基本类型和引用类型,集合只能存储引用类型。
集合的位置:java.util.*;
3.集合框架被设计成要满足以下几个目标。
- 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
- 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
- 对一个集合的扩展和适应必须是简单的。
为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。
4.简单的集合框架图
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等
5.抽象类和接口
抽象类和接口都不能实例化,某个类如果继承了抽象类或者接口,都需要对抽象方法进行全部实现,否则该类仍需要被声明为抽象类。
抽象类的成员可以是public private protected,而接口的成员方法只能是public。
List集合特点
List代表了有序可重复集合,可直接根据元素的索引来访问。
List接口常用的实现类有:ArrayList、LinkedList、Vector。
- 集合中的元素允许重复
- 集合中的元素是有顺序的,各元素插入的顺序就是各元素的顺序
- 集合中的元素可以通过索引来访问或者设置
Set集合特点
Set扩展Collection接口,无序集合,不允许存放重复的元素。
Set接口常用的实现类有:HashSet、LinkedHashSet、TreeSet
ArrayList
ArrayList是一个动态数组,也是我们最常用的集合,是List类的典型实现。
它允许任何符合规则的元素插入甚至包括null,每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。
随着容器中的元素不断增加,容器的大小也会随着增加,在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。
所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。
ArrayList擅长于随机访问,同时ArrayList是非同步的。
LinkedList
LinkedList是采用双向循环链表实现,LinkedList是List接口的另一个实现,除了可以根据索引访问集合元素外,LinkedList还实现了Deque接口,可以当作双端队列来使用,也就是说,既可以当作“栈”使用,又可以当作队列使用。
Vector
与ArrayList相似,但是Vector是同步的,它的操作与ArrayList几乎一样。
区分:
(1)ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
(2)Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
(3)LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
HashSet
HashSet是Set集合最常用实现类,是其经典实现。
HashSet底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。
TreeSet
底层数据结构采用二叉树来实现,元素唯一且已经排好序,唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。
LinkedHashSet
底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。
区分:
1)HashSet
底层其实是包装了一个HashMap实现的
底层数据结构是数组+链表 + 红黑树
具有比较好的读取和查找性能, 可以有null 值
通过equals和HashCode来判断两个元素是否相等
非线程安全
2)LinkedHashSet
继承HashSet,本质是LinkedHashMap实现
底层数据结构由哈希表(是一个元素为链表的数组)和双向链表组成。
有序的,根据HashCode的值来决定元素的存储位置,同时使用一个链表来维护元素的插入顺序
非线程安全,可以有null 值
3)TreeSet
是一种排序的Set集合,实现了SortedSet接口,底层是用TreeMap实现的,本质上是一个红黑树原理
排序分两种:自然排序(存储元素实现Comparable接口)和定制排序(创建TreeSet时,传递一个自己实现的Comparator对象)
正常情况下不能有null值,可以重写Comparable接口 局可以有null值了。
二,如何使用迭代器
通常情况下,你会希望遍历一个集合中的元素。例如,显示集合中的每个元素。
一般遍历数组都是采用for循环或者增强for,这两个方法也可以用在集合框架,但是还有一种方法是采用迭代器遍历集合框架,它是一个对象,实现了Iterator 接口或 ListIterator接口。
迭代器,使你能够通过循环来得到或删除集合的元素。ListIterator 继承了 Iterator,以允许双向遍历列表和修改元素。
三,对泛型的理解
1.泛型类
2.泛型接口
下面的图:泛型类中的T传到泛型接口中T
3.泛型方法
泛型的好处:
- 自动对类型进行检查
- 自动对类型进行强制类型转换
- 泛型中尖括号里面的内容不参与类型的组成
泛型是编译期的一种机制,擦除机制。尖号里面的东西全部擦成object