zoukankan      html  css  js  c++  java
  • Java基础

    Java基础

    • JVM

    运行java字节码的虚拟机。

    • jre与jdk的区别?

    jre:java程序运行的环境
    jdk:除运行环境外,还有java自带的各种工具如,jps(查看java线程),jstat(监视运行时虚拟机的状态 jstat -gc pid),jmap(生成heap dump文件分析内存溢出时使用 jmap -heap pid),
    jstack(查看线程状态,用来分析死锁、死循环等)。
    总结:只是运行java程序安装jre即可,若要分析内存溢出,cpu使用率过高的线上问题安装jdk。

    • 构造器Constructor是否可被 override?

    不可被override(重写),但是可以被overload(重载)。

    • 重写(override)和重载(overload)的区别?

    重写:子类对父类方法重写编写实现,参数必须相同,返回值可以相同,可以不相同(返回值,异常范围都小于父类)。
    重载:在同一个类中的多个同名方法,参数类型数量必须不同,返回值可以相同也可以不同。

    • 面向对象三大特性?

    封装:对象属性私有化。
    继承:子类可以拥有父类的属性和方法(私有属性可以拥有但是不能访问)
    多态:具体使用父类还是子类的方法或属性在编译时不能确定,在运行时确定

    多态(父类子类相同变量,方法时):
    FuClass demo=new ZiClass();
    demo.变量 //调用父类的
    demo.方法() //调用子类的
    
    • String StringBuilder 和 StringBuffer区别?

    String:不可变字符串,底层为final char[] value 数组。
    StringBuilder:可变字符串,线程不安全。
    StringBuffer:可变字符串,线程安全。
    性能:StringBuilder>StringBuffer
    总结:推荐使用StringBuffer;StringBuilder性能只提高了15%左右,却要冒线程不安全的风险。

    • 自动装箱,拆箱
    //假如需要生成一个Integer对象,值为5
    //正常
    Integer i = new Integer(10);
    //自动装箱
    Integer i = 10;
    //自动拆箱
    int n = i;
    
    • 包装类型和基本类型的区别是什么?

      1. 包装类型可以为null,基本类型不行。(pojo中的某个属性若设置为int型,正好数据查出这个属性值为null,由于自动装箱的存在,所以会报NullPointerException异常)
      2. 包装类型可以用于泛型,基本类型不行。
      3. 基本类型更高效(基本类型存在栈中,包装类型存在堆中)
      
    • 接口和抽象类的区别?

      1. 接口默认public,接口不能有已实现的方法;抽象类可以有非抽象方法。
      2. 接口变量必须是static或final型。
      3. 接口可以多继承
      4. 抽象类是对类的抽象,相当于模板,接口是对行为的抽象;比如animal都会跑,那么子类cat必须实现run,cat可能还会爬树这种行为,再去实现接口的climb方法;
      
    • 全局变量和局部变量的区别?

      1. 全局变量是属于类的,局部变量在方法中定义。
      2. 局部变量只能被final修饰。
      3. 局部变量存在栈,全局存在堆。
      4. 全局变量未赋值系统会赋予默认值,局部变量必须有初始值。
      5. 局部变量随方法结束消失,全局变量是对象的一部分,与对象的生命周期相同。
      
    • ==与equals的区别?

    ==比较的对象的地址是否相同
    equals判断两个对象是否相等,若已重写如String,那么比较的是值是否相等,否则比较的还是地址

    • hashCode与equals

      1. 什么是hashCode?
      答:hashCode方法存在于Object.java中,所以每个java对象都有hashCode方法
      2. hashCode有什么用?
      答:用于确定对象在散列表中的位置,且hashCode只在散列表中起作用。
      3. 散列表?
      答:常见的有:HashSet, Hashtable, HashMap
      4. hashCode() 和 equals() 的关系
      答:1.未用到散列表,这种情况下未用到hashCode,重写equals就可以判断两个对象是否相等。
         2.用到散列表,此时如果只重写equals方法,不重写hashCode方法,那么equals无效。
        // 新建Person对象,
        Person p1 = new Person("eee", 100);
        Person p2 = new Person("eee", 100);
        // 新建HashSet对象 
        HashSet set = new HashSet();
        set.add(p1);
        set.add(p2);
        由于未重写hashCode方法,即使equals方法判断为true,但是他们的hashCode值是不同的,所以HashSet判断他们是两个对象,那么存进去的时候就会出现重复。
      
    • java参数传递方式?

    java只有值传递

    //值传递,基本类型
    //num1和num2未发生改变
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
    
        swap(num1, num2);
    
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }
    
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
    
    //值传递,引用类型
    //这里看起来像是引用传递,其实不是,这里传递的是引用的值,引用的值就是内存地址,arr和array指向同样的内存地址所以arr的发生了改变。
     public static void main(String[] args) {
            int[] arr = { 1, 2, 3, 4, 5 };
            System.out.println(arr[0]);
            change(arr);
            System.out.println(arr[0]);
        }
    
        public static void change(int[] array) {
            // 将数组的第一个元素变为0
            array[0] = 0;
        }
    
    • 线程和进程的区别?

      1. 进程:CPU加载上下文+CPU执行+CPU保存上下文 的时间
      2. 线程:把进程的时间细分成3段,a,b,c那么abc就是线程,他们共享进程的上下文
      3. 总结:进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。
      
    • 线程的状态?

      1. 新建 NEW
      2. 运行 RUNNABLE
      3. 阻塞 BLOCKED
      4. 等待 WAITING
      5. 超时等待 TIME_WAITING
      6. 终止态 TERMINATED
      
    • final关键字

    用于类,方法,变量
    1. 修饰基本变量表示变量不可变,修饰引用变量表示引用不可指向其他。
    2. 修饰类表示类不可被继承。
    3. 修饰方法表示方法不可被重写。

    • 异常

    分为Error和Exception
    Error一般为StackOverFlowError(递归过深)和OutOfMemoryError(内存溢出),Error是代码无法处理的
    Exception分为IOException和RuntimeException
    IOException一般为FileNotFoundException(文件未发现)
    RuntimeException一般有数组越界,空指针,未发现类等

    • IO流
    1. 分类:
      按照流的流向分,可以分为输入流和输出流。
      按照操作单元划分,可以划分为字节流和字符流。
      按照流的角色划分为节点流和处理流。
    2. 有了字节流为什么还要有字符流?
      字符流是java虚拟机转换字节流得到的,这个过程是很耗时的,所以干脆直接提供字符流。
      字符一般用字符流,音频视频文件一般用字节流。
    • BIO,NIO,AIO有什么区别?
    1. BIO,同步阻塞IO,读取写入在一个线程内完成,并发量低。
    2. NIO,Non-blocaking同步非阻塞IO,利用Channel,Selector,Buffer等抽象达到异步IO的效果
    3. AIO,异步非阻塞IO
    • 深拷贝和浅拷贝
    1. 浅拷贝:基本数据类型,值传递;引用数据类型,对其引用进行拷贝。
    2. 深拷贝:基本数据类型,值传递;引用数据类型,创建一个新的对象,并复制其内容。

    转自JavaGuide面试突击版

  • 相关阅读:
    hdoj2187:悼念512汶川大地震遇难同胞 (贪心)
    2.0其它之Transform详解,以及UIElement和FrameworkElement的常用属性
    2.0外观之样式, 模板, 视觉状态和视觉状态管理器
    2.0图形之Ellipse, Line, Path, Polygon, Polyline, Rectangle
    2.0控件之ListBox, MediaElement, MultiScaleImage, PasswordBox, ProgressBar, RadioButton
    2.0画笔之SolidColorBrush, ImageBrush, VideoBrush, LinearGradientBrush, RadialGradientBrush
    2.0图形之基类System.Windows.Shapes.Shape
    2.0交互之鼠标事件和键盘事件
    2.0控件之ScrollViewer, Slider, StackPanel, TabControl, TextBlock, TextBox, ToggleButton
    2.0交互之InkPresenter(涂鸦板)
  • 原文地址:https://www.cnblogs.com/qifengle1412/p/12870540.html
Copyright © 2011-2022 走看看