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的区别
前者是数组,后者是链表
前者随机访问,后者插入删除更快/