使用final 关键字修饰-一个变量时,是引用不能变,还是引用的对
象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以
改变的。
Java中equals与“==”的区别
== :比较的是值是否相等 在基本数据类型:值内容, 引用类型时:地址
equals:比较的是是否是同一个对象 重写:值内容 , equals不重写:地址
Java接口的修饰符可以为()
接口的方法默认是public abstract;
接口中不可以定义变量即只能定义常量(加上final修饰就会变成常量)。所以接口的属性默认是public static final 常量,且必须赋初值。接口中方法的修饰符:public abstract(默认不写)
谈谈你对多态的理解
Java实现多态有三个必要条件:继承、重写、向上转型
- 可替换性:多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
- 可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
- 接口性:多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
- 灵活性:它在应用中体现了灵活多样的操作,提高了使用效率。
- 简化性:多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
equals()和hashcode() 方法的区别
1.如果两个对象相同,那么它们的hashCode值一定要相同
2.如果两个对象的hashCode相同,它们并不一定相同(这里说的对象相同指的是用eqauls方法比较)。
如不按要求去做了,会发现相同的对象可以出现在Set集合中,同时,增加新元素的效率会大大下降。
3.equals()相等的两个对象,hashcode()一定相等;equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。
换句话说,equals()方法不相等的两个对象,hashcode()有可能相等(我的理解是由于哈希码在生成的时候产生冲突造成的)。反过来,hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。
在object类中,hashcode()方法是本地方法,返回的是对象的地址值,而object类中的equals()方法比较的也是两个对象的地址值,如果equals()相等,说明两个对象地址值也相等,当然hashcode()也就相等了;在String类中,equals()返回的是两个对象内容的比较,当两个对象内容相等时,Hashcode()方法根据String类的重写代码的分析,也可知道hashcode()返回结果也会相等。以此类推,可以知道Integer、Double等封装类中经过重写的equals()和hashcode()方法也同样适合于这个原则。当然没有经过重写的类,在继承了object类的equals()和hashcode()方法后,也会遵守这个原则。
String 、StringBuilder、 StringBuffer区别
- String是不可变字符串对象,每次修改字符串都会创建新对象;线程安全;使用于少量字符串操作的场景;
- StringBuilder、StringBuffer是可变字符串序列(对象),StringBuilder 和 StringBuffer在修改字符串时不会创建新对象;当需要对字符串频繁的修改时,推荐使用StringBuilder或 StringBuffer。
- 二者的常用方法名和实现原理是一样的。区别在于StringBuffer是线程安全的,StringBuilder是线程不安全的。
- StringBuffer使用于多线程环境下的大量操作的场景,StringBuilder使用于单线程环境下的大量操作的场景;如果不涉及线程安全问题,推荐使用StringBuilder,因为它的效率会更高一些,执行效率上:StringBuilder快于StringBuffer快于String