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面试突击版

  • 相关阅读:
    类的使用(基础)
    <cf>Two Problems
    <cf>Walking in the Rain
    一些程序的整理
    <codeforces>Little Elephant and Sorting
    HDU 1172 猜数字(枚举)
    HDUOJ 1879 继续畅通工程
    error C2679: binary '<<' : no operator defined which takes a righthand operand of type 'class std::basic_s
    HDUOJ 1198 Farm Irrigation(并查集)
    HDU 1222 Wolf and Rabbit
  • 原文地址:https://www.cnblogs.com/qifengle1412/p/12870540.html
Copyright © 2011-2022 走看看