Java面试知识点

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

工作也有好些年了从刚毕业到前几年看过无数的面试题总想着自己写一个面试总结随着自我认识的变化一些知识点的理解也越来越不一样了。写下来温故而知新。很多问题可能别人也总结过但是答案不尽相同如有问题欢迎指正以备完善。
现在的问题还不是很全面会持续更新大家有遇到一些面试题的话也可以评论出来一起完善。

1. JDK与JRE的区别

  • JDKJava development kitJava开发工具包JREJava runtime environmentJava运行环境。JDK中包含JREJDK中有一个名为jre的目录里面包含两个文件夹bin和libbin就是JVMlib就是JVM工作所需要的类库。
  • JRE包含了java虚拟机、java基础类库。是使用java语言编写的程序运行所需要的软件环境是提供给想运行java程序的用户使用的。JDK是程序员使用java语言编写java程序所需的开发工具包是提供给程序员使用的。运行java程序只需安装JRE。如果需要编写java程序需要安装JDK。

2. final修饰符的作用


1修饰一个引用
如果引用为基本数据类型则该引用为常量该值无法修改
如果引用为引用数据类型比如对象、数组则该对象、数组本身可以修改但指向该对象或数组的地址的引用不能修改。
如果引用是类的成员变量则必须当场赋值否则编译会报错。
2用来修饰一个方法
当使用final修饰方法时这个方法将成为最终方法无法被子类重写。但是该方法仍然可以被继承。
3用来修饰类
当用final修改类时该类成为最终类无法被继承。比如常用的String类就是最终类。

3. Math相关方法


Math.ceil向上取整Math.floor向上取整Math.round数值加0.5后向下取整。
Math.ceil(11.3) = 12;
Math.ceil(-11.3) = 11;
Math.floor(11.3) = 11;
Math.floor(-11.3) = -12;
Math.round(11.3) = 11;
Math.round(11.8) = 12;
Math.round(-11.3) = -11;
Math.round(-11.8) = -12;

4. String str="i"与 String str=new String(“i”


不一样String str="i"会将其分配到常量池中常量池中没有重复的元素如果常量池中有i就将i的地址赋给变量如果没有就创建一个再赋给变量。String str=new String(“i”)会将对象分配到堆中即使内存一样还是会重新创建一个新的对象。

5. 如何将字符串翻转


这儿提供两种方式stringbuilder.reverse及char[]。

public static void main(String[] args) {
    String abc = "hello world";
    StringBuilder stringBuilder = new StringBuilder(abc);
    String reverse = stringBuilder.reverse().toString();
    System.out.println(reverse);
}
public static void main(String[] args) {
    String abc = "hello world";
    char[] chars = abc.toCharArray();
    char[] newd = new char[abc.length()];
    for (int i = 0; i < chars.length; i++) {
        char aChar = chars[chars.length - i - 1];
        newd[i]=aChar;
    }
    String s = String.valueOf(newd);
    System.out.println(s);
}

6. 普通类和抽象类的区别

7. 接口与抽象类的区别

8. JAVA中IO流分类及区别

按照数据的流向输入流读数据。输出流写数据
在这里插入图片描述

按照数据类型来分
字节流字节输入流Inputstream字节输出流Outputstream
字符流字符输入流Reader字符输出流Writer

9. 什么是反射


JAVA反射机制是在运行状态中对于任意一个类都能够知道这个类的所有属性和方法对于任意一个对象都能够调用它的任意一个方法和属性这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法所以先要获取到每一个字节码文件对应的Class类型的对象。
反射就是把java类中的各种成分映射成一个个的Java对象。
反射这儿比较重要再次不详细展开可查看相关链接
Java基础-反射

10. 什么是为什么要怎么实现序列化


如果我们需要持久化Java对象比如将Java对象保存在文件中或者在网络传输Java对象这些场景都需要用到序列化。简单来说
序列化 将数据结构或对象转换成二进制字节流的过程。
反序列化将在序列化过程中所生成的二进制字节流的过程转换成数据结构或者对象的过程。
常见的序列化实现方式为JDK 自带的序列化只需实现 java.io.Serializable接口即可。
在这里插入图片描述序列化号 serialVersionUID 属于版本控制的作用。序列化的时候serialVersionUID也会被写入二级制序列当反序列化时会检查serialVersionUID是否和当前类的serialVersionUID一致。如果serialVersionUID不一致则会抛出 InvalidClassException 异常。强烈推荐每个序列化类都手动指定其 serialVersionUID如果不手动指定那么编译器会动态生成默认的序列化号。日常使用指定为1L即可。

11. throw与throws的异同


较为基础的问题日常开发过程中会较多用到的异常处理方式。

12. try-catch-finally-return的执行顺序

public static void main(String[] args) {
  System.out.println(test());
}

public static int test() {
    try {
        int abc = 1/0;
        System.out.println("try");
        return 0;
    } catch (Exception e) {
        System.out.println(e.getMessage());
        return 1;
    } finally {
        System.out.println("finally");
    }
}
/ by zero
finally
1

13. 什么是为什么要有hashcodehashcode与equals关系

14. 在 Java 中为什么不允许从静态方法中访问非静态变量

15. 实例化对象的方式

	Class<?> cls = Class.forName("com.dao.User");
	User u = (User)cls.newInstance();
	ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream("D:/data.txt"));
	//序列化对象
	out.writeObject(user1); 
	out.close();
	//反序列化对象
	ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:/data.txt"));
	User user2 = (User) in.readObject();
	System.out.println("反序列化user" + user2);
	in.close();

16. Bean的生命周期


在这里插入图片描述

17. bean初始化执行是顺序


可以参考我之前写的文章 初始化执行顺序

18. HashMap与HashTable的区别


这个知识点比较老旧HashTable在工作中基本没用到过。但是还是写出来了仅限于了解知道这个事儿即可现在面试基本不会问。

19. HashMap put及get的实现原理

20. HashMap相关面试题

21. HashSet实现原理


HashSet是Set的实现HashSet底层其实是一个HashMap实例都是一个存放链表的数组。
在这里插入图片描述
HashSet是基于HashMap实现的HashSet中所有的元素都存放在HashMap的key上而value中的值都是统一的一个固定的对象private static final Object PRESENT = new Object(); HashSet的add方法
在这里插入图片描述
HashSet中add方法调用的是底层HashMap的put方法。如果是在HashMap中调用put方法首先会去判断key是否已经存在如果存在则修改value的值如果不存在则插入这个k-v对。而在Set中value是没有用的所以也就不存在修改value的情况故而向HashSet中添加新的元素首先判断元素是否存在不存在则插入存在则pass这样HashSet中就不存在重复值了。
所以判断key是否存在就需要去重写元素类的equals()和hashCode()方法。当向Set中添加元素的时候先调用元素所在类的hashCode()方法计算元素对象的哈希值这个哈希值决定了这个元素在Set中存放的位置如果这个位置是空的没有存放其他元素那么就直接把这个元素存放在这里如果这个位置已经被别人占了那么就调用元素所在类的equals()方法比较两个对象是否相同相同就直接pass掉保证了元素的不可重复性。
所以在使用HashMap和HashSet的时候如果Map的key或者Set中要存入自定义类的对象必须重写hashCode和equals方法。

22. Java中如何确保一个集合不会被修改


我们很容易想到用final关键字进行修饰我们都知道
final关键字可以修饰类方法成员变量final修饰的类不能被继承final修饰的方法不能被重写final修饰的成员变量必须初始化值如果这个成员变量是基本数据类型表示这个变量的值是不可改变的如果说这个成员变量是引用类型则表示这个引用的地址值是不能改变的但是这个引用所指向的对象里面的内容还是可以改变的。
那么我们怎么确保一个集合不能被修改首先我们要清楚集合map,set,list…都是引用类型所以我们如果用final修饰的话集合里面的内容还是可以修改的。

那我们应该怎么做才能确保集合不被修改呢
我们可以采用Collections包下的unmodifiableMap方法通过这个方法返回的map,是不可以修改的。他会报 java.lang.UnsupportedOperationException错。
同理Collections包也提供了对list和set集合的方法。Collections.unmodifiableList(List) Collections.unmodifiableSet(Set)

23. HashMap 在 JDK7 和 JDK8 有哪些区别?

24. HashMap的线程不安全体现在哪儿如何变成线程安全


无论在JDK7还是JDK8的版本中HashMap 都是线程不安全的主要体现在以下两个方面

如果想使用线程安全的 Map 容器可以使用以下几种方式

25. ConcurrentHashMap 在 JDK7 和 JDK8的区别

26. concurrentHashMap和HashTable有什么区别


concurrentHashMap融合了hashmap和hashtable的优势hashmap是不同步的但是单线程情况下效率高hashtable是同步的同步情况下保证程序执行的正确性。
但hashtable每次同步执行的时候都要锁住整个结构如下图
在这里插入图片描述

concurrentHashMap锁的方式是细粒度的。concurrentHashMap将hash分为16个桶默认值诸如get、put、remove等常用操作只锁住当前需要用到的桶。
concurrentHashMap的读取并发因为读取的大多数时候都没有锁定所以读取操作几乎是完全的并发操作只是在求size时才需要锁定整个hash。
而且在迭代时concurrentHashMap使用了不同于传统集合的快速失败迭代器的另一种迭代方式弱一致迭代器。在这种方式中当iterator被创建后集合再发生改变就不会抛出ConcurrentModificationException取而代之的是在改变时new新的数据而不是影响原来的数据iterator完成后再讲头指针替代为新的数据这样iterator时使用的是原来的数据。

27. ArrayList与LinkedList的区别

个人看法如果不知道该用 ArrayList 还是 LinkedList就选择 ArrayList 。

28. HashMap与HashSet的区别


先贴一个众所周知的区别
在这里插入图片描述
但其实从根本上来说它俩本来就是同一个东西。再说的清楚明白一点 HashSet 就是个套了壳儿的 HashMap。虽然hashset是调用add()方法添加元素但是其实HashSet的 add方法其实就是调用了HashMap的put方法

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java
返回列表

上一篇:Oracle常用函数集锦

下一篇:buu [AFCTF2018]Vigenère 1

“Java面试知识点” 的相关文章

Java之反射爆破操作1年前 (2023-02-02)
Java 基础之文件处理1年前 (2023-02-02)
【JavaSE】反射1年前 (2023-02-02)
Java集合1年前 (2023-02-02)