java 面试突击-(1-10)

Posted 栗子~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 面试突击-(1-10)相关的知识,希望对你有一定的参考价值。

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


java 面试突击-(1-10)

01 JDK、JRE、JVM什么区别

JDK是java给开发者提供的开发工具(包含于JRE)
JRE是运行的环境(包含于JVM)
JVM是虚拟机,用来编译解析class文件,目的是让操作系统运行


02 == 和 equals的区别

相同点:

  1. == 和 equals 在java中都是用来比较的方法
  2. Object的equals方法比较的也是栈中的值,因为Object默认的equals方法就是==,不过我们一般会重写该方法,比如String 的equals方法重写的结果就是比对字符串的内容。

不同点:

  1. 比对的是栈中的值,即基本数据类型的变量,但不能比对引用类型的变量,
    一般我们重写后的equals 除了基本数据类型的变量外也可以比对引用类型的变量(引用类型比对的是堆中对象的地址)。

03 hashcode()与equals()的作用、区别和联系

首先我们要知道hashcode()和equals()都是比较对象的方法。
区别:
hashcoe():获取哈希码,获取int整数,该值为哈希表里的索引位置,通过该索引位置可以快速在堆中找到该对象所在的位置,主要的作用就是快速检索所需的值。
equals():java提供的一个对比的方法,如果不重写,那么Object.equals()比较的逻辑就是==(比较的栈中的值)

问:既然有hashcode了,为什么还需要equals。
答:因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠

hashcode与equals联系:

  1. 如果两个对象相等,那么hashcode一定是相等的;
  2. 两个对象相等,对两个对象分别调用equals方法都返回true;
  3. 两个对象有相同的hashcode值,它们也不一定是相等的;
  4. equals 方法被覆盖过,则hashcode方法也必须被覆盖;
  5. hashcode的默认行为是对堆上的对象产生独特值,如果没有重写hashcode(),则两个class对象无论如何都不会相等(即使这两个对象指向相同的数据);

使用:
hashset利用hashcode检测重复
原理:

对象加入hashset时,hashset会先计算对象的hashcode值来判断对象加入的位置,看该位置是否有值,
如果没有值,hashSet会假设对象没有重复出现;
如果有值,调用equals()方法来检查两个对象是否真的相同,
若相同HashSet不会让其加入;
若不同,就会重新散列到其他位置;
这样就大大减少了equals的次数,相应的提高执行效率。


04 重载和重写的区别

区别:

  1. 重载是同一个类下的概念,重写是父子类下的概念。
  2. 重载:方法名相同,参数个数、参数顺序、参数类型不同,重写:发生在父子类中方法名和参数列表必须相同
  3. 重载当方法返回值和访问修饰符不同的时候,编译的时候就会报错,如下:

public int add(String a);
public String add(String a);
编译的时候就会报错

  重写:返回值范围小于等于父类,抛出的异常小于等于父类,访问修饰符权限大于等于父类。
  如果父类的访问修饰为private时,不可重写。


05 final的作用

概念:最终的

  1. 当final修饰在类上时,表示此类不可被继承;
  2. 当final修饰在方法上时,表示此方法不可以被覆盖,可以被重载;
  3. 当final修饰在基本数据类型变量上时,此变量的值不可被修改;
  4. 当final修饰在引用数据类型变量上时,此变量的地址不可以改变,值可以改变;
  5. 当final修饰在局部变量时,使用之前必须必须赋值;

06 为什么局部内部类和匿名内部类只能访问局部final变量?

原因:
因为内部类和外部类是同级的存在,内部类不会随着外部类的结束而结束,这个时候,JVM的解决办法就是通过复制一份变量给到内部类,同时保证该变量不可变,所以局部内部类和匿名内部类只能访问局部final变量。


07 String、StringBuffer,StringBuilder的区别?

区别:

  1. 操作上的区别,String为final类,有不可变的属性,即每次操作String类型的对象都会生成一个新的对象
    而StringBuffer和StringBuilder是在原来对象上操作,不会生成新的对象。
    注:所以当对一个字符串操作频繁的时候,使用StringBuffer和StringBuild
  2. 线程安全上的区别:
    String线程安全,因为字符串是不可变的,所以是线程安全的.
    StringBuffer线程安全,因为StringBuffer里的每个方法上都加上了synchronized
    StringBuilder线程不安全的

08 String为什么是final类型的

  1. 实现字符串常量池,只有当字符串是不可变时字符串池才有可能实现,字符串池的实现可以在运行时节约很多 heap 空间,因为不同的字符串变量都指向池中的同一个字符串,即可以实现多个变量引用 JVM 内存中的同一个字符串实例 ;
  2. 安全问题,因为很多地方都有用到字符串的形式,比如:数据库的用户名,Socket 的主机和端口…;
  3. 线程安全,因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步;
  4. 缓存提升性能,String 大量运用在哈希的处理中,由于 String 的不可变性,可以只计算一次哈希值,然后缓存在内部,后续直接取就好了,字符串的处理速度要快过其它的键对象,这就是 HashMap 中的键往往都使用字符串的原因;

09 什么情况下使用StringBuffer,什么情况下使用 StringBuilder?

在所有场景下优先使用StringBuilder,只有满足

  1. 操作共享对象时;
  2. 有多线程场景出现下;
    使用StingBuffer

10 list和set的区别

  1. list 有序,set无序
  2. list 可重复,set不可重复
  3. list 遍历除了迭代器还有其他方式,而set只有通过迭代器才能遍历出来。

以上是关于java 面试突击-(1-10)的主要内容,如果未能解决你的问题,请参考以下文章

java 面试突击-(31-40)

白嫖版-Java工程师面试突击视频2020

java 面试突击-(11-20)

java 面试突击-(21-30)

java 面试知识点突击-(41-50)

java 面试知识点突击-(61-70)