快来看看啊,可靠的Java面经(二)

26 篇文章 1 订阅
7 篇文章 0 订阅

感谢光临此博客,希望小编的博客能帮到您,如果对您有帮助,不要忘了👍,收藏,找不到了哦!

目录

一,hashcode与equals是什么,有什么联系

hashcode :

equals :

联系:

二,接口与抽象类的区别

(中高级程序员的回答)

三,重载与重写的区别

重载:

重写:

四,Hashmap与HashTable的区别,底层实现

区别

底层实现

HashMap添加元素过程

五,ConcurrentHashMap的原理,jdk7.0与jdk8.0的区别

六,如何实现一个Spring的IOC容器

七,Java中的类加载器有哪些

八,什么是字节码,有什么作用

作用:


一,hashcode与equals是什么,有什么联系

hashcode :

hashcode方法是用来获取哈希码,也称为散列码,返回是一个int值,作用是确定该对象在哈希表的位置。定义在object.Java中,Java中任何类都存在hashcode方法

equals :

Java提供程序员定义对比二个对象是不是相等的方法,(一般情况下都需要程序员自己重写equals方法,设置比较规则,如果不重写,默认就是Object中的比较方法”就是 == 判断“,String的equals方法是重写过的)

联系:

哈希表来更加详细理解二者关系https://blog.csdn.net/weixin_47514459/article/details/121214140

当我们需要在hsahSet中添加数据时,hashcode方法是用来计算值,equals方法来判断该数据是否重复,重复则不添加。也出现了如下一些联系。

1,二个对象相等,则二个对象的hashcode一定相等。(二个hashcode相等,二个对象不一定相等,因为hashcode是通过规则计算出来的值,通过规则计算下值可能重复

2,二个对象相等,则二个对象分别调用equals方法返回的是true. 

3,因此equals方法被重写,则hashcode方法也必须重写。

4,hashcode方法默认是对堆中的对象产生索引值,如果没有重写hashcode方法,则这二个对象无论如何都不会相等(即使二个对象的指向相同的数据)

二,接口与抽象类的区别

1,抽象类存在普通的成员函数(有抽象方法,有实现方法),而接口则只能存在public abstract方法(只能有抽象方法)

2,抽象类的成员变量可以是各种类型的,而接口成员变量只能是public statis final 类型的 (静态常量)

2,抽象类只能继承一个接口可以继承多个(很重要!!!)

(中高级程序员的回答)

接口的设计目的是对类进行约束,也就是提供一种机制,强制不同的类有这相同的行为只对行为的有无进行约束,对行为的实现不关心。

接口是对行为的抽象接口的核心是定义行为,也就是类可以做什么。至于类怎么做,接口不关心

抽象类的设计目的是代码的复用当不同的类具有相同的行为时,并且一部分行为的实现一致时,可以把这些类都派生为一个类(这个类也被称为派生类),派生类来实现来一致行为的类,避免了其子类的实现,提高了代码的复用性(抽象类含有抽象方法,所以抽象类是不允许实例化)。

抽象类是对类本质的抽象抽象类包含并实现子类的通用特性,将子类存在的差异特性,交给子类自己实现

三,重载与重写的区别

重载:

发生在同一个类中,方法名必须相同,参数不同,参数个数不同,顺序不同,方法返回值没有关系,访问修饰符可以不同,发生在编译时

public int add(int n){

}
public String add(int n){
    //不是重载,编译时报错
}

重写:

发生在继承的子类当中父类与子类的方法名,参数列表必须相同,当访问父类访问修饰符为private时,子类不能重写。返回值小于等于父类,抛出异常小于等于父类,访问修饰符范围大于等于父类

四,Hashmap与HashTable的区别,底层实现

区别

HashTable中每一个方法都加了central nice ,所以HashTable是线程安全的,Hashmap是线程不安全的。

Hashmap允许key与value为null,HashTable是不允许的

底层实现

HashMap: 数组+链表

jdk8.0后当链表达到8时,数组长度达到64时,链表会转换为红黑数。元素以内部类Node节点存在。

HashMap添加元素过程

1,计算key的hash值,二次计算hash值(hash值进行hash计算)对数组长度取模,对应数组的下标

2,如果没有产生hash冲突,直接常见node节点存入数组中

3,如果产生冲突,equals方法进行比较,相同则取代该元素,不同,则判断链表高度,当链表高度超过8,并且数组的长度到64,则转变为红黑树,长度低于6,红黑树转化回链表。

4,key值为null,储存在下标0位置。

五,ConcurrentHashMap的原理,jdk7.0与jdk8.0的区别

六,如何实现一个Spring的IOC容器

1,配置文件,配置包的扫描路径

2,递归包扫描获取.class文件

3,反射,确定需要交给IOC管理的类

4,对需要注入的类进行依赖注入

七,Java中的类加载器有哪些

JDK自带有三个类加载器: bootstrap ClassLoader、ExtClassLoader、AppClassLoader。

BootStrapClassLoader是ExtClassLoader的父类加载器,默认负责加载%JAVA_HOME%6lib下的jar包和class文件。(父类并不是继承关系,而是维护关系)

ExtClassLoader是AppClassLoader的父类加载器,负责加载%JAVA_HOME%/ib/ext文件夹下的jar包和class类。

AppClassLoader是自定义类加载器的父类,负责加载classpath下的类文件。(默认的系统类加载器,还是一个线程上下文加载器)
继承ClassLoader实现自定义类加载器
 

八,什么是字节码,有什么作用

在Java中,Java虚拟机(JVM)能够理解认识的代码就叫做字节码。不面向如何特定的处理器,只面向虚拟机。

作用:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韶光不负

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值