没有合适的资源?快使用搜索试试~ 我知道了~
Java面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docxJava面试题和答案72道.docx
资源推荐
资源详情
资源评论
什么是集合
1、集合就是一个放数据的容器,准确的说是放数据对象引用的容器
2、集合类存放的都是对象的引用,而不是对象的本身
3、集合类型主要有 3 种:set(集) list(列表)和 map(映射)。
集合的特点
集合的特点主要有如下两点:
什么是集合
1、集合就是一个放数据的容器,准确的说是放数据对象引用的容器
2、集合类存放的都是对象的引用,而不是对象的本身
3、集合类型主要有 3 种:set(集)、list(列表)和 map(映射)。
集合的特点
集合的特点主要有如下两点:
1、集合用于存储对象的容器,对象是用来封装数据,对象多了也需要存储集中式管理。
2、和数组对比对象的大小不确定。因为集合是可变长度的。数组需要提前定义大小
集合和数组的区别
1、数组是固定长度的;集合可变长度的。
2、数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。
3、数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。
使用集合框架的好处
1、容量自增长;
2、提供了高性能的数据结构和算法,使编码更轻松,提高了程序速度和质量;
3、可以方便地扩展或改写集合,提高代码复用性和可操作性。
4、通过使用 JDK 自带的集合类,可以降低代码维护和学习新 API 成本。
常用的集合类有哪些?
Map 接口和 Collection 接口是所有集合框架的父接口:
1. Collection 接口的子接口包括:Set 接口和 List 接口
2. Map 接口的实现类主要有:HashMap、TreeMap、Hashtable、
ConcurrentHashMap 以及 Properties 等
3、Set 接口的实现类主要有:HashSet、TreeSet、LinkedHashSet 等
4、List 接口的实现类主要有:ArrayList、LinkedList、Stack 以及 Vector 等
List,Set,Map 三者的区别?
Java 容器分为 Collection 和 Map 两大类,Collection 集合的子接口有 Set、List、Queue 三种子接口。
我们比较常用的是 Set、List,Map 接口不是 collection 的子接口。
Collection 集合主要有 List 和 Set 两大接口
1、List:1 一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个
null 元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。
2、Set:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个
null 元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。
3、Map 是一个键值对集合,存储键、值和之间的映射。Key 无序,唯一;value 不要求有序,允许
重复。Map 没有继承于 Collection 接口,从 Map 集合中检索元素时,只要给出键对象,就会返回对
应的值对象。
4、Map 的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap
集合框架底层数据结构
Collection
List
1. Arraylist:Object 数组
2、Vector:Object 数组
3、LinkedList;双向循环链表
Set
1、HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保存元素
2、LinkedHashSet:LinkedHashSet 继承与 HashSet,并且其内部是通过 tinkedHashMap 来实现的。有点
类似于我们之前说的 LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的。
3、TreeSet(有序,唯一):红黑树(自平衡的排序二叉树。)
Map
1、HashMap:JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主要为
了解决哈希冲突而存在的( “拉链法”解决冲突)JDK1.8 以后在解决哈希冲突时有了较大的变化,当
链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减少搜索时间
2、LinkedHashMap:LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由
数组和链表或红黑树组成。另外,LinkedHashMap在上面结构的基础上,增加了一条双向链表,使
得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相
关逻辑。
3、HashTable:数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的
4、TreeMap:红黑树(自平衡的排序二叉树)
哪些集合类是线程安全的?
1. Vector:就比 Arraylist 多了个 synchronized (线程安全),因为效率较低,现在已经不太建议使用。
2、hashTable:就比 hashMap 多了个 synchronized(线程安全),不建议使用。
3、ConcurrentHashMap:是 Java5 中支持高并发、高吞吐量的线程安全 HashMap 实现。它由 Segment
数 组 结 构 和 HashEntry 数 组 结 构 组 成 。 Segment 数 组 在 ConcurrentHashMap 里 扮 演 锁 的 角
色,HashEntry 则用于存储键-值对数据。一个 ConcurrentHashMap 里包含一个 Segment 数组,Segment
的结构和 HashMap 类似,是一种数组和链表结构;一个 Segment 里包含一个 HashEntry 数组,每个
HashEntry 是一个链表结构的元素;每个 Segment 守护着一个 HashEntry 数组里的元素,当对
HashEntry 数组的数据进行修改时,必须首先获得它对应的 Segment 锁、推荐使用)
Java 集合的快速失败机制 “fail-fast”?
是 java 集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能会产生
fail-fast 机制。
例如:假设存在两个线程(线程 1、线程 2),线程 1 通过 Iterator 在遍历集合 A 中的元素,在某个时
候线程 2 修改了集合 A 的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个
时候程序就会抛出 ConcurrentModificationException 异常,从而产生 fail-fast 机制。
原因:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合
在被遍历期间如果内容发生变化,就会改变 modCount 的值。每当迭代器使用 hashNext()/next()遍历
下一个元素之前,都会检测 modCount 变量是否为 expectedmodCount 值,是的话就返回遍历;否则抛
出异常,终止遍历。
解决办法:
1.在遍历过程中,所有涉及到改变 modCount 值得地方全部加上 synchronized。
2、使用 CopyOnWriteArrayList 来替换 ArrayList
怎么确保一个集合不能被修改?
可以使用 Collections、unmodifiableCollection(Collection c)方法来创建一个只读集合,这样改变集合
的任何操作都会抛出 Java、lang、
UnsupportedOperationException 异常。
示例代码如下:
List<String>list =new ArrayList<>0;
list、add("x");
Collection<String>clist=Collections、unmodifiableCollection(list);
clist、add("y");//运行时此行报错
System、out、println(list、size());
迭代器 Iterator 是什么?
lterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取
迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除
元素。
因为所有 Collection 接继承了 Iterator 迭代器
public interface Collection<E>extends Iterable<E>{
//Query Operations
Iterator 怎么使用?有什么特点?
Iterator 使用代码如下:
List<String>list=new ArrayList<>0;
Iterator<String>it =list、iterator();
while(it、hasNext()){
String obj=it、next();
System、out、println(obj);
﹞
lterator 的特点是只能单向遍历,但是更加安全,因为它可以确保,在当前遍历
的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。
如何边遍历边移除 Collection 中的元素?
边遍历边修改 Collection 的唯一正确方式是使用 Iterator. remove()方法,如下:
Iterator<Integer>it =list. iterator();
while(it. hasNext()){
*//do something*
it. remove();
﹞
一种最常见的错误代码如下:
for(Integeri:list){
list. remove(i)
〗
运行以上错误代码会报 ConcurrentModificationException 异常。这是因为当使用 foreach(for(Integer
i:list))语句时,会自动生成一个 iterator 来遍历该 list,但同时该 list 正在被 Iterator. remove()修改。Java
一般不允许一个线程在遍历 Collection 时另一个线程修改它。
Iterator 和 ListIterator 有什么区别?
1、Iterator 可以遍历 Set 和 List 集合,而 Listlterator 只能遍历 List。
2、Iterator 只能单向遍历,而 Listiterator 可以双向遍历(向前/后遍历)。
3、Listlterator 实现 lterator接口,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获
取前面或后面元素的索引位置。
遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java 中 List 遍历的最佳实践是什么?
遍历方式有以下几种:
1、for 循环遍历,基于计数器。在集合外部维护一个计数器,然后依次读取每一个位置的元素当读
取到最后一个元素后停止。
2、迭代器遍历,Iterator。Iterator 是面向对象的一个设计模式,目的是屏蔽不同数据集合的特点,
统一遍历集合的接口。Java 在 Collections 中支持了 lterator 模式。
3、foreach 循环遍历。foreach 内部也是采用了 Iterator 的方式实现,使用时不需要显式声明 Iterator 或
计数器。优点是代码简洁,不易出错;缺点是只能做简单的遍历,不能在遍历过程中操作数据集
合,例如删除、替换。
最佳实践:
剩余29页未读,继续阅读
资源评论
小码叔
- 粉丝: 4145
- 资源: 1181
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功