2021-06-14 java面经更新

  1. 第一道面试题 面向对象

    面向对象,处理问题的两种不同角度

    比如洗衣服,我需要打开洗衣机 放衣服 倒洗衣液 点开始清洗 烘干

    面向过程更注重事情的每一个步骤和顺序

    面向对象更注重事情有哪些参与者对象,以及对象需要干什么(属性,方法)

    面向对象会拆出两个对象 人:打开洗衣机 放衣服 倒洗衣液 洗衣机 :清洗 烘干

    面向过程高效,面向对象更易于复用,扩展和维护

    封装:封装的意义,在于明确标识出允许外部使用的成员函数和数据项

    内部细节对外部调用透明,外部调用无需修改或者关心内部实现

    1、 javabean的属性私有 get/set

    private String name;

    public void setName(String name)

    {

    this.name = "tuling_"+name;

    }

    2、orm框架 引入mybatis 调方法即可

    继承:继承基类的方法,并作出自己的改变或拓展

    子类共性的方法或者属性直接使用父类的,而不需要自己再定义,只需扩展自己个性化的

    多态:继续对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。

  2. jvm的理解

    运行时数据区: 堆 栈(线程栈) 方法区:又叫静态区,跟堆一样,被所有的线程共享。它用于存储已经被虚拟机加载的类信息、常量、静态变 量、即时编译器编译后的代码等数据。 本地方法栈 程序计数器 栈包含局部变量表,操作数栈,动态链接,方法出口。堆分Eden,Survivor区分s0,s1,年轻代,老年代。

  3. jdk jre jvm三者关系

    jdk java开发工具 给开发人员用的 jre java 运行时环境 jvm j虚拟机 jdk包含jre和java工具 jre包含jvm

  4. ==和equals的区别

    ==:对比的是栈中的值,基本数据类型就是变量值,引用类型是堆中内存对象的地址

    equals:首先,equals()方法不能作用于基本数据类型的变量,

    另外,equals()方法存在于Object类中,而Object类是所有类的直接或间接父类,所以说所有类中的equals()方法都继承自Object类,在没有重写equals()方法的类中,调用equals()方法其实和使用==的效果一样,也是比较的是引用类型的变量所指向的对象的地址,不过,Java提供的类中,有些类都重写了equals()方法,重写后的equals()方法一般都是比较两个对象的值,比如String类。 需要注意的是:当参数是基本类型int时,编译器会给int自动装箱成Integer类,然后再进行比较。先比较是否是同类型,非同类型直接返回false。同类型再比较值 IntegerCache 缓存

    IntegerCache 缓存:JAVA的Integer有IntegerCache会缓存-128~127之间的对象。如:Integer x = 100,会调用Integer的valueOf()方法,这个方法就是返回一个Integer对象,但是在返回前,作了一个判断,判断要赋给对象的值是否在[-128,127]区间中,且IntegerCache(是Integer类的内部类,里面有一个Integer对象数组,用于存放已经存在的且范围在[-128,127]中的对象)中是否存在此对象,如果存在,则直接返回引用,否则,创建一个新对象返回。

  5. int和Integer的区别

    1 区别
    Integer是int的包装类,int则是java的一种基本数据类型
    Integer变量必须实例化后才能使用,而int变量不需要
    Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
    Integer的默认值是null,int的默认值是0。

    2 ==比较
    1、由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。
    Integer i = new Integer(100);
    Integer j = new Integer(100);
    System.out.print(i == j); //false
    2、Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)
    Integer i = new Integer(100);
    int j = 100;
    System.out.print(i == j); //true
    3、非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)
    Integer i = new Integer(100);
    Integer j = 100;
    System.out.print(i == j); //false
    4、对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false
    Integer i = 100;
    Integer j = 100;
    System.out.print(i == j); //true
    Integer i = 128;
    Integer j = 128;
    System.out.print(i == j); //false
    对于第4条的原因:
    java在编译Integer i = 100 ;时,会翻译成为Integer i = Integer.valueOf(100);,而java API中对Integer类型的valueOf的定义如下:

    public static Integer valueOf(int i){
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high){
    return IntegerCache.cache[i + (-IntegerCache.low)];
    }
    return new Integer(i);
    }
    java对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。

  6. String s = new String(“abc”);产生几个对象?

    答:一个或两个,如果常量池中原来没有”abc”,就是两个。

    我们再来看看 String str = new String("abc")创建过程 :
    (1) 先定义一个名为str的对String类的对象引用变量放入栈中。
    (2) 然后在堆中(不是常量池)创建一个指定的对象,并让str引用指向该对象。
    (3) 在常量池中查找是否存在内容为"abc"字符串对象。
    (4) 如果不存在,则在常量池中创建内容为"abc"的字符串对象,并将堆中的对象与之联系起来。
    (5) 如果存在,则将new出来的字符串对象与字符串常量池中的对象联系起来(即让那个特殊的成员变量value的指 针指向它)

本题来源于 https://zhuanlan.zhihu.com/p/68794639,安利一波,文章关于java堆、栈、堆栈,常量池的区别,史上最全总结。关于理解String.intern()的理解,https://blog.csdn.net/tyyking/article/details/82496901网站介绍的很清楚。

img
  1. 在JAVA中,有六个不同的地方可以存储数据:
  1. 寄存器(register):这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。
  1. 栈(stack):存放基本类型的变量数据和对象的引用。位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性。
  1. 堆(heap):一种通用性的内存池(也存在于RAM中),用于存放所有的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区 域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行 这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代价,用堆进行存储分配比用堆栈进行存储存储需要更多的时间。
  1. 静态存储(static storage):这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的,但JAVA对象本身从来不会存放在静态存储空间里。
  1. 常量存储(constant storage):存放字符串常量和基本类型常量(public static final)。 常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。
  1. 非RAM存储:硬盘等永久存储空间。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。

    就速度来说,有如下关系:
    寄存器 < 堆栈 < 堆 < 其他

你可能感兴趣的:(2021-06-14 java面经更新)