1.介绍一下 java
开源,跨平台,面向对象
区别大小写
强类型语言
跨平台是因为 java 的 class 文件是运行在虚拟机上的,而虚拟机是有不同平台的
封装
1.把对象的属性和行为看成一个密不可分的整体,将这两者’封装’在一个不可分割的独立单元(即对象)中
2.信息隐藏,把不需要让外界知道的信息隐藏起来,有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知晓,或只允许使用对象的功能,而尽可能隐藏对象的功能实现细节。
继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
多态
1.方法重载:在一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同。
2.对象多态:子类对象可以与父类对象进行转换,而且根据其使用的子类不同完成的功能也不同(重写父类的方法)。
多态是同一个行为具有多个不同表现形式或形态的能力。Java语言中含有方法重载与对象多态两种形式的多态:
java 有哪些数据类型
3.接口和抽象类有什么区别?
接口是对行为的抽象,抽象类是对类(属性和行为)的抽象
接口:成员变量为常量 成员方法为抽象方法(无方法体) 无构造方法
接口可以多继承,抽象类不行
抽象类:成员变量为常量、变量 成员方法为抽象方法 ,普通方法pvm 无参带参构造
接口定义方法,不能实现,默认是 public abstract,而抽象类可以实现部分方法。
接口中基本数据类型为 public static final 并且需要给出初始值,而抽类象不是的。
4.重载和重写什么区别?
与返回值无关,与方法名相同,形参的参数个数与参数类型有关
子类继承父类 同名方法实现其他功能,就需要重写父类的方法,来实现特有的方法
5.常见的异常有哪些?
NullPointerException 空指针异常
ArrayIndexOutOfBoundsException 索引越界异常
InputFormatException 输入类型不匹配
SQLException SQL异常
IllegalArgumentException 非法参数
NumberFormatException 类型转换异常 等等…
6.异常要怎么解决?
Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。
Throwable又派生出Error类和Exception类。
错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。
异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。
处理方法:
1.try()catch(){}
try{
// 程序代码
}catch(ExceptionName e1){
//Catch 块
}
2.throw
throw 关键字作用是抛出一个异常,抛出的时候是抛出的是一个异常类的实例化对象,在异常处理中,try 语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出
3.throws
定义一个方法的时候可以使用 throws 关键字声明。使用 throws 关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。
7.arrayList 和 linkedList 的区别?
都是list接口的实现类。arrayList 底层是数组实现,linkedList 底层是链表实现
arrayList 查询快,增删慢 linkedList 查询慢,增删快
1.ArrayList 是实现了基于数组的,存储空间是连续的。LinkedList 基于链表的,存储空间是不连续的。(LinkedList 是双向链表)
2.对于随机访问 get 和 set ,ArrayList 觉得优于 LinkedList,因为 LinkedList 要移动指针。
3.对于新增和删除操作 add 和 remove ,LinedList 比较占优势,因为 ArrayList 要移动数据。
4.同样的数据量 LinkedList 所占用空间可能会更小,因为 ArrayList 需要预留空间便于后续数据增加,而 LinkedList 增加数据只需要增加一个节点
8.hashMap 1.7 和 hashMap 1.8 的区别?
9.hashMap 线程不安全体现在哪里?
在 hashMap1.7 中扩容的时候,因为采用的是头插法,所以会可能会有循环链表产生,导致数据有问题,在 1.8 版本已修复,改为了尾插法
在任意版本的 hashMap 中,如果在插入数据时多个线程命中了同一个槽,可能会有数据覆盖的情况发生,导致线程不安全。
10.那么 hashMap 线程不安全怎么解决?
一.给 hashMap 直接加锁,来保证线程安全
二.使用 hashTable,比方法一效率高,其实就是在其方法上加了 synchronized 锁
三.使用 concurrentHashMap , 不管是其 1.7 还是 1.8 版本,本质都是减小了锁的粒度,减少线程竞争来保证高效.
11.concurrentHashMap 1.7 和 1.8 有什么区别
12.介绍一下 hashset 吧
hashset 底层是由哈希表来实现的
set 继承于 Collection 接口,是一个不允许出现重复元素,并且无序的集合.
HashSet 是基于 HashMap 实现的,底层采用 HashMap 来保存元素
元素的哈希值是通过元素的 hashcode 方法 来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较 equals 方法 如果 equls 结果为 true ,HashSet 就视为同一个元素。如果 equals 为 false 就不是同一个元素。
13.什么是泛型?
数据类型的广泛称呼
泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
14.泛型擦除是什么?
因为泛型其实只是在编译器中实现的而虚拟机并不认识泛型类项,所以要在虚拟机中将泛型类型进行擦除。也就是说,在编译阶段使用泛型,运行阶段取消泛型,即擦除。擦除是将泛型类型以其父类代替,如String 变成了Object等。其实在使用的时候还是进行带强制类型的转化,只不过这是比较安全的转换,因为在编译阶段已经确保了数据的一致性。
15.说说进程和线程的区别?
一个进程包含一个或多个线程,一个应用程序的启动到关闭是一个进程,而某一个模块的运行是线程
进程是系统资源分配和调度的基本单位,它能并发执行较高系统资源的利用率.
线程是比进程更小的能独立运行的基本单位,创建、销毁、切换成本要小于进程,可以减少程序并发执行时的时间和空间开销,使得操作系统具有更好的并发性。
16.volatile 有什么作用?
1.保证内存可见性
可见性是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果,另一个线程马上就能看到。
2.禁止指令重排序
cpu 是和缓存做交互的,但是由于 cpu 运行效率太高,所以会不等待当前命令返回结果从而继续执行下一个命令,就会有乱序执行的情况发生
17.什么是包装类?为什么需要包装类?
Java 中有 8 个基本类型,分别对应的 8 个包装类
byte – Byte
boolean – Boolean
short – Short
char – Character
int – Integer
long – Long
float – Float
double – Double
为什么