JavaEE复习总结之常见问题

1、==与equal的区别是什么?

==的作用

  • 基本数据类型比较的是值
  • 引用类型比较的是地址

equal的作用

  • 引用类型:默认情况下,比较的是地址值;重写该方法后比较对象的成员变量值是否相同,如:String,Integer,Date等
2、final 在 Java 中有什么作用?
  • final 修饰的类叫最终类,该类不能被继承。
  • final 修饰的方法不能被重写。
  • final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
  • 使用 final 方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它;第二个原因是效率。在早期的 Java 实现版本中,会将 final 方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的 Java 版本已经不需要使用 final 方法进行 这些优化了)。类中所有的 private 方法都隐式地指定为 final。
3、&&和&的区别是什么?
  • 单&时,左边无论真假,右边都进行运算;
  • 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
4、String、StringBuilder 与 StringBuffer的区别是什么

(1)、这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。
(2)、运行速度由快到慢为:StringBuilder > StringBuffer > String

String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

(3)、在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的。

如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

(4)、使用环境:

  • String:适用于少量的字符串操作的情况
  • StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
  • StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
5、ArrayList和LinkedList区别是什么?
  • ArrayList 的实现基于数组,LinkedList 的实现基于双向链表
  • 对于随机访问,ArrayList 优于 LinkedList,ArrayList 可以根据下标对元素进行随机访问。而 LinkedList 的每一个元素都依靠地址指针和它后一个元素连接在一 起,在这种情况下,查找某个元素只能从链表头开始查询直到找到为止
  • 对于插入和删除操作,LinkedList 优于 ArrayList,因为当元素被添加到 LinkedList 任意位置的时候,不需要像 ArrayList 那样重新计算大小或者是更新索引。
  • LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还 存储了两个引用,一个指向前一个元素,一个指向后一个元素。
6、hashcode和equals区别是什么?
  • 概念
    equals()方法来检查两个对象是否真的相同如果两者相同。
    hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
  • hashCode() 和 equals() 的关系
    1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
    2、如果两个对象不equals,他们的hashcode有可能相等。
    3、如果两个对象hashcode相等,他们不一定equals。
    4、如果两个对象hashcode不相等,他们一定不equals。
7、HashMap和HashTable区别是什么?
  • 区别:

    • HashMap的方法没有synchronized修饰,线程非安全, HashTable线程安全;
    • HashMap允许key和value为null,而 HashTable不允许
  • 底层实现:数组+链表实现

    • jdk8开始链表高度到8、数组长度超过64,链表转变为红黑树,元素以内部类Node节点存在;
    • 计算key的hash值,二次hash然后对数组长度取模,对应到数组下标,
    • 如果没有产生hash冲突(下标位置没有元素),则直接创建ode存入数组,
    • 如果产生hash冲突,先进行 equalb比较,相同则取代该元素,不同,则判断链表高度插入链表,链表高度达到8,并且数组长度到64则转变为红黑树,长度低于6则将红黑树转回链表
    • key为null,存在下标0的位置
8、final、finally、finalize 的区别是什么?
  • final:修饰符(关键字)有三种用法:如果一个类被声明为 final,意味着它不能再派生出新的子类,即不能被继承,因此它和 abstract 是反义词。将变量声明为 final,可以保证它们在使用中不被改变,被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为 final 的方法也同样只能使用,不能在子类中被重写
  • finally:通常放在 try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要 JVM 不关闭都能执行,可以将释放外部资源的代码写在 finally 块中。
  • finalize:Object 类中定义的方法,Java 中允许使用 finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写 finalize()方法可以整理系统资源或者执行其他清理工作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值