Java基础面试点总结

1. Comparable 和 Comparator的区别

前者是内部比较器,比较属性,静态绑定

后者是外部比较器,自定义比较内容,动态绑定、

一般来说,如果在创建一个类时,如果这个具有排序的属性,那么最好实现Comparable接口。

如果一个类已经无法修改,那么可以采用外部排序比较器Comparator

 

2. Java 中方法的参数传递机制

Java 中都是值传递

如果参数类型是基本数据类型,那么传来的就是这个参数的一个副本。

如果参数类型=是引用类型,那么传过来就是引用参数的副本。

如果在函数中没有给改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数,如果在函数中改变了副本的地址,那么传来的参数还是原来的地址。

 

3. Java的深拷贝和浅拷贝的区别

 

对引用数据类型只是进行了引用的传递,而没有真实的创建一个新的对象, 就是浅拷贝,clone 是浅拷贝

 

4.  Java中方法重载和重写的区别。

重载: 同一个类中同名的函数,具有不同参数个数或者类型(返回值不参与), 重载是一种静态多态。

重写:子类中含有与父类相同名字,返回类型和参数表,则重写,是在继承中多态性的体现,属于动态多态。

 

5.  Java中==和equals的区别

==:如果是基本数据类型,则直接对值进行比较,如果是引用数据类型,则是对他们的地址进行比较。

equals方法用于引用数据类型的比较,继承自Object类,在具体实现时可以覆盖父类中的实现。默认情况下也是对地址进行比较。

 

6. 如何判断两个对象相等

1. 重写equals方法

2.对于利用hash的集合,还要重写hashcode的值,比如set判断两个元素相等,会判断hashcode和equals都相等,则认为相等。

 

7.  Object类有哪些方法

1. clone方法

实现对象的浅拷贝,只有实现Cloneable接口才可以调用该方法

2.getClass方法

final方法,获得运行时类型

3.toString方法

将对象打印输出,一般都需要重写

4.finalize方法

该方法用于释放资源

5.equals方法

6.hashCode方法

7.wait方法,使当前线程等待该对象的锁,wait方法一直等待,直到获得锁或者被中断,wait可以设定一个超时时间,如果在规定时间内没有获得锁就返回

8.notify方法,唤醒在该线程等待的某个线程。

9.notifyAll,唤醒在该对象上等待的所有线程。

 

8.static关键字的作用是什么?

1. 修饰变量: 所有对象共享

2. 修饰方法: 属于类,工具类方法

3. 修饰静态代码块: 用于初始化

4. 静态内部类

 

9. 抽象类和接口的区别

抽象类不能创建对象,其方法必须是public和protected,一个类继承抽象类,必须实现父类的抽象方法。抽象类只能被单继承。

接口:可以被多个类实现

变量只能定义为public static final

方法只能是抽象方法

区别:

最重要的区别是一个类只能继承一个抽象类,而一个类却可以实现多个接口。

类是”是不是关系“,接口是”有没有“关系。

接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法。

 

10. hashmap的底层实现

HashMap的底层实现就是数组加链表的组合,当实例化一个HashMap时,系统会创建一个长度为Capacity的Entry数组,元素存放的位置由特定的规则计算出来,当两个元素放在数组中同一个位置时,用链表连接。在JDK1.8中,当链表的长度超过8时,链表转为红黑树。

讲一下HashMap的原理,内部数据结构

对key求Hash值,然后计算下标,如果没有发送哈希碰撞直接放入槽中,如果碰撞了以后用链表挂在后面,如果链表满了,就把链表转成红黑树。如果容量超过一定值,就要扩容。

为什么HashMap中&位必须是奇数(length-1)

因为数组的长度是2的幂次,所以length-1除了最高位外,其他位都是1,这样的结果等同于%length

为什么HashMap线程不安全

存在多个线程同时操作共享变量的情况。

红黑树的五大特性

1.节点要么为红色,要么为黑色

2.根节点为黑色

3.叶子节点为黑色

4.每个红色节点的左右孩子都是黑色

5.从任意节点到其每个叶子节点的所有路径,都包含相同数目的黑色节点。

 

HashMap,LinkedHashMap,TreeMap的底层区别

LinkedHashMap在HashMap的基础上,维护了一个双向链表,记录插入顺序。

TreeMap底层是红黑树,需要有序map时使用。

 

12.String,StringBuild和StringBuffer的区别

String不可变字符串对象,StringBuilder和StringBuffer是可变数组对象,后者线程安全。

为什么String类为什么是final修饰的

1. 为了实现字符串常量池

2. 为了线程安全,String线程安全。

3. 为了实现String可以创建HashCode不可变性,因为String不可变,所以它在创建的时候HashCode就被缓存了,不需要重新计算。

 

15. final关键字

1.用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次,且无法修改,对于成员变量,必须在声明或者构造函数中初始化

2.用来修饰方法参数:表示该变量在声明周期不能改变

3.修饰方法:表示该方法不能被重写

4.修饰类:表示该类无法被继承。

 

16.ArrayList和LinkedList的区别

前者是数组,后者是链表

前者随机访问,后者插入删除更快/

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值