当前位置:   article > 正文

常见JAVA面试题总结<2020 java面试必备>(一)_integer sum= new

integer sum= new

常见JAVA面试题总结<2020 java面试必备>(一)

Java 基础类

== 和 equals的区别

==

基本类型:比较的是值是否相同
  引用类型:比较的是地址是否相同,也就是说 new 出来的对象进行 == 比较,始终返回false

equals:

默认情况下,如果我们没有对对象的 equals 方法进行重写,那 equals 比较的就是地址
而我们使用的 String 是对 equals 进行了重写,把它变成了值比较

注意:重写时 equals 和 hashCode 必须同时重写
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗
不对,两个对象的 hashCode()相同,equals()不一定 true
因为在散列表中,hashCode()相等即两个键值对的哈希值相等
​然而哈希值相等,并不一定能得出键值对相等
代码示例

String str1 = "通话";
​String str2 = "重地";
​System.out.println(String.format("str1:%d | str2:%d",  str1.hashCode(),  str2.hashCode()));
​System.out.println(str1.equals(str2));
  • 1
  • 2
  • 3
  • 4

执行的结果
str1:1179395 | str2:1179395 哈希值相等
false equals结果为false

final 在 java 中有什么作用?

final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改

String StringBuffer StringBuilder

String 字符串常量、StringBuffer 字符串变量(线程安全)、StringBuilder 字符串变量(非线程安全)

      String 底层是final修饰的不可变对象,因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象
      所以经常改变内容的字符串最好不要用String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM 的 GC 就会开始工作,那速度是一定会相当慢的

      StringBuilder类则结果就不一样了,每次改变都会对 StringBuilder对象本身进行操作,而不是生成新的对象,再改变对象引用,所以在一般情况下我们推荐使用 StringBuilder,特别是字符串对象经常改变的情况下
      
      而StringBuffer与StringBuilder不同就在于StringBuffer是线程安全的,底层的append方法使用了synchronized关键字进行修饰​
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

String str = “i” 与 String str = new String(“i”)一样吗

不一样,因为内存的分配方式不一样。
​String str = "i" 的方式,java 虚拟机会将其分配到常量池中;
​而 String str = new String("i") 则会被分到堆内存中

重载与重写的区别

重载
参数类型、个数、顺序至少有一个不相同
不能重载只有返回值不同的方法名
存在于父类和子类、同类中

重写
方法名、参数、返回值相同。
子类方法不能缩小父类方法的访问权限。
子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
存在于父类和子类之间。
方法被定义为final不能被重写。

int 与 Integer 区别

1**.int**是基本数据类型,Integer是包装类,是一个类
2.int类型的变量初始值为0,而Integer包装类初始值为null
3.Integer类的作用
一是在类中拥有很多方法,方便Int和其他数据类型进行转换,比如parseInt()toString()方法等等
二是向ArrayList或HashMap存数据时不能用基本类型,只能用包装类

抽象类接口区别

(1)抽象类可以有默认的方法实现。接口根本不存在方法的实现
​(2)子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现,子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
​(3)抽象类可以有构造器 接口不能有构造器
(4)抽象方法可以有public、protected和default这些修饰符 ,接口方法默认修饰符是public 你不可以使用其它修饰符
​(5)抽象类在java语言中所表示的是一种继承关系,一个子类只能继承一个父类,但是可以实现多个接口
(6)如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。
如果你往接口中添加方法,那么你必须改变实现该接口的类

传值和传引用的区别?

传值
实际是将一个值的拷贝传递至方法内部,这个值的原始数据是不会改变的
无论你内部进行的是何种操作,都不会改变这个源数据的值;

​传引用
传递进去的则是指向一个对象的地址,那么在方法内部进行实际操作的时候
就很可能会改变该对象的属性值(当然具体是否改变,还需要结合具体的业务)

说说深拷贝和浅拷贝

       深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的,最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用
      浅拷贝仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么拷贝出来的对象也会相应改变。
      深拷贝是开辟了一块新的内存地址用于存放复制的对象。
      通俗一点理解就是浅拷贝出来的数据并不独立,如果被复制的对象改变了,那么浅拷贝的对象也会改变,深拷贝之后就会完全独立,与浅拷贝断绝关系。
  • 1
  • 2
  • 3
  • 4

说说Java中的自动拆箱和装箱

装箱就是自动将基本数据类型转换为包装类型;
​拆箱就是自动将包装类型转换为基本数据类型

自动拆装箱是怎么实现的

是编译器帮我们自动调用了拆装箱的方法,以 Integer/int 为例子
自动装箱就是编译器自动调用了 valueOf(int i) 方法
自动拆箱就是调用了 intValue() 方法,其他基本类型类推

以Integer为例

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/810346
推荐阅读
相关标签
  

闽ICP备14008679号