简介

分享几道常见的Java后端基础面试题,以下部分内容来自网络,只是笔者学习的一些总结,方便后面翻阅查看。

List 和 Set 的区别?

List , Set 都是继承自 Collection 接口
List 特点:元素有放入顺序,元素可重复 , Set 特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,元素虽然无放入顺序,但是元素在set中的位置是有该元素的 HashCode 决定的,其位置其实是固定的,加入Set 的 Object 必须定义 equals ()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。

  1. Set和List对比 Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
  2. List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变
HashSet 是如何保证不重复的?

向 HashSet 中 add ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合 equles 方法比较。
HashSet 中的 add ()方法会使用 HashMap 的 add ()方法。以下是 HashSet 部分源码:

private static final Object PRESENT = new Object();
private transient HashMap<E,Object> map;
public HashSet() { map = new HashMap<>(); }
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}

HashMap 的 key 是唯一的,由上面的代码可以看出 HashSet 添加进去的值就是作为 HashMap 的key。所以不会重复( HashMap 比较key是否相等是先比较 hashcode 在比较 equals )。

HashMap 是线程安全的吗,为什么不是线程安全的?

不是线程安全的;
如果有两个线程A和B,都进行插入数据,刚好这两条不同的数据经过哈希计算后得到的哈希码是一样的,且该位置还没有其他的数据。假设一种情况,线程A通过if判断,该位置没有哈希冲突,进入了if语句,还没有进行数据插入,这时候 CPU 就把资源让给了线程B,线程A停在了if语句里面,线程B判断该位置没有哈希冲突(线程A的数据还没插入),也进入了if语句,线程B执行完后,轮到线程A执行,现在线程A直接在该位置插入而不用再判断。这时候,你会发现线程A把线程B插入的数据给覆盖了。发生了线程不安全情况。本来在 HashMap 中,发生哈希冲突是可以用链表法或者红黑树来解决的,但是在多线程中,可能就直接给覆盖了。

HashMap 的扩容过程?

当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值—即当前数组的长度乘以加载因子的值的时候,就要自动扩容啦。扩容( resize )就是重新计算容量,向 HashMap 对象里不停的添加元素,而 HashMap 对象内部的数组无法装载更多的元素时,对象就需要扩大数组的长度,以便能装入更多的元素。当然 Java 里的数组是无法自动扩容的,方法是使用一个新的数组代替已有的容量小的数组,就像我们用一个小桶装水,如果想装更多的水,就得换大水桶。

cap =3, hashMap 的容量为4;
cap =4, hashMap 的容量为4;
cap =5, hashMap 的容量为8;
cap =9, hashMap 的容量为16;
如果 cap 是2的n次方,则容量为 cap ,否则为大于 cap 的第一个2的n次方的数。

final、finally、finalize的区别?
  • final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
  • finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
  • finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断。
Java获取反射的三种方法?
  1. 1.通过new对象实现反射机制
  2. 2.通过路径实现反射机制
  3. 3.通过类名实现反射机制
//获取反射机制三种方式
public static void main(String[] args) throws ClassNotFoundException {
//方式一(通过建立对象)
Student stu = new Student(); Class classobj1 = stu.getClass(); System.out.println(classobj1.getName());
//方式二(所在通过路径-相对路径)
Class classobj2 = Class.forName("fanshe.Student"); System.out.println(classobj2.getName());
//方式三(通过类名)
Class classobj3 = Student.class; System.out.println(classobj3.getName()); }
Java反射机制?

Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射机制。
Class 类与 java.lang.reflect 类库一起对反射的概念进行了支持,该类库包含了 Field,Method,Constructor 类 (每个类都实现了 Member 接口)。这些类型的对象时由 JVM 在运行时创建的,用以表示未知类里对应的成员。这样你就可以使用 Constructor 创建新的对象,用 get() 和 set() 方法读取和修改与 Field 对象关联的字段,用invoke() 方法调用与 Method 对象关联的方法。另外,还可以调用 getFields() getMethods() 和 getConstructors() 等很便利的方法,以返回表示字段,方法,以及构造器的对象的数组。这样匿名对象的信息就能在运行时被完全确定下来,而在编译时不需要知道任何事情。

Cloneable 接口实现原理?

Cloneable接口是Java开发中常用的一个接口, 它的作用是使一个类的实例能够将自身拷贝到另一个新的实例中,注意,这里所说的“拷贝”拷的是对象实例,而不是类的定义,进一步说,拷贝的是一个类的实例中各字段的值。

在开发过程中,拷贝实例是常见的一种操作,如果一个类中的字段较多,而我们又采用在客户端中逐字段复制的方 法进行拷贝操作的话,将不可避免的造成客户端代码繁杂冗长,而且也无法对类中的私有成员进行复制,而如果让需要 具备拷贝功能的类实现Cloneable接口,并重写clone()方法,就可以通过调用clone()方法的方式简洁地实现实例 拷贝功能

浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
如:

对象 A1 中包含对 B1 的引用, B1 中包含对 C1 的引用。

  1. 浅拷贝 A1 得到 A2 , A2 中依然包含对 B1 的引用, B1 中依然包含对 C1 的引用。
  2. 深拷贝则是对浅拷贝的递归,深拷贝A1 得到 A2 , A2 中包含对 B2 ( B1 的 copy )的引用, B2 中包含对 C2 ( C1 的 copy )的引用。

若不对clone()方法进行改写,则调用此方法得到的对象即为浅拷贝

异常分类以及处理机制?

Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。
Throwable又派生出Error类和Exception类。

  • 错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。 因此,程序员应该关注Exception为父类的分支下的各种异常类。
  • 异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用, 是异常处理的核心。

    总体上我们根据 Javac 对异常的处理要求,将异常类分为二类。
  • 非检查异常( unckecked exception ): Error 和 RuntimeException 以及他们的子类。
    javac 在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用 try… catch…finally )这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理。这样的异常发生的原因多半是代码写的有问题。
    如:除0错误 ArithmeticException ,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException 等等。
  • 检查异常( checked exception ):除了 Error 和RuntimeException 的其它异常。 javac强制要求程序员为这样的异常做预备处理工作(使用 try…catch…finally 或者 throws )。在方法中要么用try-catch 语句捕 获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样 的异常时刻准备着。如SQLException,IOException,ClassNotFoundException等。
wait 和 sleep 的区别?
  • 1、sleep 来自 Thread 类,和 wait 来自 Object 类。
  • 2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
  • 3、wait,notify和 notifyAll 只能在同步控制方法或者同步控制块里面使用,而 sleep 可以在任何地方使用(使用范围)
  • 4、sleep 必须捕获异常,而 wait , notify 和 notifyAll 不需要捕获异常

(1) sleep 方法属于 Thread 类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了 sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在 sleep 的过程中过
程中有可能被其他对象调用它的 interrupt() ,产生InterruptedException 异常,如果你的程序不捕获这个异
常,线程就会异常终止,进入 TERMINATED 状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有 finally 语句块)以及以后的代码。

注意 sleep() 方法是一个静态方法,也就是说他只对当前对象有效,通过 t.sleep() 让t对象进入 sleep,这样的做法是错误的,它只会是使当前线程被 sleep 而不是 t 线程。

(2) wait 属于 Object 的成员方法,一旦一个对象调用了wait方法,必须要采用 notify() 和 notifyAll() 方法唤醒该进程; 如果线程拥有某个或某些对象的同步锁,那么在调用了 wait() 后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了 wait() 方法的对象。 wait() 方法也同样会在 wait 的过程中有可能被其他对象调用 interrupt() 方法而产生 。

数组在内存中如何分配?

对于 Java 数组的初始化,有以下两种方式:
静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度,如:

//只是指定初始值,并没有指定数组的长度,但是系统为自动决定该数组的长度为4
String[] computers = {"Dell", "Lenovo", "Apple", "Acer"}; //①
//只是指定初始值,并没有指定数组的长度,但是系统为自动决定该数组的长度为3String[] names = new String[]{"多啦A梦", "大雄", "静香"}; //②

动态初始化:初始化时由程序员显示的指定数组的长度,由系统为数据每个元素分配初始值,如:

//只是指定了数组的长度,并没有显示的为数组指定初始值,但是系统会默认给数组数组元素分配初始值为null
String[] cars = new String[4]; //③

因为 Java 数组变量是引用类型的变量,所以上述几行初始化语句执行后,三个数组在内存中的分配情况如下图所示:

由上图可知,静态初始化方式,程序员虽然没有指定数组长度,但是系统已经自动帮我们给分配了,而动态初始化方式,程序员虽然没有显示的指定初始化值,但是因为 Java 数组是引用类型的变量,所以系统也为每个元素分配了初始化值 null ,当然不同类型的初始化值也是不一样的,假设是基本类型int类型,那么为系统分配的初始化值也是对应的默认值0。

Java后端面试题总结一相关推荐

  1. 后端在插入数据发现重复如何正确的弹出警告_前百度面试官整理的——Java后端面试题(一)...

    List 和 Set 的区别 List , Set 都是继承自 Collection 接口 List 特点:元素有放入顺序,元素可重复 , Set 特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉 ...

  2. 为校招搜集整理的10万字java后端面试题ing...,基础不太好不知道从哪儿开头的冲它就完事了

    java后端面试题 Java基础 1.什么是Java 2.jdk,jre和jvm的区别 3.什么是跨平台性及原理 4.Java语言的特点 5.什么是字节码 6.采用字节码的好处 7.Java和C++的 ...

  3. Java后端面试题自我总结

    文章目录 前言 一.Java基础篇 ==final和static的区别== ==String a = "123"; String b = "123"; a=== ...

  4. java后端面试题总结(持续更新)

    (一) java基础 1.封装.继承.多态 封装:封装是指将对象的属性私有化,对外提供一些公共的方法来访问这些私有属性. 继承:如果一个类继承了另一个类,这个类就叫做子类,另一个类就叫父类,那么子类就 ...

  5. 最新阿里内推Java后端面试题

    阿里一面题目: osi七层网络模型,五层网络模型,每次层分别有哪些协议 死锁产生的条件, 以及如何避免死锁,银行家算法,产生死锁后如何解决 如何判断链表有环 虚拟机类加载机制,双亲委派模型,以及为什么 ...

  6. 2022 年,阿里内推 Java 后端面试题,文末附面试福利

    阿里一面题目: osi 七层网络模型,五层网络模型,每次层分别有哪些协议 死锁产生的条件, 以及如何避免死锁,银行家算法,产生死锁后如何解决 如何判断链表有环 虚拟机类加载机制,双亲委派模型,以及为什 ...

  7. 2022最新Java后端面试题(带答案),重点都给画出来了!你不看?

    一.Java基础 1.String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯... ...

  8. 明翰中高级Java后端面试题攻略v0.3(持续更新)

    文章目录 前言 Java基础 Java综合 请按顺序并按分类写出java的8种基本数据类型? Integer与int的区别? Object类中的方法的有什么,其作用? equals()与==的区别? ...

  9. 自己记录的一些Java后端面试题

    一.说明 记录了一些自己的面试问题....找工作真难啊 干这行 太卷了 算法得会把 基础还得非常扎实 源码也得看 目录 一.说明 二.Java基础部分 java基础 1.String s = &quo ...

  10. 2022最全Java后端面试题总结(京东、阿里、字节、美团、拼多多等)

    前言 金九银十即将到来,想必有的人为了金九银十跳槽早早做足了准备,有的人还在临阵磨刀,那么问题来了,怎么才能在众多面试者里中脱颖而出. 不妨先来跟我来看看之前认识的一位程序员(网友),他曾面过了京东. ...

最新文章

  1. 致被套基民:老基民的四点教训七点经验(ZT)
  2. SpringMvc 集成 shiro 实现权限角色管理-maven
  3. Java面试题—内部类和静态内部类的区别
  4. 强烈建议使用国外DNS解析域名,解决访问速度和某些访问故障!
  5. *【SGU - 114】Telecasting station (带权中位数 或 三分)
  6. python中bool函数的用法_python3实战python函数每日一讲 - bool([x])
  7. Spring整合Mybatis和JUnit
  8. 福布斯评选 8 位 AI 风云女性,李飞飞、Coursera 创始人在列
  9. 修手机时创意被剽窃,男子向苹果索赔7万亿!是认真的吗?
  10. cms文章 mysql存储,帝国CMS万能标签调用随机文章的方法
  11. typedef 的使用
  12. A.I. Wiki 人工智能
  13. selenium官网下载地址
  14. PySide从实战开始学习系列(一)认识PySide
  15. 网络信息化时代,3D产品建模宣传很到位
  16. C++面试题总结,一篇就够了
  17. 【JS】递归获取树的所有叶子节点
  18. Error:.系统错误,错误码:80058,desc of scope.userLocation is empty[20210513 20:05:21][wxd0659441b63ab707]
  19. 鱼眼图片转化android,iOS简单实现全景图小行星和鱼眼模式
  20. mysql二进制日志

热门文章

  1. 跃迁 成为高手的技术
  2. 如何提升沟通技能与提出解决方案
  3. rmd中无法打开链结r_小编详解 win7系统无法访问网络打印机的修复教程 -win7系统使用教程...
  4. 中文词语自动纠错_编辑距离
  5. 数据分析中会常犯哪些错误,如何解决? 二
  6. 语言模型总结(待完善)
  7. 2018_09_21_生活记录_参加人工智能大会
  8. android studio for android learning (二十六 )自定义控件理解与浅析(1)
  9. 如何使用 python 爬取全国小区名称
  10. 2020牛客多校训练2 I Interval(对偶图最短路求最小割)