美文网首页java架构经验分享
精心准备!掌握这些高频java面试题,助你备战金三银四!

精心准备!掌握这些高频java面试题,助你备战金三银四!

作者: 前程有光 | 来源:发表于2021-03-03 21:06 被阅读0次

    面向对象

    面向过程更注重于事情的每一个步骤和顺序,面向对象则更注重于事情有哪些参与者以及各需要做什么

    JDK JRE JVM

    jdk: Java开发工具包
    jre:Java运行时环境
    jvm:Java虚拟机


    ==和equals

    ==比的是栈中的值,基本类型是变量值,引用类型是堆中内存对象的地址
    equals:object默认也是采用==比较,通常会重写,重写后equals其实是比较两个字符串的内容

    String x = "string";
    String y = "string";
    String z = new String("string");
    System.out.println(x==y); // true
    System.out.println(x==z); // false
    System.out.println(x.equals(y)); // true
    System.out.println(x.equals(z)); // true
    
     String str1 = "hello";
     String str2 = new String("hello");
     String str3 = str2;  //引用传递
     System.out.println(str1 == str2);  //false
     System.out.println(str1 == str3);  //false
     System.out.println(str2 == str2);  //true
     System.out.println(str1.equals(str2));  //true
     System.out.println(str1.equals(str3));  //true
     System.out.println(str2.equals(str3));  //true
    
    

    简述final作用 ,为什么局部变量内部类和匿名内部类只能访问局部final变量

    final可以修饰:类(不可被继承)、方法(不可被重写)、变量(不可更改值)

    String、StringBuilder、StringBuffer

    String是final修饰的,不可变,每次操作都会产生新的String对象
    StringBuilder和StringBuffer都是在原对象上操作,StringBuffer是线程安全的,StringBuilder线程不安全,
    性能:StringBuilder>StringBuffer>String

    重载和重写的区别

    重载:发生在同一个类中,方法名必须相同,参数类型不同,个数、顺序、不同,方法的返回值和访问修饰符可以不同,发生在编译时;
    重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出异常方位小于等于父类,访问修饰符范围大于父类,富国父类方法为private则不能重写该方法。

    接口和抽象类

    • 抽象类可以存在普通成员函数,而接口中只能存在 public abstract方法
    • 抽象类中的成员变量可以时各种的,而接口中成员变量只能是public static final
    • 抽象类只能继承一个,而接口可以实现多个
    • 接口的设计目的是对行为进行约束,而抽象类的设计目的是代码复用,
    • 抽象类是对类本质的抽象,表达式是is a的关系,而接口是对行为的抽象,表达式是like a的关系,接口的核心是定义行为,即实现类可以做什么,至于主体是谁,如何实现的,接口并不关心。
      -使用场景:当你关注一个事物本质的时候,用抽象类,当你关注一个操作的时候,用接口。

    List和Set的区别

    List:有序,按对象进入的顺序保存对象,可重复,可允许多个null元素对象,取元素可以使用iterator接口取得所有元素,在遍历一遍,还可以使用get(int index)获取指定下标的元素
    Set:无序,不可重复,最多允许有一个null元素对象,取元素只能用Iterator接口取得所有元素,再逐一遍历各个元素
    Iterator取值遍历:

           //遍历Set
           Set<String> set = new HashSet<>();
           set.add("1");
           set.add("2");
           set.add("3");
           set.add("3");
           Iterator<String> iterator = set.iterator();
           while (iterator.hasNext()) {
               String nest = iterator.next();
               System.out.println(nest);
           }
    
    

    hashCode 和 equals

    ArrayList和LinkList的区别

    ArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问),扩容机制:因为数组长度固定,超出长度时需要新建数组,然后哦将老数组的数据拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动(往后复制一份,插入新元素),使用尾插法并指定初始容量可以极大提升性能,甚至超过LinkList(需要创建大量node对象)
    LinkList:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询:要逐一遍历LinkList必须使用Iterator,不能使用for循环,因为每次for循环体内通过get(i)取得某一元素时都要对list重新进行遍历,性能消耗极大。

    HashMap和HashTable有什么区别,HashMap其底层实现是什么?

    区别:
    (1)hashmap方法没有synchronized修饰,线程不安全,HashTable线程安全
    (2)hashmap允许key和value为null,而HashTable不允许
    底层实现:数组+链表实现

    如何实现IOC容器

    1、配置文件,配置包扫描路径
    2、递归包扫描获取.class文件
    3、反射,确定需要交给IOC管理的类
    4、对需要注入的类进行依赖注入

    什么是字节码?采用字节码的好处?

    Java源码---->编译器----->jvm可执行的Java字节码(即虚拟指令)------>JVM------->JVM中解释器-------->机器可执行的二进制机器码---->程序运行

    采用字节码的好处:java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释性语言可移植性的特点,所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无需重新编译便可在多种不同的计算机上运行。

    最后

    欢迎关注公众号:前程有光,领取一线大厂Java面试题总结+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结!
    这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。

    相关文章

      网友评论

        本文标题:精心准备!掌握这些高频java面试题,助你备战金三银四!

        本文链接:https://www.haomeiwen.com/subject/flucqltx.html