1 对面向对象的深刻理解

面向对象是模型化的,我们可以抽象出一个类,把它理解为一个封闭的盒子,在这个封闭的盒子里拥有数据,也拥有解决问题的方法。
我们需要什么功能,就可以直接使用,不必一步一步的去实现,我们不用去管这个功能是怎么实现的,我们只需要会用。
换一种说法,就像我们吃饭,可以买食材去做;也可以去餐馆直接点菜,而面向对象就好比是我们直接去餐馆点菜,上菜之后直接吃就好了。

2 Java语言和其他语言区别?

Java语言是一种高级语言,从某种意义上讲,他是由c和c++语言演变而来。
Java是一种跨平台语言,可以通过jvm可以在不同的操作系统上运行。也就是一处编译,多处运行。
java自带内存管理机制。
Java可以通过多线程同时来执行多个任务,线程是程序内一个单一的顺序控制流程。C语言在某个时刻只能执行一个任务,而Java可以通过多线程来同时执行多项任务。
Java属于解释型语言(C语言是编译型语言,C中有指针的概念,java取消了指针的概念)

3 JRE、JDK、JVM区别?

JRE指得是Java运行环境,JDK指的是程序员开发工具,JVM指的是Java运行需要的虚拟机。
三者之间的区别是:JDK包含JER,JER包含JVM。

4 JDK1.8之前和JDK1.8之后接口不同?

接口更多的体现在对行为的抽象,按照个人的理解指定行为的规则。接口用interface关键字修饰,接口实现类用implements表示。
接口在1.8之前和1.8之后两个版本的不同主要表现在成员方法上:
在1.8版本之前,接口只有抽象方法,默认public abstract修饰。接口的子类要么重写接口中所有的抽象方法;要么就是抽象类实现。
在1.8版本之后,JDK允许在接口中去定义非抽象的方法,但这些方法必须有关键字修饰。默认方法,使用default修饰;静态方法用static修饰,私有方法用private修饰

5 接口和抽象类区别?

首先抽象类是一个类,它是用来被继承的,而接口是用来被实现的。
抽象类,有构造方法,但是在接口中没有构造方法。
抽象类中不一定存在抽象方法,但一旦有抽象方法,这个类必须是抽象类,而接口在JDK1.8之前只有抽象方法。
抽象类的子类可以是抽象类,也可以是具体的类,如果是具体的类,那么必须重写抽象类的所有方法。而接口,可以被一个类进行单实现,也可以多实现。

抽象类型注意事项:
1、抽象类不能实例化(就不能直接创建对象)
2、有构造方法
3、抽象类中不一定存在抽象方法,但是如果有抽象方法,这个类必须是抽象类
4、子类可以是抽象类,也可以是具体的类(就需要重写抽象类中所有的抽象方法)

特点:
1、接口中的成员变量是存在默认的修饰符: public static final
2、接口中没有构造方法
3、接口中的方法都是抽象方法(JDK1.7之前)
4、类和接口之间的关系是实现的关系,可以单实现也可以是多实现
public class 类名 implements 接口1 , 接口2 , …. {

}
5、接口和接口之间的关系是继承的关系,并且可以是多继承

6 Java中的常用容器有哪些?

在java中常见的容器:
1 数组:array是一个存储相同数据类型的存储模型。
2 集合,集合分为单列集合和双列结合。
Collection 单列集合 分为 list 和 set集合
list集合有:ArrayList集合,其底层结构是数组。存取有序。查询快,增删慢。
LikedList集合,其底层结构是链表。增删快,查询慢。
这两个集合元素都可以重复!
set集合有:HashSet集合,其底层结构是哈希表,通过哈希值将对象存储到可扩容的数组中。
TreeSet集合,其底层结构是红黑树,通过比较器两种方法对元素按照红黑规则排序。
这两个集合不能重复!

Map双列集合:
HashMap集合,底层是哈希表结构的,依赖哈希值方法和equals方法保证健的唯一。
TreeMap集合,底层是红黑树,存储需要排序,对键进行排序,Compareble接口!
还有一个Properties接口,也是双列集合,方法和IO流配合使用!

7 线程和进程有什么区别?

线程和进程是多线程里面的概念。
进程是指,正在运行的程序。
线程是指,正在运行程序的执行单元。
可以说进程包含着线程,一个进程里面可以包含多个线程。

8 final、finally、finalize区别,怎么使用?

final是一个关键字,是最终的意思。在java中它可以用来修饰:方法,类,和变量(成员变量和局部变量)

1,修饰类
当final用来修饰类的时候,这个类不能被其他类所继承。
2, 修饰方法
当用final用来修饰方法的时候,表明这个方法不能被重写,只能用来使用。
3, 修饰变量

1,final修饰局部变量的时候,一旦赋值就不能二次改变。
1.1 修饰基本数据类型的时候,表示该基本类型的值一旦在初始化后便不能发生变化。
1.2 修饰引用类型时,则在其初始化后就不能在指向其它对象了,但该引用所指的对象的内容是可以发生变化的。话句话说,就是被final修饰的引用类型,其地址值指向一个地址,不会发生变化。

2, final修饰成员变量时,一旦赋值不能更改
修饰实例变量
1 直接赋值
2 构造方法赋值
3 构造代码块赋值
修饰静态变量
final修饰静态变量,就变成一个静态常量。
1 直接赋值
2 静态代码块赋值

finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。

finalize是Object类的一个方法,在垃圾回收器执行的时候会被调用。可以重写此方法,提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用时则代表该对象即将“死亡”,但需要注意的是,我们主动行为上去调用该方法不会导致对象“死亡”,这是一个被动的方法,不需要我们调用。

9 Java中基本数据类型各占多少字节?

整数类型
byte,1字节,-128~127【 (-2)的7次方 ~ (2的7次方) - 1】,0,Byte
short,2字节,-32768~32767 【(-2)的15次方 ~ (2的15次方) - 1】,0,Short
int,4字节,-2147483648~2147483647 【 (-2)的31次方 ~ (2的31次方) - 1】,0,Integer
long,8字节,(-2)的63次方 ~ (2的63次方) - 1,0,Long
浮点类型
float,4字节(,-3.4e+38 ~ 3.4e+38,0.0f,Float ;float 类型的数值有一个后缀 F(例如:3.14F)
double,8字节,-1.7e+308 ~ 1.7e+308,0,Double;没有后缀 F 的浮点数值(例如:3.14)默认为 double
字符型
char,2字节,u0000~uFFFF(‘’~‘?’),‘0’,Character;(0~216-1(65535))
Java中,只要是字符,不管是数字还是英文还是汉字,都占两个字节。
布尔型
boolean,1字节,true false,FALSE,Boolean

10 error 和 exception 的区别是什么

image.png
Error 和 Exception 都是Throwable的子类, 在java中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本类型.

1,Exception 和 Error体现了java平台设计者对不同异常情况的分类, Exception是程序正常运行中,可以预料的意外情况,可以被捕获,进行相应的处理.
2.Error 是指正常情况下,不大可能出现的情况,绝大部分的Error 都会导致程序处于非正常的,不可恢复的状态, 不需要捕获, 常见的OutOfMemoryError 是Error的子类.
3.Exception 分为可检查异常(checked) 和 不可检查异常(unchecked).可检查异常在源代码里必须显式的进行捕获处理,这是编译期检查的一部分,不可检查异常是指运行时异常, 比如NullPointerException, ArrayIndexOutOfBoundsException之类, 通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求.

11 创建一个 java.lang.String 对象,这个对象是否可以被类加载器加载?为什么?

image.png
答案是否定的。
因加载某个类时,优先使用父类加载器加载需要使用的类。如果我们自定义了java.lang.String这个类, 加载该自定义的String类,该自定义String类使用的加载器是AppClassLoader,根据优先使用父类加载器原理, AppClassLoader加载器的父类为ExtClassLoader,所以这时加载String使用的类加载器是ExtClassLoader, 但是类加载器ExtClassLoader在jre/lib/ext目录下没有找到String.class类。然后使用ExtClassLoader父类的加载器BootStrap, 父类加载器BootStrap在JRE/lib目录的rt.jar找到了String.class,将其加载到内存中。这就是类加载器的委托机制。

12 列出运行异常

1,Object x = new Integer(0);
System.out.println((String)x);
当试图将对象强制转换为不是实例的子类时,抛出该异常(ClassCastException)
2,int a=5/0;
一个整数“除以零”时,抛出ArithmeticException异常。3,
String s=null;
int size=s.size();
当应用程序试图在需要对象的地方使用 null 时,抛出NullPointerException异常
4,”hello”.indexOf(-1);
指示索引或者为负,或者超出字符串的大小,抛出StringIndexOutOfBoundsException异常

13 Java 语言中泛型主要是为了解决什么问题?

泛型 ,顾名思义就是 广泛的数据类型,也就是说什么数据类型都可以。
在java早期版本中,在集合中存储对象并在使用前进行类型转换是多么的不方便。
即如果数据类型不确定,可以使用泛型方法的方式,达到简化代码、提高代码重用性的目的。

14 两个不同的对象会不会有相同的 hashcode?请举例说明?

会有相同的hashcode;
对象相等则hashCode一定相等;
hashCode相等对象未必相等
3)hashCode是所有java对象的固有方法,如果不重载的话, 返回的实际上是该对象在jvm的堆上的内存地址,而不同对象的内存地址肯定不同,所以这个hashCode也就肯定不同了。 如果重载了的话,由于采用的算法的问题,有可能导致两个不同对象的hashCode相同

15 Java 中的 IO 流大概可以分为哪几种?

(1)按照数据的流向:
输入流、输出流
(2)按照流数据的格式:
字符流、字节流
(3)按照流数据的包装过程:
节点流(低级流)、处理流(高级流)

16 file文件方法

image.png

17 集合使用场景

ArrayList与LinkedList的区别和适用场景
ArrayList底层是数组,LinkedList底层是链表。所以arrayList查询块,LinkedList增删块。

ArrayList:查询多,增删少
LinkedList:增删多,查询少
一般情况下LinkedList更占空间

ArrayList(10 1.5)与Vector的区别和适用场景
Vector多线程安全,ArrayList不是。空间不足时,扩容方式不同
不考虑线程安全时,一般使用ArrayList

HashSet与TreeSet的区别和适用场景
TreeSet是二叉树实现,数据是自动排序好的,不允许放入null。HashSet是哈希表实现的,数据无序可以放入null。

Map
map中的集合,元素是成对存在的。每个元素由键与值两部分组成。

18 Array 数组和 ArrayList 线性表的应用区别是什么?

array 固定数组
arrayList动态数组(10 1.5)

19 简单说明 Iterator 迭代器?有什么特点?

它是遍历集合的工具,即我们通常通过Iterator迭代器来遍历集合。
Iterator 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。

20 逻辑运算符区别

&&和&都是表示与,区别是&&只要第一个条件不满足,后面条件就不再判断。而&要对所有的条件都进行判断。
||和|都是表示“或”,区别是||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断。

21 JVM 是怎么加载 .class 文件的

image.png

22 请简单说明 Java 的内存泄漏以及垃圾回收机制

内存泄漏
内存泄漏指由于错误的设计造成程序未能释放已经不再使用的内存,造成资源浪费。GC会自动清理失去引用的对象所占用的内存。但是,由于程序设计错误而导致某些对象始终被引用,那么将会出现内存泄漏。
java垃圾回收机制
在程序的运行时环境中,java虚拟机提供了一个系统级的垃圾回收(GC,Carbage Collection)线程,它负责回收失去引用的对象占用的内存。

23 简单叙述 synchronized 关键字的使用场景

①、修饰一个方法
②、修饰代码块
③、修饰静态方法
④、修饰一个类
总结:

A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。
B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。
C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
D.同步关键字锁的是对象

24 事务的四个特性是什么,以及各有什么特点?

A 原子性 事务对数据的操作,要么成功,要么失败,若失败,数据回到操作之前。
C 一致性 事务对数据的操作,需要和每一个属性一致,才有可能操作成功,
I 隔离性 两个事物去操作数据,互不干扰。如果操作同一个数据,事务B需要等事务A操作完成
D 持久化 数据操作完成,即使服务器宕机,数据不会改变。

25 Java 中获取一个类对象的时候有哪几种方式可以使用

new;Class类的newInstance(new实例);Constructor类的newInstance方法;
使用Clone的方法;使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数

26 说明一下 Java 中你能了解到的设计模式有哪些

Java 中一般认为有23种设计模式,当然暂时不需要所有的都会,但是其中常见的几种设计模式应该去掌握。
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

25 请说明一下你所理解的重写和重载是怎么样的

重载:
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载
重写:
重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。

26 JVM 运行环境可以分为哪些区,每个区的作用是什么

image.png

27 内存溢出和内存泄漏的区别是什么?遇到这种情况应该怎样处理

内存泄漏(Memory Leak):是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。
内存溢出(Memory Overflow):指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出
处理
第一步、修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加)
第二步、检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。
第三步、对代码进行走查和分析,找出可能发生内存溢出的位置。
[

](https://blog.csdn.net/yubujian_l/article/details/81455524)

28 在什么工作场景下会经常遇到序列化和反序列化

序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。这个过程称为序列化。通俗来说就是将数据结构或对象转换成二进制数据流的过程

反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制数据流转换成数据结构或者对象的过程

使用场景:
1.把内存中的对象保存到一个文件中或者数据库中;
2. 网络上传送对象;
3.通过RMI传输对象;(RMI->Remote Method Invocation 远程方法调用)

29 你是怎样理解多态、封装和继承的?

多态指的是对象的多种形态

封装就是把同一类事物的共性(包括属性和方法)归到同一类中,方便使用。

集成 - 多个类具有共同的属性(成员变量)与行为(成员方法)的时候,将这些共同的部分抽取出来定义到一个公共的类中,其他及各类可以与这个公共的类形成继承关系,从而在多个类中不需要重 复定义公共部分!这个公共的类就是父类,也称为超类或者基类,其他的类就是子类。子类可以直接访问父类的非私有化成员变量,访问父类的私有化成员变量可以使用super.get()方法。
[

](https://blog.csdn.net/hellosweet1/article/details/81320384)

30 Vector 和 ArrayList 的区别是什么

image.png
31 HashMap 和 HashTable 的区别是什么
1.HashMap是线程不安全的,效率高,JDK1.2版本
Hashtable是
线程安全的,效率低,JDK1.0版本
2.HashMap可以存储null键和null值
Hashtable不可以存储null键和null值

32 抽象类与接口有什么区别?为什么要使用抽象类

记住最重要的一点,一个是类,一个是接口(废话),然后开始发散

抽象类里的方法可以有具体实现,而接口不能。(即抽象类中的方法不一定全是抽象方法)
一个类只能继承一个抽象类,却可以实现多个接口。
抽象类可以有静态代码块和静态方法,而接口不能。
抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量
子类中实现父类中的抽象方法时,可见性可以大于等于父类中的;而接口实现类中的接口 方法的可见性只能与接口中相同(public)
[

](https://blog.csdn.net/with_luck/article/details/119444335)

33 请说明序列化的意义是什么

序列化就是把内存中的java对象转化成字节文件。
1) 把对象的字节序列永久地保存到硬盘上(通常存放在一个文件中);
2) 在网络上传送对象的字节序列。