第十五篇(集合框架(一)) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
集合框架(一)
前言:
集合框架主要由一组用来操作对象的接口组成。不同接口描述一组不同数据类型。
集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
接口:即表示集合的抽象数据类型。接口提供了让我们对集合中所表示的内容进行单独操作的可能。
实现:也就是集合框架中接口的具体实现。实际它们就是那些可复用的数据结构。
算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方法,例如查找、排序等。这些算法通常是多态的,因为相同的方法可以在同一个接口被多个类实现时有不同的表现。事实上,算法是可复用的函数。
1. 了解Java集合框架体系结构
-
Collection 接口是一组允许重复的对象。
-
Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。
-
List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。
详细结构图:
2. 会使用ArrayList存取数据
ArrayList数组线性表的特点为:类似数组的形式进行存储,因此它的随机访问速度极快。
ArrayList数组线性表的缺点为:不适合于在线性表中间需要频繁进行插入和删除操作。因为每次插入和删除都需要移动数组中的元素。
常用API:
- boolean add(Object object); 向列表中追加元素。
- void add(int index,Object object); 向列表中的指定索引添加元素。
- int size(); 获取列表的长度/元素个数。
- Object get(int index); 根据索引获取对应的元素。
- boolean contains(Object obj); 判断是否包含某个元素。
- boolean remove(Object obj); 删除指定的元素。
- Object remove(int index); 根据索引删除元素 且返回被删除的元素值。
来自于ArrayList的父级接口们:
toArray() :转换为数组
clear() :清除所有的元素
isEmpty() :判断是否为空集合 / list.size() == 0
iterator() :迭代器
了解:
- Collections.shuffle(list); 工具类的方法 可以用来随机打乱集合内的数据。
- List Arrays.asList(T… t); 可以创建集合并且赋值。
集合泛型特点及用法:
它是用来约束/声明集合元素的数据类型的。
泛型必须是引用数据类型,如果是存储基本数据类型值,则必须将其转为对应引用数据类型(包装类型)。
byte -> Byte
short -> Short
int -> Integer
long -> Long
float -> Float
double -> Double
char -> Character
boolean -> Boolean
3. 会使用LinkedList存取数据
LinkedList的链式线性表的特点为: 适合于在链表中间需要频繁进行插入和删除操作。
LinkedList的链式线性表的缺点为: 随机访问速度较慢。查找一个元素需要从头开始一个一个的找。速度你懂的。
可以理解为LinkedList就是一种双向循环链表的链式线性表,只不过存储的结构使用的是链式表而已。
常用API:
1.增加类:
add(E e):在链表后添加一个元素; 通用方法
addFirst(E e):在链表头部插入一个元素; 特有方法
addLast(E e):在链表尾部添加一个元素; 特有方法
push(E e):与addFirst方法一致
offer(E e):在链表尾部插入一个元素
add(int index, E element):在指定位置插入一个元素。
offerFirst(E e):JDK1.6版本之后,在头部添加; 特有方法
offerLast(E e):JDK1.6版本之后,在尾部添加; 特有方法
2.删除类:
remove() :移除链表中第一个元素; 通用方法
remove(E e):移除指定元素; 通用方法
removeFirst(E e):删除头,获取元素并删除; 特有方法
removeLast(E e):删除尾; 特有方法
pollFirst():删除头; 特有方法
pollLast():删除尾; 特有方法
pop():和removeFirst方法一致,删除头。
poll():查询并移除第一个元素 特有方法
3.查找类:
get(int index):按照下标获取元素; 通用方法
getFirst():获取第一个元素; 特有方法
getLast():获取最后一个元素; 特有方法
peek():获取第一个元素,但是不移除; 特有方法
peekFirst():获取第一个元素,但是不移除;
peekLast():获取最后一个元素,但是不移除;
pollFirst():查询并删除头; 特有方法
pollLast():删除尾; 特有方法
poll():查询并移除第一个元素 特有方法
常用API借鉴于:https://blog.csdn.net/huyang0304/article/details/82389595
4. 了解ArrayList和LinkedList的区别?
ArrayList:底层是数组结构,所以因为是数组,则拥有索引,
在遍历或随机查找时比较快,但是又因为是数组,数组长度不可变,每一次
增删都是要创建新的数组,比较
慢。
LinkedList:底层是链表结构,链表结构存储每一个元素由两部分组成,数据域和指针域,它没有索引。多个元素之间,通过指针域指向连接。 因为没有索引,所以
查找比较慢,但是因为是链表所以在
增删时只需要切换指针指向即可(尤其首尾更
快)。
在我们使用时,发现ArrayList和LinkedList好像都拥有索引,为什么呢?
它们的索引不同!
ArrayList的索引是固定的。类似于座位号 找到16号座位。
LinkedList的索引是根据元素位置计算出来的,并非固定的。 找到第16个座位。
5. 掌握使用Set集合存取数据
Set的特性:
Set:注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素
用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。
set常用API:
- begin() 返回指向第一个元素的迭代器
- clear() 清除所有元素
- count() 返回某个值元素的个数
- empty() 如果集合为空,返回true
- end() 返回指向最后一个元素之后的迭代器,不是最后一个元素
- erase() 删除集合中的元素
- find() 返回一个指向被查找到元素的迭代器
- insert() 在集合中插入元素
- max_size() 返回集合能容纳的元素的最大限值
- size() 集合中元素的数目
- swap() 交换两个集合变量
集合的遍历方式:
1.普通for循环 利用索引来遍历
public class Demo { public static void main(String[] args) { // List系列集合 ArrayList LinkedList List<String> list = Arrays.asList("张三","李四","王五","小王"); // 创建Set集合 Set<String> set = new HashSet<>(); set.add("张三"); set.add("王五"); set.add("李四"); // 普通for循环 利用索引来遍历 for (int i = 0; i < list.size(); i++) { String str = list.get(i); System.out.println(str); }
2.增强for循环【推荐】 遍历出每一个元素值
public class Demo { public static void main(String[] args) { // List系列集合 ArrayList LinkedList List<String> list = Arrays.asList("张三","李四","王五","小王"); // 创建Set集合 Set<String> set = new HashSet<>(); set.add("张三"); set.add("王五"); set.add("李四"); // 增强for循环【推荐】 遍历出每一个元素值 for(String str : list) { System.out.println(str); } System.out.println("-------------------"); for (String str : set) { System.out.println(str); }
3.利用迭代器遍历
public class Demo { public static void main(String[] args) { // List系列集合 ArrayList LinkedList List<String> list = Arrays.asList("张三","李四","王五","小王"); // 创建Set集合 Set<String> set = new HashSet<>(); set.add("张三"); set.add("王五"); set.add("李四"); // 迭代器 Iterator<String> iterator = list.iterator(); // iterator.hasNext() 判断是否有下一个元素 // iterator.next() 获取下一个元素 while(iterator.hasNext()) { String value = iterator.next(); System.out.println(value); } System.out.println("---------------------"); Iterator<String> setIterator = set.iterator(); while(setIterator.hasNext()) { String str = setIterator.next(); System.out.println(str); }
- 第二十一篇(多线程) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 第二十二篇(网络编程) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 第十九篇(输入和输出(I/O)处理(一)) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 第十八篇(实用类(二)) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 第二十篇(输入和输出(I/O)处理(二)) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 值得我们深度学习的十大开源框架
- 据说程序员是最爱学习的群体,IT男都知道,这个行业日新月异,必须不断地学习新知识,不断地为自己注入新鲜的血液,才能使自己跟上技术的步伐。 今天我们来讲一下Android中BroadcastReceiv
- 以学习的身份使用一种语言完成工作是否值得?目标:从文件中分割多个章节
- 学习Python语言,需要先了解一下Python有什么优缺点?
- PLC编程的5种专用语言 ,学习PLC编程得先了解一下!
- 大家了解纸箱包装设备吗?下面让我们一起学习一下吧!
- 很多人都患有一种毛病,将自己看得过高,自认样样都最好,而别人则个个不如自己,唯有自己看得较顺眼,这是非常错误的,因世上每个人都有些优点值得我们学习。因此我们必须“取他人之长。补自己之短”这样才能在从事涉及人事复杂的销售生意时更加胜任,更加愉快!
- 谁能用通俗的语言解释一下什么是 RPC 框架?
- 集合框架学习之Guava Collection
- Go语言学习笔记十三: Map集合
- 值得学习的c++开源框架和库
- 开始学习一下脚本语言
- 驴生态度,很值得我们学习
- 学习日志---集合框架基础实现(MyVector,MySet)