JAVA基础常见面试题
1.Java接口和抽象类的区别?
-
接口
-
接口中不能定义构造器
-
方法全部都是抽象方法,JDK8提供方法默认实现
-
接口中的成员都是public的
-
接口中定义的成员变量实际上都是常量
-
一个类可以实现多个接口
-
-
抽象类
-
抽象类中可以定义构造器
-
可以有抽象方法和具体方法
-
抽象类中的成员可以是private、默认、protected、public
-
抽象类中可以定义成员变量
-
有抽象方法的类必须声明为抽象类,而抽象类未必有抽象方法
-
抽象类中可以包含静态方法
-
一个类只能继承一个抽象类
-
2.Java面向对象有哪些特征?
-
抽象:把现实世界的某一类物质抽象出来,抽象分为数据抽象,过程抽象(数据抽象就是比如鸟的翅膀,过程抽象就是鸟用翅膀飞。)
-
继承:存在层级关系,子类复用父类的代码块,继承关系存在方法重写。
-
封装:将一部分代码封装出来,实现代码的复用
-
多态:子类的对象指向父类的引用,不同的子类对同一消息做出的响应。
3.JDK8的新特性有哪些?
-
接口的默认实现,default方法。给程序员留的一个后悔药,可以直接在接口的默认方法里写业务的代码逻辑。
-
LocalDateTime、LocalDateAPI,jdk8新加的时间Api,或方法LocalDate.now()可以通过提供的API获取年月日信息,格式化简便。
-
lambda表达式,使java语言拥有类似python语言的函数式编程方式,代码简洁。jdk8提供的函数式接口有Function、BiFunction、Consumer、Supplier、Predicate。
-
Stream集合API,提供流式操作集合,对集合的分类,规整更方便,常见的API有map()转换函数,filter()过滤函数,groupingBy()分组函数,sort()排序函数等配合Collectors收集器使用。
-
Optional类,解决空指针异常的类,支持获取对象,判断对象是否存在,对象为null返回兜底数据等。
4.你知道运算符&和&&、|和||的区别吗?
-
&:按位与操作,只有对应的两个二进制数为1时,结果才为1。
- 1&1=1、1&0 = 0、0&1 = 0、0&0 = 0
-
|:按位或操作,只要有一个二进制数为1时,结果就为1。
- 1&1=1、1&0 = 1、0&1 = 1、0&0 = 0
-
&&:短路与操作,判断短路与左侧是否正确,如果不正确则不执行短路与后面的判断。
-
||:短路或操作,判断短路或左侧是否正确,如果正确则不执行短路或后面的判断。
5.如何以最有效的方法计算2乘8?
-
采用位运算:2<<3
-
将一个数左移n位,就相当于乘以2的n次方,位运算是CPU直接支持的,所以效率高。
-
JDK源码中HashMap的默认容量是16,采用位运算。
-
int DEFAULT_INITIAL_CAPACITY = 1 << 4; //16
public static void main(String[] args) {int num = 2 << 3;System.out.println(num);}
6.实现变量交换的方式有几种?
- 第一种
定义一个中间变量c,但是这种往往损耗性能。
- 第二种
private static void swap1(int a, int b) {System.out.println("a = "+a+",b = "+b);//现在a 相当于a和b的和a = a+b;//b就相当于a的值了b = a-b;//a就相当于b的值了a = a-b;System.out.println("a = "+a+",b = "+b);}
- 第三种 异或运算(一个数与另一个数异或两次就是其本身,一个数和自身异或的结果是0)
private static void swap2(int a, int b) {System.out.println("a = "+a+",b = "+b);//a = a^ba = a^b;//b = b^a^bb = b^a;//a = a^b^aa = a^b;System.out.println("a = "+a+",b = "+b);}
7.说下Java数据类型分类?
- 基本数据类型:byte、short、int、long、boolean、char、double、float
- 引用数据类型:String、Enum、接口、抽象类、数组
8.==和equals的区别?
==在比较基本数据类型的时候,比较的是数值,比较引用数据类型的时候,比较的是内存地址,Object类下的equals比较的是对象的地址,String类中重写了equals方法,比较的是字符串的数值。
9.try里面有个return,finally里也有个return,会有什么返回结果?
public boolean test(){try {return false;}finally {return true;}}
在执行try、catch中的return之前⼀定会执行finally中的代码(如果finally存在),如果finally中有return语句,就会直接执行finally中的return方法,所以finally中的return语句⼀定会被执行的。
10.你知道try-with-resource新特性吗?
JDK1.7之后处理异常块,可实现自动关闭资源操作,try()里面定义多个资源,执行完进行关闭。
11.String str = new String(“a”),创建了几个对象?
如果常量池中存在,则直接new一个对象。如果常量池不存在,则在常量池中创建一个对象,也在堆中创建一个对象。
12.String、StringBuffer、StringBuilder的区别?
-
三者都是被final修饰的类。
-
本质上都是char[]字符数组的实现。
-
String、StringBuffer、StringBuilder中,String是不可变的对象,其他两个是可变的。
-
使用场景
-
操作少量的数据用String,但是常改动内容且操作数据多情况下最好不要用String,因为每次生成中间对象性能会降低。
-
单线程下操作大量的字符串用StringBuilder,虽然线程不安全但是不影响。
-
多线程下操作大量字符串,且需要保证线程安全,则用StringBuffer
-
13.Overload和Override的区别?
- 重载Overload:表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同,参数个数或类型不同。
- 重写Override:表示子类中的方法可以与父类中的某个方法的名称和参数完全相同。
14.JDK8接口的新特性?
- interface中可以有static方法,但必须有方法体实现,该方法只属于该接口,接口名直接调用该方法。
- 接口中新增default关键字修饰的方法,default方法只能定义在接口中,可以在子类或子接口中被重写default定义的方法。
- 父接口的default方法如果被重写那么子类的实现对象调用,以重写的方法为准。
- 本类没有重写父接口的default方法,则使用父接口的default方法逻辑。
15.说下Vector和ArrayList、LinkedList的联系和区别?
- 三者区别:
- ArrayList:底层是数组实现,线程不安全,查询和修改非常快,但是增加和删除慢。
- LinkedList:底层是双向链表,线程不安全,查询和修改速度慢,但是增加和删除快。
- Vector:底层是数组实现,线程安全的,操作的时候使用synchronized进行加锁。
- 使用场景:
- Vector已经很少用了
- 增加和删除场景多用LinkedList
- 查询修改多用ArrayList
16.如果需要保证线程安全,ArrayList应该怎么做?
- 方式一:可以自己写个包装类,继承ArrayList,根据业务一般是add/update/remove加锁
- 方式二:使用Collections.synchronizedList(new ArrayList),使用synchronized加锁,底层加入同步代码块。
- 方式三:采用CopyOnWriteArrayList<>(),底层使用ReentrantLock加锁。
17.了解CopyOnWriteArrayList吗?
CopyOnWriteArrayList是JUC下提供的一个类,在执行修改操作时,会拷贝一份新的数组进行操作(add、set、remove),代价十分昂贵,在执行完修改后会将原来的集合的引用指向新的集合来完成修改的操作,源码里用ReentrantLock可重入锁来保证不会有多个线程同时拷贝一份数组。
- 应用场景:读高性能,适用读操作远远大于写操作的场景中使用(读的时候是不需要加锁的,直接获取,删除和增加是需要加锁的,读多写少)。
- Collections.synchronizedList:线程安全的原因是因为它几乎在每个方法中使用了synchronized同步锁。
- 场景:写操作性能那个比CopyOnWriteArrayList好,读操作性能那个并不如CopyOnWriteArrayList。
18.CopyOnWriteArrayList的设计思想是怎样的,有什么缺点?
-
CopyOnWriteArrayList的设计思想读写分离+最终一致。
-
缺点:内存占用问题,写时复制机制,内存里面会同时驻扎两个对象的内存,旧的对象和新写入的对象,如果对象大则容易发生Yong GC和Full GC。
19.说下ArrayList的扩容机制是怎样的?
-
注意:JDK1.7之前ArrayList默认大小是10,JDK1.7之后是0。
-
未指定集合容器大小,默认是0,若已经指定大小则集合大小为指定的,当集合第一次添加元素的时候,集合大小扩容为10,ArrayList的元素个数大于其容量,扩容的大小=原始大小+原始大小/2。
20.说下HashMap和HashTable的区别?
-
HashMap:底层是哈希表实现,非线程安全的,默认容量是16、允许有空的键和值,实现的是Map接口。
-
HashTable:基于哈希表实现,线程安全的(加了synchronized),默认容量是11,不允许有null的键和值,继承自 Dictionary 类。
21.说下对象的hashcode()和equals()?
-
hashcode():顶级类Object里面的方法,所有的类都是继承自Object,返回一个int类型的数,根据一定的hash规则,映射成一个数组,即散列值。
-
equals():顶级类Object类的方法,返回一个boolean类型,根据自定义的匹配规则,用于匹配两个对象是否一样。
-
判断一个对象是否相等,先判断hashcode,当hashcode不同时,返回两个对象不同,当hashcode相同时,就进行equals比较。
22.HashMap和TreeMap应怎样选择?
-
HashMap:底层实现是散列桶(数组+链表)jdk1.8之后,当链表长度大于8的时候转换成红黑树,可以实现快速的存储和检索,但是确实包含无序的元素,适用于map中插入删除和定位元素。
-
TreeMap:使用存储结构是一个平衡二叉树->红黑树,可以自定义排序规则,要实现Comparator接口,能便捷的实现内部元素的各种排序,但是一般性能比HashMap差,适用于按照自然排序或自定义规则的场景。
23.Set和Map的关系?
-
Set的核心就是不保存重复的元素,存储一组唯一的对象。
-
Set的每一种实现都是对应Map里的一种封装,HashSet对应的就是HashMap,TreeSet对应的就是TreeMap。
-
Set的集合对象作为Map的Key,在使用一个Object常量作为value。
24.常见Map的排序规则是怎样的?
- 按照添加顺序使用LinkedHashMap(),按照自然排序使用TreeMap,自定义排序TreeMap(Comparetor c)。
25.如果需要线程安全,且效率高的Map,应该怎么做?
- 多线程环境下可以用JUC包下的ConcurrentHashMap,Collections.synchronizedMap(),ConcurrentHashMap的效率要比HashTable高很多,使⽤Collections.synchronizedMap包装后返回的map是加锁的。
26.说一说HashMap的底层实现?
-
HashMap底层是数组+链表+红黑树,红黑树是JDK1.8之后才有的,当链表长度大于8的时候,链表会转换成红黑树。
-
数组中的每一项都是一个链表,即数组和链表的结合体。
-
jdk1.8之后是一个Node<K,V>[] tables 数组,jdk1.8之前是Entry<K,V>数组,Node继承Entry,Entry是一个key-value的键值对,它持有一个指向下一个Entry的引用,table数组中存放每个Node元素。
27.什么是hash碰撞,创建的解决办法有哪些,HashMap采用哪种方法?
-
hash碰撞的意思就是不同的key计算得到相同的Hash值。需要放到同个数组的桶内。
-
常见的解决办法:链表法、开发地址法、再哈希法等。
-
HashMap采用的就是链表法。
28.说一说HashMap底层为什么要用数组+链表+红黑树?
-
数组Node<K,V>[] table,根据对象的key的hash值判断数组在那个索引节点下。
-
链表的作用是为了解决Hash冲突,将Hash值一样的对象存放在一个链表中对应的槽位上。
-
红黑树是JDK8替换节点超过8个的时候的链表用的,主要是提升查询性能。
-
通过hash碰撞,让HashMap不断产生碰撞,那么相同的key的位置的链表就会不断的增长,当对这个HashMap的响应位置进行查询的时候,就会遍历这个超大的链表,性能会下降,所以改用红黑树。
29.为什么选择红黑树,为什么链表长度到达8之后才去替换成红黑树?
-
使用红黑树只要是为了提升查询的速度,红黑树是平衡二叉树的一种,插入数据后会通过左旋、右旋、变色等操作来保持平衡,解决单链表查询深度的问题。
-
二叉树在查找的时候会变成一个线性结构,和原来的链表存在一样深度遍历的问题,所以不是用二叉树。
-
在数据量少的时候操作数据,遍历线性表比红黑树所消耗的资源少,前期采用线性表,等到一定数量之后才会变成红黑树。
30.了解ConcurrentHashMap吗,为什么性能比HashTable高?
- ConcurrentHashMap线程安全的Map,采用了分段锁的思想提高性能,锁粒度更细化。HashTable类基本上所有的方法都是采用synchronzied进行线程安全控制,高并发下效率降低。
31.JDK7和JDK8中的ConcurrentHashMap实现有什么区别?
-
JDK8之前,ConcurrentHashMap使用锁分段技术,将数据分成⼀段段存储,每个数据段配置⼀把锁,即segment类,这个类继承ReentrantLock来保证线程安全。
- 技术点:Segment+HashEntry
-
JKD8的版本取消Segment这个分段锁数据结构,底层也是使⽤Node数组+链表+红⿊树,从而实现对每⼀段数据就行加锁,也减少了并发冲突的概率,CAS(读)+Synchronized(写)。
- 技术点:Node+Cas+Synchronized
32.Map的遍历方式有哪些?
-
先通过map.keySet()获取到键,然后根据键获取到值。
-
通过Map.Entry(String,String)获取,然后使用entry.getKey()获取到键,然后通过entry.getValue()获取到值。
-
使用Iterator迭代器遍历Map。
-
Map.values()获取所有的value,进行遍历。
33.说下HashMap的put和get的核心逻辑
- put核心逻辑
- 首先判断table是否为空或者长度为0,如果是的话进行扩容初始化。
- 如果为否的话,则进行hash分析命中的那个桶是否有值,如果没有直接插入数据。
- 如果命中桶中有数据判断key值是否一样,是的话直接覆盖原值。
- 否则的话,判断是否为树节点,如果是树节点,则直接插入到红黑树。
- 否则的话,就要遍历链表,判断长度是否大于8,是的话转为红黑树插入。
- 最后都要判断一下是否需要扩容。
- get核心流程
- 先获取首节点,hash碰撞概率小,通常链表第一个节点就是值,没必要去循环遍历。
- 如果不止一个节点,就要循环遍历了。
- 判断是红黑树还是链表,在对应的数据结构中查找就行了。
34.说下ConcurrentHashMap的put的核心逻辑
- 首先key进行重哈希spread(key.hashCode())。
- 对当前table进行无条件的循环。
- 如果没有初始化table,则用initTable进行初始化。
- 如果没有hash冲突,则直接用cas插入新节点,成功后则直接判断是否需要扩容吗,然后结束。
- 如果是MOVED状态的话,就需要扩容,如果存在hash冲突,利用synchronzied加锁保证线程安全。
- 如果是链表,则直接遍历插入,如果数量大于8,则需要转成红黑树。
- 最后是检查一下是否需要扩容。
相关文章:

JAVA基础常见面试题
1.Java接口和抽象类的区别? 接口 接口中不能定义构造器 方法全部都是抽象方法,JDK8提供方法默认实现 接口中的成员都是public的 接口中定义的成员变量实际上都是常量 一个类可以实现多个接口 抽象类 抽象类中可以定义构造器 可以有抽象方法和具体…...

通过一张照片来定位拍摄地点和网站的域名 LA CTF 2023
简介 这次打ctf遇到了一个比较经典的osint类题目,在这里分享一下如何做此类题目 题目链接: https://platform.lac.tf/challs题目简介: 你能猜出这个猫天堂的名字吗?答案是此位置的网站域。例如,如果答案是 ucla&…...

SpringBoot(powernode)(内含教学视频+源代码)
SpringBoot(powernode)(内含教学视频源代码) 教学视频源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87484637 目录SpringBoot(powernode)(内含教学视频…...

TEMU联盟计划用意何在?做推广达人真的能收入满满吗?
据东哥近期了解,Temu在北美市场表现十分火爆,甚至冲上了AppStore下载榜第一名。Temu在美国市场上采用了类似PDD的病毒式传播策略,以实惠的产品和折扣吸引消费者并动员普通人大量传播链接和App下载,所以有了TEMU联盟计划࿰…...

【概念辨析】二维数组传参的集中可能性
一、二维数组传参竟然不是用二级指针进行接收? 今天进行再一次的二级指针学习时,发现了一条以前没怎么注意过的知识点:二维数组进行传参只能用二维数组(不能省略列)进行接收或者是数组指针。 问题复现代码如下…...

Photon Vectorized Engine 学习记录
Photon Hash Aggregation Vectorization Photon Hash Join 的向量化的要点是:使用开放地址法。步骤: 向量化计算 hash 值基于 hash 向量化计算 bucket 下标,得到 bucket index 向量基于 bucket index 向量中记录的下标找到 bucketÿ…...

webRTC学习-基础知识
webRTC学习1、webRTC简介1.1什么是webRTC?1.2、作用2、webRTC通信原理2.1、媒体协商(SDP)2.2、网络协商(candidate)2.2.1、STUN2.2.2、TURN2.3、媒体协商网络协商数据的交换通道webRTC官网1、webRTC简介 1.1什么是web…...

MySQL数据库——JDBC编程
文章目录一、什么是Java的JDBC二、JDBC编程三、代码整体展示一、什么是Java的JDBC JDBC,即Java Database Connectivity。意思是java数据库连接。是一种用来执行 SQL 语句的 JavaAPI,是Java中数据库的连接规范。这个 API 由 java.sql* 和 javax.sql* 包中…...

【面向小白】你见过这样讲解队列的吗?(阅此文可学会用纯C手撕一个队列)
目录 0.前言 1.什么是队列 2.选择什么结构实现队列 3.用C语言实现队列 3.1用什么可以封装代表一个队列 3.2队列接口的设计 3.3 队列的初始化 3.4 队列的销毁 3.5* 队列的状态分析 3.6 队列的插入 3.7 队列的删除 3.8 队列的大小(有效元素的数目ÿ…...

[element plus] 对话框组件再封装使用 - vue
学习关键语句: 饿了么组件dialog组件使用 dialog组件二次封装 vue3中封住的组件使用update触发更新 vue3中封装组件使用v-model:属性值来传值 写在前面 这是我遇到的一个页面需求 , 其中一个对话框的内容是很常用的 , 所以我将它封装出来才写的一篇文章 现在给出如下需求: 封…...

Markdown基本语法简介
前言:当你在git平台创建一个仓库时,平台会自动创建一个README.md文件,并将它的内容展现在web端页面,方面其他读者查阅。README.md实则是一个适用Markdown语法的文本文件,从他的后缀md即可看出它是Markdown的缩写。在gi…...

分布式服务的接口幂等性如何设计
1.1 概述 所谓幂等: 多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。 基于RESTful API的角度对部分常见类型请求的幂等性特点进行分析 举个例子: 假如你有个某多多 有个服务 服务提供一个接口,结果这个服务部署在…...

视频流截取保存到本地路径(打包jar包CMD运行)
需求:现在有一批https的监控视频流URL,需要对视频流进行每三秒截屏一次,并保存到本地路径,png格式,以当前时间命名。代码:import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Fra…...

mysql索引失效的几种情况
失效的几种情况 1、select * from xxx 2、索引列上有计算 3、索引列上有函数 4、like左边包含‘%’ 5、使用or关键字 6、not in和not exists 7、order by 8、不满足最左匹配原则 给code、age和name这3个字段建好联合索引:idx_code_age_name。 该索引字段的顺…...

Windows下载安装Redis的详细步骤
目录 一、概述 1.redis的版本维护介绍 2.msi安装包和压缩包的优点和缺点 二、操作步骤 三、测试是否安装成功(查看版本) 四、获取资源 一、概述 1.redis的版本维护介绍 Redis的官网只提供Linux系统的下载。但是微软的技术团队长期开发和维护着这…...

【蓝桥杯每日一题】差分算法
🍎 博客主页:🌙披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 蓝桥杯 🌙我与杀戮之中绽放,亦如黎明的花…...

MyBatis Plus 数据库字段加密处理
目录1.场景介绍2.Maven依赖2.AESUtil.java 加解密工具类3.字段处理类4.修改 MyBatis Plus 查询4.1 修改表对应实体类4.2 修改加密字段对应属性4.3 修改 xml 使用 ResultMap4.4 修改 xml 中 el 表达式5.测试结果6.MyBatis Plus 缺陷补充:测试实例1 查询测试1.1 查询信…...

openpose在win下环境配置
1.下载OpenPose库 以下二选一进行下载源码 (1)git进行下载 打开GitHub Desktop或者Powershell git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose cd openpose/ git submodule update --init --recursive --remote(2)在github上手动下载 由于下载环境问…...

【剑指offer-C++】JZ16:数值的整数次方
【剑指offer】JZ16:数值的整数次方题目描述解题思路题目描述 描述:实现函数 double Power(double base, int exponent),求base的exponent次方。 注意: 1.保证base和exponent不同时为0。 2.不得使用库函数,同时不需要…...

了解Axios及其运用方式
Axios简介 axios框架全称(ajax – I/O – system): 基于promise用于浏览器和node.js的http客户端,因此可以使用Promise API 一、axios是干啥的 说到axios我们就不得不说下Ajax。在旧浏览器页面在向服务器请求数据时,…...

【LeetCode】剑指 Offer(7)
目录 写在前面: 题目剑指 Offer 17. 打印从1到最大的n位数 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 18. 删除链表的节…...

Python:try except 异常处理整理
目录 一、try except异常处理的语句格式 二、获取相关异常信息 (1)sys.exec_info() 三、traceback模块的常用方式 (1)traceback.print_tb(tb, limitNone, fileNone) 打印指定堆栈异常信息 (2)tracebac…...

Redis Lua脚本的详细介绍以及使用入门
Redis Lua脚本的详细介绍以及使用入门。 文章目录Redis Lua脚本的引入开源软件的可扩展性Redis的扩展性脚本Redis Lua脚本的基本使用通过EVAL命令执行Lua脚本通过脚本与Redis交互Java中调用Redis Lua脚本Java调用Lua脚本的方式Redis Lua脚本的使用建议脚本缓存脚本缓存稳定性脚…...

synchronized和ReentrantLock有什么区别呢?
第15讲 | synchronized和ReentrantLock有什么区别呢? 从今天开始,我们将进入 Java 并发学习阶段。软件并发已经成为现代软件开发的基础能力,而 Java 精心设计的高效并发机制,正是构建大规模应用的基础之一,所以考察并发…...

SVHN数据集下载及使用方法
街景门牌号数据集(SVHN),这是一个现实世界数据集,用于开发目标检测算法。它需要最少的数据预处理过程。它与 MNIST 数据集有些类似,但是有着更多的标注数据(超过 600,000 张图像)。这些数据是从…...

产业安全公开课:2023年DDoS攻击趋势研判与企业防护新思路
2023年,全球数字化正在加速发展,网络安全是数字化发展的重要保障。与此同时,网络威胁日益加剧。其中,DDoS攻击作为网络安全的主要威胁之一,呈现出连年增长的态势,给企业业务稳定带来巨大挑战。2月21日&…...

Docker 容器命令 和安装各种镜像环境
CentOS安装Docker 1.1.卸载(可选) 如果之前安装过旧版本的Docker,可以使用下面命令卸载: yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotat…...

【数据结构】顺序表的深度剖析
🌇个人主页:平凡的小苏 📚学习格言:别人可以拷贝我的模式,但不能拷贝我不断往前的激情 🛸C语言专栏:https://blog.csdn.net/vhhhbb/category_12174730.html 🚀数据结构专栏ÿ…...

当面试官问“你的SQL能力怎么样”时,怎么回答才不会掉进应聘陷阱?
在某平台看到一个比较实际的问题,在这里分享给职场新人。 SQL已经是职场最常用的一种编程语言,所以应聘技术或非技术岗位,都可能会被问道一个问题:你的SQL能力怎么样? 对于职场新人来说(SQL高手可以无视下…...

AI作画—中国画之山水画
山水画,简称“山水”,中国画的一种,描写山川自然景色为主体的绘画。山水画在我国绘画史中占有重要的地位。 山水画形成于魏晋南北朝时期,但尚未从人物画中完全分离。隋唐时始终独立,五代、北宋时趋于成熟,…...