面試就业题库-02

文章目录

  • 1. java基础(1)
    • 2.6 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?”
      • hashCode()介绍
      • 为什么要有 hashCode:
      • hashCode()与equals()的相关规定
    • 2.6 线程有哪些基本状态?这些状态是如何定义的?(掌握)
    • 2.7 Java序列话中如果有些字段不想进行序列化 怎么办(记住)
  • 2. javaweb(1)
  • 3. ssm+springboot+springCloud(1.5)
  • 4. 企业开发的项目: 技术说明(1.5)
  • 5. 面试总结(3,4)

1. java基础(1)

2.6 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?”

原因: equals方法是默认继承Object类的方法, 底层代码使用的== 号进行比较的,
为了让具有相同内容的对象再调用equals比较时,保证返回值是true,
所以我们要重写hashcode方法,保证地址值一样.

hashCode()介绍

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。

散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)

为什么要有 hashCode:

作用就是为了快速查找到堆里面对象

我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:

当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head fist java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

hashCode()与equals()的相关规定

  1. 如果两个对象相等,则hashcode一定也是相同的
  2. 两个对象相等,对两个对象分别调用equals方法都返回true
  3. 两个对象有相同的hashcode值,它们也不一定是相等的
  4. 因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
  5. hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

总结:

  1. hashcode()方法: 比较对象的引用, 判断地址值是否一样
  2. equals()方法: 比较的是对象实体 ,判断对象里面的数据是否一样

2.6 线程有哪些基本状态?这些状态是如何定义的?(掌握)

线程一共五种状态

  1. 新建线程 : new 状态

  2. 就绪状态: 可运行状态, 当前线程正在等待cpu的执行权

  3. 运行状态: 当前线程正在运行(start()方法和run()方法, 真正执行线程的是run()方法)

  4. 阻塞状态: 当前线程在执行时,cpu的执行权被强占.
    5.死亡状态: 调用死亡方法时(System.exit()方法,程序执行完毕,执行退出,线程会死亡)
    详解如下:

  5. 新建(new):新创建了一个线程对象。

  6. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取cpu的使用权。

    总结: 指的线程处于就绪状态, 还没有获取cpu的使用权

  7. 运行(running):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。

  8. 阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有 机会再次获得cpu timeslice转到运行(running)状态。阻塞的情况分三种:
    (一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放 入等待队列(waitting queue)中。
    (二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
    (三). 其他阻塞: 运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。

2.7 Java序列话中如果有些字段不想进行序列化 怎么办(记住)

开发场景: client<--------所需的字段数据信息,其它字段不要------------------server后端,
.在后端直接不序列化不需要的字段
常见的序列化方式: 将 对象(bean,list, map等等) 序列化为对应的json数据((后期玩微信支付,传输xml格式的数据))

  1. json序列化: {key: value}, [{key: value},{key: value},], {key:{key: value}},[{key:{key: value}},{key:{key: value}}]

  2. xml序列化: 比如: jackjack
    解决方式:

  3. json序列化时,某些字段不参与: @JsonIgnore // jackjson的注解, 如果其它json序列化组件,使用Transient

  4. 其它方式序列化, 某些字段不参与: Transient 修饰字段. 该字段不会被序列化

  5. 死亡(dead):线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

2. javaweb(1)

3. ssm+springboot+springCloud(1.5)

4. 企业开发的项目: 技术说明(1.5)

5. 面试总结(3,4)

你可能感兴趣的:(java,服务器,前端)