zoukankan      html  css  js  c++  java
  • Java开发工程师面试-基础

    JDK、JRE、JVM有什么区别?

    • JDK:Java Development Kit 针对Java程序员的产品
    • JRE:Java Runtime Environment是运行Java的环境集合
    • JVM:Java虚拟机用于运行Java字节码文件,跨平台的核心
      在这里插入图片描述

    常用数字类型的区别

    在这里插入图片描述

    写出程序执行结果,并说明原因

    在这里插入图片描述

    • 打印结果:yes
    • 分析:
      float类型在内存中的存储形式为科学计算法,表达为4.2123456E7,只保留了小数点后7位。
    • 补充:
    1. 浮点数存储分为三部分:
      符号位(Sign):0代表正数,1代表负数
      指数位(Exponent):用于存储科学计数法中的指数部分
      尾数位(Mantissa):用于存储尾数部分
    2. 单精度是1位符号,8位指数,23位小数
    3. 双精度是1位符号,11位指数,52位小数

    编程题:随机生成30~100之间的整

    在这里插入图片描述

    面向对象的三大特征

    • 封装:将同一类事物的功能包装在一起,只对外提供访问接口
         好处:
         1. 实现专业的分工(你是使用者只需要关心怎么使用就行,无需了解具体实现细节)
         2. 减少代码耦合(面向接口开发,互不干扰)
         3. 可以自由修改类的内部结构(只要不影响使用者的功能,都可以随意改造)
    • 继承:从已有的类派生出新的类,新的类可以有已有类的属性和行为,并拓展新的功能
    • 多态:
         多态是同一个行为具有多个不同表现形式或形态的能力
         多态是同一个接口,使用不同的实例而执行不同操作

    接口和抽象类的异

    • 相同点

        都是上层的抽象
        不能被实例化
        都可以包含抽象方法

    • 不同点

        抽象类可包含方法的实现,接口则只能包含方法的声明(jdk7及其以前版本)
        继承只能继承一个抽象类,实现类可以实现多个接口
        抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是public static final
        抽象类可以有静态代码块和静态方法,而接口中不能含有静态代码块以及静态方法
        继承用于代码复用,接口用于约束程序行为

    静态和实例变量(方法)的区别:

    • 语法区别:静态变量前要加static关键字,实例则不用
    • 隶属区别:实例变量属于某个对象的属性,而静态属于类
    • 运行区别:静态变量在JVM加载类时创建,实例变量在实例化对象时创建
    • 位置区别:静态变量存放在JVM方法区,无法被回收;实例变量存放在堆中,不用就被回收

    父子类实例化过程分析

    public class Parent {
       private static String name = initName();
       private int age = initAge();
       private static String initName(){
          System.out.println("1父类静态变量初始化");
          return "程序员Forlan";
       }
       private int initAge(){
          System.out.println("2父类普通变量初始化");
          return 100;
       }
       static {
          System.out.println("3父类静态代码块");
       }
       {
          System.out.println("4父类非静态代码块");
       }
       public Parent(){
          System.out.println("5父类构造函数");
       }
    }
    public class Son extends Parent{
       private static String name = initName();
       private int age = initAge();
       private static String initName(){
          System.out.println("6子类静态变量初始化");
          return "程序员Forlan";
       }
       private int initAge(){
          System.out.println("7子类普通变量初始化");
          return 100;
       }
       static {
          System.out.println("8子类静态代码块");
       }
       {
          System.out.println("9子类非静态代码块");
       }
       public Son(){
          System.out.println("10子类构造函数");
       }
    }
    
    public static void main(String[] args) {
       new Son();
    }
    
    • 输出结果顺序为:13682457910
    • 三个原则:
      静态优先
      父类优先
      非静态块优先于构造函数
    • 注意:
      静态变量和静态代码块,谁写前面谁先执行
      非静态变量和非静态代码块,谁写前面谁先执行

    JAVA异常体系

    在这里插入图片描述在这里插入图片描述

    String中“==” 和equals程序分析

    在这里插入图片描述

    • 结果:
      true
      true
      false
      true
      false
    • 分析:
      ==比较的是地址,equals比较的是值
      创建后就不可变(被final修饰),保存在方法区中的常量池
      s2是引用类型,Java编译器在编译期间无法确定数值,只有在运行时才能确定具体的值,所以s2+"def"会产生一个新的内存地址,分配给s5
      new String()创建的字符串不保存在常量池

    String、StringBuilder、StringBuffer的区别

    在这里插入图片描述

    List和Set的区别

    在这里插入图片描述

    Lsit比较

    在这里插入图片描述

    Set比较

    在这里插入图片描述

    Object类hashCode()和equals()的区别

    • equals()方法用来判断两个对象是否相同
    • hashCode()返回一个int,代表该对象的内部地址
      在这里插入图片描述

    Java IO中有几种类型的流

    在这里插入图片描述

    JVM的内存组成

    在这里插入图片描述

    • 共享区:对于所有线程都可以访问的
    1. 堆:用于保存程序运行时的变量
    2. 方法区:包含静态内容
    • 私有区:对于线程来说是私有的,其他线程无法直接访问
    1. 程序计数器:行号计数器,在程序跳转时,我们要记住跳转行号是多少,方便程序进行还原
    2. 虚拟机栈:包含方法执行时的状态,每个方法都会形成一个栈帧
    3. 本地方法栈:用于在调用操作系统级别的底层方法,才会存放方法的栈帧

    Java垃圾回收

    • GC(Garbage Collection)用于回收不再使用的内存
    • GC负责3项任务:分配内存、确保引用、回收内存
    • GC回收是依据某个没有任何引用,则可以被回收
    • 通过有向图记录对象,判断是否可达

    垃圾回收(GC)算法

    • 标记-清除算法
    • 复制算法
    • 标记-整理算法
    • 分代收集算法
      详细可看https://www.cnblogs.com/huozhonghun/p/JVM2.html

    Java中内存泄露的场景

    • 静态集合类
    • 各种连接
    • 监听器
    • 不合理的作用域

    对象的浅复制与深复制区别

    • 浅复制:只对对象及变量值进行复制,引用对象地址不变
    • 深复制:不仅对象及变量值进行复制,引用对象也进行复制

    感谢耐心观看!!!
    如有不足,欢迎指出,一起成长!
    如有帮助,请点赞给予支持,感谢!

  • 相关阅读:
    数据结构基础(21) --DFS与BFS
    数据结构基础(20) --图的存储结构
    数据结构基础(19) --堆与堆排序
    数据结构基础(18) --哈希表的设计与实现
    数据结构基础(17) --二叉查找树的设计与实现
    数据结构基础(16) --树与二叉树
    数据结构基础(15) --基数排序
    数据结构基础(14) --链式队列的设计与实现
    在centOS6.5 上安装使用pipework
    数据结构基础(13) --链式栈的设计与实现
  • 原文地址:https://www.cnblogs.com/huozhonghun/p/14615742.html
Copyright © 2011-2022 走看看