Java面试(基础篇)——解构Java常见的基础面试题 结合Java源码分析

fail-safe 和fail-fast机制
Fail-fast:快速失败
Fail-fast : 表示快速失败,在集合遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出ConcurrentModificationException 异常,从而导致遍历失败

package com.tianju.test;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class DemoTest {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()){Integer next = iterator.next();list.add(55);System.out.println(next);}}
}
Fail-safe:失败安全
fail-safe:表示失败安全,也就是在这种机制下, 出现集合元素的修改,不会抛出
ConcurrentModificationException。
原因是采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先
复制原有集合内容,在拷贝的集合上进行遍历。由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到。

package com.tianju.test;import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;public class DemoTest2 {public static void main(String[] args) {CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();list.add(1);list.add(2);Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()){Integer next = iterator.next();list.add(55);System.out.println(next);}}
}
java.util.concurrent 包下的容器都是安全失败的,可以在多线程下并发使用,并发修改。
常见的的使用fail-safe 方式遍历的容器有ConcerrentHashMap 和 CopyOnWriteArrayList 等。
HashMap
hash冲突的问题
散列表Hash table & 散列函数 & 哈希冲突

Hash 算法,就是把任意长度的输入,通过散列算法输出结果是散列值。
在hashMap中,每个关键字被映射到从0到TableSize-1这个范围中的某个数,并且被放到适当的单元中。这个映射就叫作散列函数(hash function),理想情况下它应该计算起来简单,并且应该保证任何两个不同的关键字映射到不同的单元。不过,这是不可能的,因为单元的数目是有限的,而关键字实际上是用不完的。因此,我们寻找一个散列函数,该函数要在单元之间均匀地分配关键字。

public final int hashCode() {return Objects.hashCode(key) ^ Objects.hashCode(value);}

如何解决hash冲突:
-
(1)开放定址法:
也称为线性探测法,就是从发生冲突的那个位置开始,按照一定的次序从hash 表中找到一个空闲的位置,然后把发生冲突的元素存入到这个空闲位置中。ThreadLocal 就用到了线性探测法来解决hash 冲突的。 -
(2)链式寻址法:
这是一种非常常见的方法,简单理解就是把存在hash 冲突的key ,以单向链表的方式来存储,比如HashMap 就是采用链式寻址法来实现的。 -
(3)再hash 法:
就是当通过某个hash 函数计算的key 存在冲突时,再用另外一个hash 函数对这个key 做hash,一直运算直到不再产生冲突。这种方式会增加计算时间,性能影响较大。 -
(4)建立公共溢出区:
就是把hash 表分为基本表和溢出表两个部分,在冲突的元素,一律放入到溢出表中。
HashMap链式寻址法+红黑树解决hash 冲突
HashMap 在JDK1.8 版本中,通过链式寻址法+红黑树的方式来解决hash 冲突问题,其中红黑树是为了优化Hash 表链表过长导致时间复杂度增加的问题。当链表长度大于8 并且hash 表的容量大于64 的时候,再向链表中添加元素就会触发转化。

当链表长度大于8 并且hash 表的容量大于64 的时候,再向链表中添加元素就会触发转化。

受检异常和非受检异常
Java基础(8)——java的异常机制初步 & 异常的捕获和处理 & 自定义异常
受检异常和非受检异常,都是继承自Throwable 这个类中,分别是Error 和Exception,
- Error 是程序报错,系统收到无法处理的错误消息,它和程序本身无关。
- Excetpion 是指程序运行时抛出需要处理的异常信息如果不主动捕获,则会被jvm 处理。

- 受检异常的定义是程序在编译阶段必须要主动捕获的异常,遇到该异常有两种处理方法
(1)通过try/catch 捕获该异常;
(2)通过throw 把异常抛出去; - 非受检异常的定义是程序不需要主动捕获该异常,一般发生在程序运行期间,比如
NullPointException

受检异常的定义是程序在编译阶段必须要主动捕获的异常,遇到该异常有两种处理方法

为什么阿里巴巴的Java 开发手册不建议使用Java 自带的线程池
了解Java中线程池
Java进阶(5)——创建多线程的方法extends Thread和implements Runnable的对比 & 线程池及常用的线程池
4.【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这
样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

Executors 里面默认提供的几个线程池是有一些弊端的,如果是不懂多线程、或者是新手直接盲目使用,就可能会造成比较严重的生产事故。
为什么不能用
- 1.FixedThreadPool 和SingleThreadPool 中,阻塞队列长度是Integer.Max_Value,一旦请求量增加,就会堆积大量请求阻塞在队列中,可能会造成内存溢出的问题;

- 2.CachedThreadPool 和ScheduledThreadPool 中最大线程数量是Integer.Max_value,一旦请求量增加,导致创建大量的线程,使得处理性能下降。

JDK 动态代理为什么只能代理有接口的类
在Java 里面,动态代理是通过Proxy.newProxyInstance()方法来实现的,它需要传入被动态代理的接口类。

加入如下代码进行运行:
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
或者加入下面这句
System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true");

JDK 动态代理会在程序运行期间动态生成一个代理类$Proxy0,这个动态生成的代理类会继承java.lang.reflect.Proxy 类,同时还会实现被代理类的接口。
在Java 中,是不支持多重继承的,而每个动态代理类都会继承Proxy 类(这也是JDK动态代理的实现规范) ,所以就导致JDK 里面的动态代理只能代理接口,而不能代理实现类。

spring中的代理
Spring进阶(AOP的理解)——静态/动态代理 & 面向切面编程AOP(Aspect Oriented Programming) & 日志记录 & 增强方法

如果一定要针对普通类来做动态代理,可以选择cglib 这个组件,它会动态生成一个被
代理类的子类,子类重写了父类中所有非final 修饰的方法,在子类中拦截父类的所有
方法调用从而实现动态代理。
相关文章:
Java面试(基础篇)——解构Java常见的基础面试题 结合Java源码分析
fail-safe 和fail-fast机制 Fail-fast:快速失败 Fail-fast : 表示快速失败,在集合遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出ConcurrentModificationException 异常,从而导致遍历失败 package …...
Ubuntu 17.10的超震撼声音权限
从GNOME GUADEC 2017开发者大会归来之后,Canonical的Didier Roche就开始了一个日更博客系列,主要讲述即将带来的Ubuntu 17.10(Artful Aardvark)发行版将如何从Unity到GNOME Shell的转变。有趣的是,Ubuntu Unity桌面环境…...
图像信号处理板设计原理图:2-基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板
综合图像处理硬件平台包括图像信号处理板2块,视频处理板1块,主控板1块,电源板1块,VPX背板1块。 一、板卡概述 图像信号处理板包括2片TI 多核DSP处理器-TMS320C6678,1片Xilinx FPGA XC7K420T-1FFG1156,1片X…...
【数组】移除元素(暴力遍历×双指针√)
一、力扣题目链接 27.移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 你不需要考虑数组中超出新长度后面的元素。 二、思路 要知道数组的元素在内存地址中是连续的,不…...
【笔试题】华为研发工程师编程题
1.汽水瓶 某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。 小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。 数据范围:输入的正整数满足 1≤n≤100 1≤n≤…...
如何转换Corona和Vray材质?cr材质转vr材质的方法
cr材质转vr材质的方法一:使用CG Magic插件,一键转换 CG Magic是一款基于3ds Max深度开发的智能化辅助插件,上千项实用功能,降低渲染时长,节省时间和精力,大幅简化工作流程,助力高效完成创作。 …...
蓝桥每日一题(day 4: 蓝桥592.门牌制作)--模拟--easy
#include <iostream> using namespace std; int main() {int res 0;for(int i 1; i < 2021; i ){int b i;while(b){if (b % 10 2) res ;b / 10;}}cout << res; return 0; }...
leetcode(2)栈
leetcode 155 最小栈 stack相当于栈,先进后出 存储全部栈元素 [-3,2,-1] min_stack,存储栈当前位置最小的元素 [-3,-3,-3] class MinStack:def __init__(self):self.stack []self.min_stack [math.inf]def push(self, x: int) :self.stack.append(x)self.min_sta…...
有什么小程序可以下载视频号的视频?
最近有一些朋友问我,【视频号下载助手】和【视频下载bot】小程序,有什么作用? 首先视频号下载助手是协助用户进行下载的,但由于下载要符合平台规定,我们就将视频下载助手与视频下载bot小程序想结合的模式࿰…...
GDB调试简单介绍
最近和许多同事交流时,发现好多人只是在IDE上debug,但是gdb却一点都不了解;校招新来的同事更是都没听过gdb这个工具,所以在培训时给他们培训了一下;另外好久也没写blog了,刚好把这篇笔记简单分享一下。 0 …...
关于opencv的contourArea计算方法
cv::contourArea计算的轮廓面积并不等于轮廓点计数,原因是cv::contourArea是基于Green公式计算 老外的讨论 github 举一个直观的例子,图中有7个像素,橙色为轮廓点连线,按照contourArea的定义,轮廓的面积为橙色所包围…...
《机器学习》第6章 支持向量机
文章目录 6.1 间隔与支持向量6.2 对偶问题6.3 核函数支持向量展式核函数 6.4 软间隔与正则化6.5 支持向量回归6.6 核方法6.7 阅读材料 6.1 间隔与支持向量 分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面,将不同类别的样本分开.但能将训练样本分开的划分…...
Python学习基础笔记七十七——json序列化
客户端和服务端之间需要交换数据才能完成各种功能。 假设 服务端程序都是用Python语言开发的话,那么 服务端从数据库中获取的最近的交易列表,可能就是像下面这样的一个Python列表对象: historyTransactions [{time : 20170101070311, #…...
【C++】C++11新特性
文章目录 一、C发展简介二、C11简介三、列表初始化1.统一使用{}初始化2.initializer_list类 四、变量的类型推导1.auto2.decltype3.nullptr 五、范围for循环六、STL中一些变化七、final与override八、新的类功能1.新增默认成员函数2.成员变量的缺省值3.default 和 delete4.fina…...
使用 PyAudio、语音识别、pyttsx3 和 SerpApi 构建简单的基于 CLI 的语音助手
德米特里祖布☀️ 一、介绍 正如您从标题中看到的,这是一个演示项目,显示了一个非常基本的语音助手脚本,可以根据 Google 搜索结果在终端中回答您的问题。 您可以在 GitHub 存储库中找到完整代码:dimitryzub/serpapi-demo-project…...
C++11——多线程
目录 一.thread类的简单介绍 二.线程函数参数 三.原子性操作库(atomic) 四.lock_guard与unique_lock 1.lock_guard 2.unique_lock 五.条件变量 一.thread类的简单介绍 在C11之前,涉及到多线程问题,都是和平台相关的,比如windows和linu…...
力扣每日一题48:旋转图像
题目描述: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],…...
操作系统——吸烟者问题(王道视频p34、课本ch6)
1.问题分析:这个问题可以看作是 可以生产多种产品的 单生产者-多消费者问题 2.代码——这里就是由于同步信号量的初值都是1,所以没有使用mutex互斥信号, 总共4个同步信号量,其中一个是 finish信号量...
通讯协议学习之路:CAN协议理论
通讯协议之路主要分为两部分,第一部分从理论上面讲解各类协议的通讯原理以及通讯格式,第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN;视频会发布在bilibili(UID:399951374) 序、…...
Redis常用配置详解
目录 一、Redis查看当前配置命令二、Redis基本配置三、RDB全量持久化配置(默认开启)四、AOF增量持久化配置五、Redis key过期监听配置六、Redis内存淘汰策略七、总结 一、Redis查看当前配置命令 # Redis查看当前全部配置信息 127.0.0.1:6379> CONFIG…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
