最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
最新整理面试题
上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题
最新整理电子书
最新整理大厂面试文档
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
但是我们想存储一些连贯的信息,比如我们的个人信息,其中包括名字,年龄、家庭住址、证号,那总不能创建好多个数组,然后一个一个遍历?于是集合就出现了
集合就是一堆数据,其中可以包括不同类型的数据,比如名字、年龄可以存在一起;
集合内部只能存储对象,名字和int类型的年龄在存储时都会自动包装成对象
具体详情可以点击点解了解:什么是集合
| | |
| — | — |
======================================================================
我们上面说过,集合可以存储多种类型的数据,但其实存储的都是相应的对象罢了,我们可以把它理解成可以存储对象的容器;
在集合中,jdk为了我们便于操作数据,提供了一系列框架,在框架中,里面有很多类和接口,我们用的时候,直接调用就可以实现相应的功能,它们都是位于java.util包中;
另外存储在集合中的 数据,也可以被称为元素,这个你们记住就好,当然也可以说是数据,元素是公认的 规范,最好 说元素;
我们可以看上面这张图片,上面就是集合容器框架中各个接口的关系,其中collection接口、map接口、Iterator接口他们之间呢,都是相互依赖的关系,还有就是常用的list接口和set接口,都是继承了collection接口;
| | |
| — | — |
=============================================================================
-
Collection 接口存储一组不唯一,无序的对象
-
List 接口存储一组不唯一,有序(索引顺序)的对象
-
Set 接口存储一组唯一,无序的对象
-
Map接口存储一组键值对象,提供key到value的映射
Key 唯一 无序
value 不唯一 无序
在这里做个引入,具体的后面,会有代码和注释详细讲解每个接口的使用和实现功能
=========================================================================
List接口继承Collection接口,实现了List接口的类称为List集合;
List集合的主要实现类有:
ArrayList和LinkedList,分别是数据结构中顺序表和链表的实现
另外还包括栈和队列的实现类:Deque和Queue
list集合储存数据的条件是:不唯一,有序(索引顺序)的对象,
有序:
比如我们创建了集合,在集合内写入[“张三”,12,99,“李四”]这一列数据,那么我们在最后遍历输出之后,他依然会按照这个顺序输出出来,那么这个就是有序;
不唯一:
就像我们定义了这样一个集合[“张三”,12,99,99,“李四”],那么在遍历时每一个99都会存储在内存中,保证了元素的不唯一性
ArrayList集合
ArrayList属于list的实现类;
他与数据存储结构与数组类似,都是在内存中分配连续的空间,只不过相对于数组,他是长度可变的数组
其中它因为自身的数据存储结构,可以通过索引实现它的遍历元素和查找元素速度很快;
但元素的添加和删除都需要大量的移动数组,效率比较低;
你们可以点击链接了解什么是数组,就可以知道ArrayList实现类与数组在特征上比较相似;
ArrayList集合的部分方法展示
add()
这里要注意几点:
1、使用add添加的数字,是通过自动装箱的结果,集合内存储的是对象!
2、通过索引向指定位置添加索引,如果指定位置有其他元素,那么他会自动往后移;
3、如果指定索引超出了集合的原来的索引范围,比如在下面代码把4改成8,那么就会报错,索引越界
addAll()
addAll()可以让两个集合拼接在一起,没有指定索引,则会添加倒最后一位
如果指定了索引,则括号内的集合的元素从索引处依次添加,原集合的元素,会整体往后移;
遍历:
我们直接使用System.out.println(list);也可以将数组内的数据显示出来,但是它也仅仅是让llist中的集合暂时显示出来。
想要对里面的元素做一些操作,还是需要将他们从变量中遍历出来
可以使用for,增强for循环
在使用的时候,需要注意,遍历出的元素需要拆箱才可以;
关于foreach遍历时要用Object进行接收,因为这个属于单个元素进行遍历,遍历出来的时候还是一个集合对象 这点要注意下,也可以点击链接了解一下Object
Iterator迭代器
也可以使用Iterator迭代器进行集合的遍历;
前面再使用Iterator时,需要用Iterator修饰的变量来接受元素
关于集合的其他方法:
| | |
| — | — |
理解ArrayList集合源码
ArrayList底层就是一个长度可以动态增长的Object数组,
我们可以通过源码的得知:
ArrayList他的初始容量为10,但是这里要清楚一个状况,我们只是单单创建了一个集合对象,并不代表这个对象有了初始值;
此时他的初始容量还是0;
当我们使用add添加元素之后,才会分配相应的你内存空间,初始容量为10;
但如果我们存储的容量大于10了,那么ArrayList集合就会扩容,
扩容增量:原容量的 0.5倍
如 ArrayList的容量为10,一次扩容后是容量为15,如果扩容了0.5倍后,还不能容纳一次传入的元素,那么就会扩容到可容纳元素的最小容量;
关于源码的理解,可以点击链接了解详情:
| | |
| — | — |
add()
使用LinkedList集合时,他的元素添加方法与之前的ArrayList相同,
包括指定索引添加也是相同的语法
但同时需要注意的是如果在创建集合时定义了数据类型,那么就不能在集合内添加其他类型的数据了,否则就会报错
remove()
使用remove()通过索引删除元素时要注意,删除某个元素之后,元素后面的其他元素就会向前移动,这个移动与我们的数组和ArrayList集合还有些不同;
数组和ArrayList底层还是属于一个数组结构,那么在进行元素的添加删除,还是通过元素的移动进行的
而LinkedList集合的底层属于双向链表,在进行删除的时候,需要修改节点,那么我们假设LinkedList集合内部有三个元素,每个元素都有两个节点,且每个节点相互指引;
第一个元素的节点前为空值,代表链表的开始,后面的节点指向第二个元素的前一个节点,同样第二个元素的前一个节点也指向第一个元素的后节点,依次类推,就可以通过双向链表把元素链接起来,这里需要注意的时,最后一个元素的后一个节点指向空,因为它后面就没元素了,关于这个双向链表可以点击以下链接了解:
双向链表还是很重要的,最好找一些技术文档好好学习一下
isEmpty()
| | |
| — | — |
文末
我将这三次阿里面试的题目全部分专题整理出来,并附带上详细的答案解析,生成了一份PDF文档
- 第一个要分享给大家的就是算法和数据结构
- 第二个就是数据库的高频知识点与性能优化
- 第三个则是并发编程(72个知识点学习)
- 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料
还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来
517257)]
- 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料
[外链图片转存中…(img-0nIJvfdX-1714999517257)]
还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来