美文网首页
java 基础1

java 基础1

作者: 流光已至 | 来源:发表于2019-05-09 17:20 被阅读0次

    java基础面试题

    1 关于JVM JDK和JRE最详细通俗的解答

    JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合, 包括 Java 虚拟机(JVM),Java 类库,
    java 命令和其他的一些基础构件。但是,它不能用于创建新程, JDK 是 Java Development Kit,它是功能齐全的 Java SDK。
    它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb).它能够创建和编译程序.

    2 构造器Constructor是否可被override

    在讲继承的时候我们就知道父类 的私有属性和构造方法不能被继承,
    所以Constructor也就不能被override(重写),但是可以overload(重载)

    3 重载和重写的区别

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

    4 java面向对象编程的三大特征:继承,多态,封装

    封装:把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,
    继承:是使用已存在的类的定义作为基础建立新类的技术
    多态:即一个引用变量到底会指向哪个类的实例对象, 该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。实现: 继承和接口

    5 String StringBuffer 和 StringBuilder 的区别

    String 是不可变的对象,经常改变内容的字符串最好不要用 String,StringBuffer是线程安全的。

    6 synchronized 和Lock的区别

    1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;
    2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
    3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
    4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
    5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可中断、可公平(两者皆可)
    6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

    7 sleep() 和 wait() 的区别

    1 wait 来自 Object类 ,sleep来自 Thread 类
    2 最主要wait 释放了同步锁。
    3 sleep 必须捕获异常
    4 sleep方法可以在任何地方使用,
    wait方法只能在同步方法和同步代码块中使用

    8 == 与 equals(重要)

    == : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)
    equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
    情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
    情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

    9 hashCode()与 equals()

    以hashMap 为例来解释。
    1. 如果两个对象相等,则 hashcode 一定也是相同的
    2. 两个对象相等,对两个对象分别调用 equals 方法都返回 true
    3. 两个对象有相同的 hashcode 值,它们也不一定是相等的
    4. 因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖

    10 关键字 volatile 是轻量级的同步机制。

    volatile对所有线程的可见性,是指线程修改了这个变量的值,则对于其他线程是透明的,立即得知的,不一定安全,因为只有可见性,有序性,没有原子性。

    11 hashmap 和 hashtable 底层原理

    hashMap 允许使用null值和null键
    HashMap底层就是一个数组结构,数组中的每一项又是一个链表,
    Entry<key,value>就是数组中的元素
    put数据时先根据key的hashCode重新计算hash(加入高位运算,
    防止低位不变,高位变化时,造成的hash冲突)值,
    从HashMap中get元素时,首先计算key的hashCode, 在 由h& (length-1)运算等价于对length取模,得到数组的保存位
    找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。

    Hashtable并没有去继承AbstractMap,而是选择继承了Dictionary类
    Hashtable不允许null值和null键.
    Hashtable 的函数都是同步的,这意味着它是线程安全的
    HashMap计算索引的方式是h&(length-1),而Hashtable用的是模运算,效率上是低于HashMap
    Hashtable每次扩容,新容量为旧容量的2倍加1(11),而HashMap为旧容量的2倍(16);

    12 Error 和 exception 的区别?

    Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足。这些问题导致的运用程序中断,程序本身无法恢复和预防,建议让程序终止。
    Exception一般程序本身可以处理的问题。

    13 ThreadLocal 相关

    ThreadLocal不继承Thread类,也不实现Runable接口,ThreadLocal为每一个线程维护独立的变量拷贝,每个线程都拥有自己独立的变量,其目的在于数据独立。
    ThreadLocal采用hash表的方式为每个线程提供一个变量的副本。

    14 设计模式(大类为3 种)

    1)创建型模式:工厂方法,抽象工厂,单例,建造者,原型
    2)结构型模式:适配器,桥接,装饰,代理,外观,组合,享元
    3)行为型模式:策略,模板方法,责任列,观察者,命令,备忘录, 访问者,中介者,解析器,状态,迭代子模式。

    设计模式概述23

    15 常见的runtime Exception

    NullPointerException - 空指针引用异常
    ClassCastException - 类型强制转换异常。
    IllegalArgumentException - 传递非法参数异常。
    ArithmeticException - 算术运算异常
    ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
    IndexOutOfBoundsException - 下标越界异常

    16 反射的用途及实现

    是 JVM 在运行时 才动态加载的类或调用方法或属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。
    反射最重要的用途就是开发各种通用框架。

    获得Class对象:
    使用Class类的forName静态方法
    直接获取某一个对象的class
    调用某个对象的getClass()方法

    Java反射框架主要提供以下功能:
    1.在运行时判断任意一个对象所属的类;
    2.在运行时构造任意一个类的对象;
    3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
    4.在运行时调用任意一个对象的方法

    15 数组和集合的区别

    1 长度可变,可以存放不同类型的元素,只能存放引用类型。
    2 长度固定,只可以存放相同的同种类型的元素,可以存放基本数据类型,也可以存放引用类型。

    16 简述线程,程序、进程的基本概念。以及他们之间关系是什么

    程序是静态的代码。
    线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。
    从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。

    17 get和post的区别

    GET请求会被浏览器主动cache,而POST不会,除非手动设置。
    GET请求只能进行url编码,而POST支持多种编码方式。
    GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
    GET参数通过URL传递,POST放在Request body中。
    对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
    GET请求在URL中传送的参数是有长度限制的,而POST么有。
    GET是幂等的,而post不是幂等的

    相关文章

      网友评论

          本文标题:java 基础1

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