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)行为型模式:策略,模板方法,责任列,观察者,命令,备忘录, 访问者,中介者,解析器,状态,迭代子模式。
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不是幂等的
网友评论