前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《面试季》经典面试题(七)

《面试季》经典面试题(七)

作者头像
IT学习日记
发布2022-09-13 14:36:27
2390
发布2022-09-13 14:36:27
举报
文章被收录于专栏:IT知识进阶学习

前言

  • 大家好,这里是IT学习日记,相信大家对今年IT的行情应该也有所了解了,从大厂到小厂,各种裁员消息。公司裁员我们无法决定,我们能做的就是不断提升自己,提前准备。
  • 本系列文章主要分享了之前博主真实面试中遇到的一些问题,希望能够帮助准备就业或者跳槽的朋友。

类基础信息

一: 类加载后会存在在哪里

回答: 存放在方法区中。

详情如下:

  静态成员变量(类变量) 存放于 方法区的静态部分

  静态方法 存放于 方法区的静态部分

  非静态方法(包括构造函数) 存放于 方法区的非静态部分

  静态代码块 存放于 方法区的静态部分

  构造代码块 存放于 方法区的静态部分

加载细节:

  类文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象,对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。

二: Hotspot和JRockit的关系

  1、两者都是JVM规范的实现,JRockit最初由Appeal和BEA Systems开发,然后被Oracle收购以运行服务器软件。 它旨在针对需要长时间运行任务,大量内存和大量内存的大型应用程序进行优化一个可扩展的环境。

  2、自Oracle收购Sun Microsystems以来,Oracle已经在使JRockit和HotSpot JVM融合的具体计划和路线图是"两全其美"的实现,主要建立在HotSpot上但是集成了JRockit最受欢迎的功能。

  3、永久代只存在Hotspot虚拟机中,其他实现了JVM的虚拟器并没有这个说法

三: JDK8为什么要使用元空间取代永久代

  1、JDK7及之前字符串存在永久代中,容易出现性能问题和内存溢出

  2、类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出

  3、永久代会为 GC 带来不必要的复杂度,并且回收效率偏低(永久代的垃圾收集是和老年代捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。

  4、将 HotSpot 与 JRockit 合二为一,永久代只是在Hotspot中有,JRickit并没有永久代的概念

四: 类加载的最终产物是什么

  类加载(Loading)的最终产物是一个 java.lang.Class 对象,它是我们访问方法区中的类型数据的外部接口,我们需要通过这个对象来访问类的字段、方法、运行时常量池等。

五: 字符串常量、静态变量存放在哪里

一: 字符串常量

    1.7以前是放在永久代,1.7以后是放在堆中

二: 静态变量

    1、1.7前字符串常量池和静态变量存储在永久代

    2、JDK7以上,静态变量存储在其对应的Class对象中。而Class对象作为对象,和其他普通对象一样,都是存在java堆中的。

六: String为什么定义成final

主要是考虑到安全性和效率的两方面。

  1、String类中有需要关于底层的引用,因为final修饰的类是不可以被继承的,所以不会对String类进行修改,避免了因继承而引起的安全隐患。

  2、String类是不可变的,所以在多线程下是线程安全的,无需进行线程同步。

  3、因为String类是不可变的,所以在创建的时候就将对应的Hashcode缓存起来,使用的时候不需要重新计算,这就使得字符串很适合用于Map集合中的key,字符串的处理速度快过其他的键对象。

七: String、StringBuffer、StringBuilder的区别

  1、String对象是不可变的,但是StringBuffer和StringBuilder是可变的

  2、String和StringBuffer(方法使用了synchronize加锁)是线程安全的,StringBuilder是线程不安全的

  3、执行效率: StringBuilder > StringBuffer > String

八: s1 = new String(“hello”)和s1 = “hello”有什么区别

  1、new String(“hello”)是先在堆中创建一个对象,并返回给s1,”hello”是一个常量,会先到字符串常量池中查询是否存在这个字符串,没有则分配一个空间并存放”hello”,并将”hello”在常量池的地址存放在new出来的对象中(所以:如果”hello”字符串在常量池中存在则该语句创建一个对象,不存在则创建两个)

  2、s1 = “hello”则表示直接到常量池中查询,有则返回地址,没有则创建新的再返回地址(所以:如果常量池中存在,则不创建对象,不存在则创建一个对象)

九: s1 = “a” + “b”和s1 = a1 + a2 (注:a1 = “a”,a2=”b”)有什么区别

  1、如果是变量相加如(s1 = a1 + a2 (注:a1 = “a”,a2=”b”)),则先开空间,再拼接(每一个字符串变量在常量池中都有一个地址,如果是多个拼接,则生成新的对象并返回这个对象的地址)。

  2、如果是常量相加如:s1 = “a” + “b”,则是先将字符串拼接好,再到常量池中查找,有则直接返回,没有则创建再返回

  3、所以,在进行比较的时候,一般判断清除是拼接完再查询还是查询后再拼接,这样使用在进行比较的时候也是不一样的

十: 字符串常量池和String.intern()方法在jdk1.6、1.7、1.8的变化

作用:

    intern方法只会保存首次存储的字符串的引用到常量池中,后面再有一样的也不会被覆盖。

区别:

    JDK1.6: intern方法属于永久区

    JDK1.7及之后,取消了永久代,存在在java堆中

十一: Comparable和Comparator的区别

一: Comparable特点:

    1、只有一个方法:compareTo,需要拥有比较方法的类去实现它

    2、是一个接口,实现它类就有了比较功能,比较的具体实现由自己定义

(一): Comparable作用:

    内比较器,可以实现自己和自己比较,也可以实现不同类对象的比较,依赖于compareTo实现逻辑,如果想将类添加到Collection中然后调用sort排序,则添加入Collection的类必须实现这个接口

(二): Comparable缺点:

    耦合性比较强,必须实现compareTo方法,有代码侵入。

(三): 返回结果: int类型

     1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数

     2、比较者等于被比较者,那么返回0

    3、比较者小于被比较者,那么返回负整数

二: Comparator特点

    1、是外比较器,是一个接口,提供了compare(T1 o1,T2 o2)API用于比较,除此之外还存在其他API如:reversed方法。

(一): Comparator使用场景:

    1、类没有实现Comparable接口,但是也要两个对象进行比较。

    2、虽然类实现了Comparable接口,但是对compareTo中的比较逻辑不满足

(二): Comparator缺点:

    比较方法的泛型类T需要指定,所以比较的话就无法实现两个不同对象的比较。

(二): 返回结果: int类型

    1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数

    2、比较者等于被比较者,那么返回0

    3、比较者小于被比较者,那么返回负整数

三: 区别

    1、Comparator位于包java.util下,而Comparable位于包java.lang下

    2、实现Comparable接口的方式比实现Comparator接口的耦合性要强一些,如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的(既:每个需要比较的类定义一个比较器,具体实现在比较器中,不涉及修改类,不需要对实现类有任何修改)

    3、Comparable只有一个接口是函数式接口,Comparator则有多个。

四: 命名规范:

    "待比较的实体类+Comparator"来命名

小结

   不积跬步,无以至千里;不积小流,无以成江海。今天播种努力的种子,总会有一天发芽!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/03/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 类基础信息
    • 一: 类加载后会存在在哪里
      • 二: Hotspot和JRockit的关系
        • 三: JDK8为什么要使用元空间取代永久代
          • 四: 类加载的最终产物是什么
            • 五: 字符串常量、静态变量存放在哪里
              • 六: String为什么定义成final
                • 七: String、StringBuffer、StringBuilder的区别
                  • 八: s1 = new String(“hello”)和s1 = “hello”有什么区别
                    • 九: s1 = “a” + “b”和s1 = a1 + a2 (注:a1 = “a”,a2=”b”)有什么区别
                      • 十: 字符串常量池和String.intern()方法在jdk1.6、1.7、1.8的变化
                        • 十一: Comparable和Comparator的区别
                        • 小结
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档