集合框架(面试篇)

集合

在这里插入图片描述

ArrayList

在这里插入图片描述

List与数组之间的转换

在这里插入图片描述

ArrayList与LinkedList

在这里插入图片描述
在这里插入图片描述

红黑树

在这里插入图片描述

HashMap

HashMap是Java集合框架的一种实现,他是基于哈希表的一种结构,支持快速的插入、删除、查找。HashMap实现了Map接口,存储key-value格式的数据,其中key是唯一的,value可以不唯一。
HashMap通过哈希函数将key的hash值转化成数组的下标,理想情况下不同的键值产生不同的hash值,但是实际情况中会出现重合,hash冲突。
HashMap通过一个链表或树解决hash冲突,将映射到同一个下标的数据存放到链表或者树中。
HashMap的初始容量是16,默认的负载因子是0.75,当数组HashMap当中的数据超过容量*负载因子时进行扩容,扩容到原来的大小的2倍。
在这里插入图片描述
在这里插入图片描述

HashMap PUT流程

在这里插入图片描述

HashMap扩容机制

在这里插入图片描述

在这里插入图片描述

寻址算法

在这里插入图片描述
在这里插入图片描述

ConcurrentHashMap

**组成:**数组+链表+红黑树
ConcurrentHashMap是线程安全的,Java8通过CAS和synchronized块来实现线程安全,如果当前位置首节点为空,那么使用CAS插入当前节点,插入成功退出,插入失败重试;如果首节点不为空并且节点的Hash值为-1,表示正在扩容,当前线程加入帮助扩容;如果存在相同的与我们要put的value相同的值,直接返回当前存在的value;以上情况都不满足,采用对当前节点加锁(只对这一个Node节点加锁)。
在这里插入图片描述

Java8之前他不允许key为null,当key为null时,我们通过get(key)得到null不知道是否是value为null,还是不存在key,产生歧义。Java8后可以插入key为null的键,此时会通过特殊的逻辑来存储和检索值。

为什么不使用HashTable?
HashTable是通过synchronized锁来实现线程安全的,在并发情况下效率比较低。

异常

Java中异常分为检查异常和非检查异常(运行异常)
运行异常有1、空指针异常;2、数组越界异常;3、运算异常(除以0)4、对象强转异常(将对象强制类型转换为非子类对象)5、方法参数异常
非运行异常:I/O异常、文件未找到异常、类找不到异常

深拷贝和浅拷贝

区别在于如何处理引用对象
浅拷贝:新创建一个对象将原对象的所有非引用对象复制到新对象中,对于引用类型的对象只复制原引用对象的地址到新对象中,新旧对象使用同一个引用类型对象。
深拷贝:不仅仅复制了非引用类型的对象,还复制了引用类型的对象,创建了一个新的引用类型对象。新对象和就对象没有任何引用关系

面向对象

面向对象的核心思想是将显示世界的事务抽象成为对象,通过对象之间的交互来解决问题,完成程序功能。
OOP的特性:
1、封装:将属性和方法封装到对象中。隐藏内部状态和实现细节,对外暴露接口。提高了代码的安全性和可维护性。
2、继承:继承是一种创建类的机制,一个类可以从他的父类中继承属性和方法。继承支持代码复用,子类可以重写后者扩展父类的方法实现新的功能。
3、多态:一个类实例的相同方法在不同子类中可以有不同时实现。
4、抽象:抽象是通过简化复杂的现实世界问题来抽象模型的过程。抽象类和接口是实现抽象的两个主要方式。

重写与重载

重写:子类继承父类,子类中出现了一个与父类中完全相同的方法(方法名、参数列表、返回值类型)。重写是改变父类中的方法实现,子类根据自己的需求实现方法。注意:1、子类重写的方法必须与父类方法的方法名、参数列表、返回值类型相同,子类用@Override修饰重写的方法;2、子类重写方法的访问修饰符不能比父类严格;3、父类方法用final修饰,子类不能重写。
重载:重载是同一个类中有多个方法名相同的方法,但这些方法有不同的参数列表(参数数量、类型或者顺序不同),仅改变方法的返回类型并不能实现重载,编译器根据参数列表来选择调用那个方法,如果两个方法只有返回类型不同其他完全一样,则编译器无法分辨调用哪一个方法。

String、StringBulider、StringBuffer

String是一个常量不可改变的,修改一个String会新建一个新的String;StringBuffer是可变的是线程安全的;StringBuilder是可变的,但不是线程安全的

extends和super区别
== 和 equals()区别

==:如果是基本数据类型(byte、boolean、char、short、int、long、float、double)比较的是指,如果是引用类型比较的是引用地址。
equals():具体看各个类重写equals()方法之后的逻辑。比如String类,虽然是引用类型,但是重写了equals()方法,方法内部比较字符串的各个字符是否相等。

List跟Set区别

List:有序,按照插入的顺序保存对象,可以重复,允许多个Null值,可以通过下表和迭代器来遍历。
Set:无序,不可重复,最多只有一个Null值,只能通过迭代器获得所有元素。

集合遍历方式

List遍历

  1. 传统for循环
List<Integer> nums = new ArrayList<>();
for(int i=0;i<nums.size();i++){
	System.out.println(nums.get(i));
}
  1. 增强for循环
List<Integer> nums = new ArrayList<>();
for(Integer num : nums){
	System.out.println(num);
}
  1. Iterator迭代器
List<Integer> nums = new ArrayList<>();
Iterator iterator = list.iterator();
while(iterator.hasNext()){
	Integer item = iterator.next;
	System.out.println(item);
}
  1. 使用stream()流
List<Integer> nums = new ArrayList<>();
list.stream().forEach(System.out::println);

Set集合
5. 增强for循环

Set<String> set = new HashSet<>(Arrays.asList("item1", "item2", "item3"));
for (String item : set) {
    System.out.println(item);
}
  1. 迭代器
Set<String> set = new HashSet<>(Arrays.asList("item1", "item2", "item3"));
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    System.out.println(item);
}

MAP遍历
7. 将map转化为set使用增强for循环

Map<String, Integer> map = new HashMap<>();
map.put("item1", 1);
map.put("item2", 2);
map.put("item3", 3);

for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}
  1. 使用 Java 8 及以上版本的流(Stream)
Map<String, Integer> map = new HashMap<>();
map.put("item1", 1);
map.put("item2", 2);
map.put("item3", 3);

map.entrySet().stream().forEach(entry -> System.out.println(entry.getKey() + ": " + entry.getValue()));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值