Java基础的异同区别面试题

1. == 和 equals方法的异同 ???

相同点:==和equals都是对数据进行比较的一种方式

不同点:

(1)比较内容的不同:

       ① ==可以比较基本数据类型和引用数据类型

       ② equals只能比较引用数据类型

(2)比较规则的不同:

       ① ==在比较基本数据类型时,比较的是内容,在比较引用数据类型时,比较的是地址值

       ②equals在重写之前比较的是引用数据类型的地址值,在重写之后比较的是内容

 

2.String,StringBuffer,StringBuilder三者的异同 ???

  String:不可变的字符序列,效率最低,底层使用char[]数组存储。

  StringBuffer:可变的字符序列,效率较低,底层使用char[]数组存储。

  StringBuilder:可变的字符序列,效率高,线程不安全,底层使用char[]数组存储。(JDK5.0新增)

 

3.HashMap和Hashtable的异同 ???

   HashMap作为Map的主要实现类,存储数据无序,效率高,线程不安全。能存储null的Key值和Value值。

   Hashtable作为Map的古老实现类,存储数据无序,效率低,线程安全,不能存储null的Key值和Value值。

 

   HashMap的底层:

             数组+链表(JDK7.0及以前)

             数组+链表+红黑树(JDK8.0)

          Map中的Key:无序的,不可重复的,使用Set存储所有Key值。

          Map中的Value:无序的,可重复的,使用Collection存储所有Value值。->(value所在的类需要重写equals())

 

   List接口:存储有序的,可重复的数据。 -> “动态”数组替换原有的数组。

          ArrayList:作为List接口的主要实现类,线程不安全的,查询效率高,底层使用Object[]数组存储。

          LinkedList:对于频繁的插入和删除的操作,效率要比ArrayList高,底层使用双向链表存储。

 

   Set接口:存储无序的,不可重复的数据 -> 高中讲的“集合”

          HashSet:   作为Set接口的主要实现类,线程不安全,可以存储null值。

          LinkedHashSet:作为HashSet的子类,仍然是无序的,但在遍历其内部数据时,可以按照添加的顺序遍历。

              对于比较频繁的遍历操作,LinkedHashSet要高于HashSet

          TreeSet:可以按照对象添加的指定属性,进行排序。

 

4.并发和并行的区别???

     并发:一个处理器可以同时处理多个任务,这是逻辑上的同时发生。

     并行:多个处理器可以处理多个任务,这是物理上的同时发生。

     比如:一个人吃三个苹果和三个人吃三个苹果。

 

5.进程和线程的区别???

   进程:是执行中一段程序,即一旦进入程序,就被载入到内存中准备执行,它就是一个进程。

   线程:单个进程中执行每个任务就是一个线程,线程是进程中执行运算的最小单位。

 

6.说一下Runnable和Callable的区别???

  Callable规定的方法是call(),Runnable规定的方法是run()。

  Callable任务执行后可返回值,而Runnable任务不能有返回值。

  call方法可以抛出异常,而run方法不行。

 

7.说一下线程的生命周期

  新建状态 -> 就绪状态 -> 运行状态 -> 可以在运行时提供方法来阻塞线程的运行 -> 死亡状态

 

8.sleep方法和wait方法的异同???

   相同点:一旦执行方法,都可以使得当前线程进入阻塞状态。

   不同点:

                1)两个方法声明的位置不同:

                        Thread类中声明sleep(),Object类中声明wait()。

                2)两个方法的调用范围不一样:

                        sleep可以在任何场景下使用,而wait只能在同步代码块或同步方法中使用。

                3)关于是否会释放同步监视器的问题:如果两个方法都在同步代码块或同步方法中:

                           sleep方法不会释放同步监视器,而wait方法会释放同步监视器。

 

9.什么是Java序列化?什么情况下需要序列化???

      ①Java对象转换成字节流对象的过程叫序列化。

      ②当 Java 对象需要在网络上传输 或者 持久化存储到文件中时,就需要对 Java 对象进行序列化处理。

  序列化的实现:

        1.需要实现Serializable接口

        2.需要实现当前类提供的常量:serialVersionUID

        3.除了当前的Person类需要实现Serializable接口之外,还必须保证其内部所有的属性也必须是可实例化的。(默认情况下,基本数据类型可序列化)

        4.ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量。

 

10.什么是反射???

       在Java中,反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。

 

11.synchronized和Lock的异同???

       相同点:二者都可以解决线程的安全问题

       不同点:synchronized在执行完同步代码后,会自动释放同步监视器。

                     Lock需要手动的启动同步(lock()),同时结束也要手动12结束同步(unlock())。

 

12.try-catch-finally中,如果在catch中return了,finally中的代码还会执行么???

      会执行,在return前执行。

 

13.throw和throws的区别???

      throw:表示方法内抛出某种异常对象

               如果异常对象是非 RuntimeException 则需要在方法申明时加上该异常的抛出 即需要加上 throws 语句 或者 在方法体内 try catch 处理该异常,否则编译                     错误执行到 throw 语句则后面的语句块不再执行。

      throws:方法的定义上使用 throws 表示这个方法可能抛出某种异常需要由方法的调用者进行异常处理(异常的声明)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值