1.JDK、JRE、JVM三者之间的关系
JDK是Java开发工具包
JRE是Java运行时环境
如果要开发Java程序要安装jdk,只是运行的话,仅安装JRE即可
JVM时Java虚拟机,jvm屏蔽了操作系统底层的差异,从而实现一次编译,到处运行
JDK包含JRE,JRE包含jvm
2.Java的三大特性(继承、封装、多态 重点说说对多态的理解)
继承:子类继承父类,拥有父类除构造方法之外的其他方法和属性,父类的私有属性和方法不见得可以直接访问
封装:将类信息包括属性和方法隐藏在类内部,不允许直接方法,而是通过特定的方法进行访问。
多态:同一个方法通过不同的对象调用有不同的展示。
多态形成的条件:子类继承父类、方法的重写、父类引用指向子类对象
子类中方法的访问权限大于等于父类
子类抛出的异常小于等于父类
3.八大基本数据类型
byte(-127~128) short int(-231~231 - 1) long float double boolean char
4.说下对类、对象、属性、方法的理解
举个例子:
类时具有相同属性和方法对象的集合
整个人类就可以看作一个类
其中的某个人就可以看作对象,对象时类的具体化
人具有姓名、性别、身高、体重等特性可以看作时属性
方法就是人吃饭、睡觉等动作就可以写成方法
5.成员变量、局部变量、类变量(静态变量)
静态变量从属于类
成员变量从属与对象,类内部方法外部
局部变量在方法或语句块内
6.普通类和抽象类
抽象类不能被实例化
抽象类中可以有抽象方法
抽象类中不一定有抽象方法,但是有抽象方法的一定时抽象类
抽象类不能声明为静态,不能被static、final修饰
7.接口和抽象类
接口和抽象类都不能被实例化
抽象类和接口中的抽象方法都没有方法体
抽象类只能单继承,接口可以多继承
jdk1.8之后接口中可以定义静态方法,静态方法要有方法体
抽象类中的普通方法要有方法题
子类继承抽象类,要实现抽象类中的抽象方法,否则继续为抽象类
8.final、finally、finalize
final 修饰变量为常量,值不能被改变;修饰方法,该方法不能被重写;修饰类,该类不能被继承
finally:抛出异常的时候用到,finally中的无论什么情况都会被执行
finalize:进行垃圾回收,在销毁该对象前,该方法会被自动调用
9.循环结构while do…while(这两个的区别) for(九九乘法口诀)
while 中的条件可能一次也不执行
do…while至少执行一次
public class JiuJiuTest {
public static void main(String[] args) {
for (int i = 1;i<=9;i++){
for(int j = 1;j<=i;j++){
System.out.print(j + "*" + i + "=" + i * j + "\t");
}
System.out.println();
}
}
}
10.分支结构 if…else switch…case(中条件可以为什么类型)
switch…case支持的数据类型byte、short、int、char和他们对应的包装类,jdk1.7之后支持String
11.super和this
this是当前对象的引用,this本质是执行当前对象的指针
super在Java子类中起到父类引用的作用
父类如果重写了无参构造器或者父类中没有有参构造器,那么子类的构造方法第一行就是super(),可以省略
子类重写父类方法后可以通过super来调用父类的变量和方法
12.方法重写和方法重载
方法重载:方法名相同,参数列表相同,返回值相同,方法体中的内容不同
方法重写:方法名相同,参数的类型和个数不同,与返回值没关系
13.克隆(浅拷贝和深拷贝)
克隆:想要将对象复制,又想保留原来的对象
如何实现深克隆:
1.继承Cloneable接口,重写clone方法
2.继承Serializable,通过序列化和反序列来进行克隆
BeanUtils、apache和Spring中的方法都是浅拷贝
深拷贝和浅拷贝的区别:
浅拷贝:仅克隆基本类型变量,不克隆引用类型变量
深拷贝:基本类型变量和引用类型变量都克隆
14.String StringBuffer StringBuilder
String是不可变对象,因为底层被final修饰
StringBuffer和StringBuilder是可变对象,StringBuffer线程安全,方法中被sythronized修饰,StringBuilder线程不安全
StringBuffer可以做同步检查,因此效率低;StringBuilder不做同步检查,效率高
15.初始化数组的方式
动态初始化:int[] arr1 = new int[长度];
静态初始化:int[] arr1 = new int[]{1,2,3}; 可以简化为int[] arr2 = {1,2,3};
16.冒泡排序
public class BlobTest {
public static void main(String[] args) {
//冒泡排序外层循环控制循环的轮数
//内层循环控制每轮比较的次数
int[] arr = new int[]{9,4,3,6,1,7};
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for (int i : arr) {
System.out.println(i);
}
}
}
17.遍历数组的两种方式
for循环
foreach
iterator迭代器
18.常见的异常类
编译时异常 RuntimeException
ArrayIndexOutOfBoundsException
ArithmeticException
NullPointerException
ClassNotFoundException
ClassCastException
NumberFormatException
NoSuchMethodException
IOException包括
IOException
FileNotFoundException
EOFException
Error
NoClassDefFoundError:一个类在编译的时候可以找到,在运行的时候找不到
OutOfBoundsException
19.序列化和反序列化
序列化:将Java对象转化成字节流的过程
反序列化:将字节流转化成Java对象
为什么要用序列化和反序列化
两个进程进行网络通信,可以传输各种类型的数据,例如:视频、文件、音频,但这些东西要以二进制的形式在网络间传输。Java的序列化和反序列化实现对象间的网络传送。
20.泛型说一下
在类定义的时候,不会确定类的属性或方法参数的具体类型,而是在类使用的时候再进行类型的定义
上限通配符:extends 类,必须是后面类的子类
下限通配符:super 类,必须是后面类的父类
21.Java中的反射机制
在程序的运行状态中,对于任意一个类,能够知道其属性和方法;对于任意一个对象,能调用其属性和方法。这种动态获取信息和动态调用对象方法的功能称为Java中的反射机制。
22.Java中的IO流(字节流和字符流)
根据流向的不同,可以分为输入流、输出流。
根据传输单位又分为字节流、字符流
字节流:传输字节、字节数组,存储的是二进制文件
字符流:传输字符、字符数组、字符串
缓存流:BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
23. ==和equals的区别
比较的类型是基本数据类型,==比较的是值;比较的是引用数据类型,比较的是地址
equals不能用于基本数据类型的比较,只能用于引用数据类型,比较的是地址;但是有些Java类重写了equals方法,比较的就是值是否相等。例如:String类
24.八大基本数据类型对应的包装类(包装类的缓存机制)
Byte Short Int Long四种类型的值在[-128,127]之间创建相应类型的缓存机制,Character的范围是[0,127]
以Integer为例,通过自动装箱机制创建对象的时候,判断数值是否在[-128,127]之间,则会去缓存中寻找该值,找到了,不会创建新对象,找不到会创建新对象。因此在缓存范围内的数值,可以通过==来进行判断。
public class Test11 {
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
System.out.println(a==b);//true
Integer c = 129;
Integer d = 129;
System.out.println(c==d);//false
}
}
25.日期(日期格式和字符串互相转化)
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
Date转字符串:sdf.format
字符串转date:sdf.parse
26.Collection和Collections的区别
Collection是接口,Collections是集合的工具类,提供一些方法
27.Arraylist和LinkedList的区别
ArrayList底层是数组,查询快,增删慢
LinkedList底层是链表,查询慢,增删快
28.list和set的区别
list是有序集合,可以存放重复的数据
set是无序集合,不可存放重复的数据
29.集合类中哪些线程安全
Vector、HashTable都会进行同步检查
30.JVM的内存模型
包括 程序计数器、虚拟机栈、本地方法栈 、堆、方法区
31.垃圾回收机制
32.垃圾回收算法
33.类的执行顺序
父类静态代码块
子类静态代码块
父类普通方法
父类构造方法
子类普通方法
子类构造方法
34.&和&&的区别
&是短路与:左边的不正确,右边的不用判断
&&:左右两边都需要判断
35.抽象类一定要有抽象方法吗?有抽象方法一定是抽象类吗?
抽象类不一定有抽象方法;有抽象方法一定是抽象类
36.面向对象和面向过程
面向过程是执行者思维,将问题拆分成小的步骤,依次进行调用
面向对象是创建者思维,通过创建对象,对象具有相应的属性和方法,调用对象来做这件事
面向对象和面向过程是相辅相成的,面向过程离不开面向对象,面向对象也离不开面向过程
37.三种修饰符(public private protected default)
private 本类
default 本类、本包
protected 本类、本包、子类
public 所有都可访问
38.创建线程的两种方式
继承Thread的类,重写run方法;
实现runnable接口,重写run方法
40.继承和实现的区别
继承是将多个类相同的部分抽取出来,可以作为其父类进行继承
实现是多个类方法相同,但是方法体不同,就可定义为接口,来实现这个接口
类是单继承,但可以实现多个接口;接口时多继承
继承使用关键词extends,接口使用关键词implements
实现接口之后,要重写里面的抽象方法;继承之后,想调用哪个方法都可以
继承中可以定义属性、方法、变量和常量;接口中只可定义全局变量和抽象方法
41.break和continue的区别
break跳出整个循环;continue结束本次循环,进行下一次循环
42.Comparator与Comparable有什么区别
他们两个都是接口
实现Comparator接口,重写CompareTo方法
实现Comparator接口,重写Compare方法
43.String s = new String(“jay”); 和 String s1 = “jay”; 的区别
String s = new String(“jay”); 创建了两个变量,一个在字符串常量池,一个在堆内存,堆内存的对象是字符串常量池对象拷贝的副本。
String s1 = “jay”; 直接是字符串常量池中的jay指向了s1变量。因此创建出来的s和s1的地址是不同的
String a1 = “a”; String a2 = “b”; String a3 = a1 + a2; String a4 = “ab”; 请说出a3 和 a4的区别
a3 和 a4的地址是一样的,== 和equals都是相等的
这里的加号相当于StringBuffer.append()方法进行拼接
44.标识符的组成
标识符由字母、数组、下划线、美元符号组成,开头不能是数字
45.键盘输入next 和 nextLine的区别
next遇到空格停止
nextLine遇到回车停止
这两个都是用来接受String类型的
46. 继承和组合
继承可以看作 is a
组合可以看作 has a
47.ArrayList和HashMap HashSet底层源码研究
48.BIO、NIO、AIO 有什么区别
50.File中常用的方法
51.throw和throws的区别
throw用在方法体中,throws用在方法声明上
throw只能抛出一个异常,throws可以抛出多个
throw表示抛出异常,执行力throw就一定出现这个异常;throws表示可能出现的异常,并不一定出现这些异常
throw由方法体来处理异常,throws由方法的调用者来处理异常
52.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
先执行try catch finally,最后返回return中的内容
finally中的内容总是被执行
53.实例化对象的方式
通过new
使用克隆
序列化反序列化
使用反射机制
54.hashcode的作用
55.为什么不能从静态方法中访问非静态变量
静态方法被static修饰,从属于类,类一加载就会运行静态方法,非静态变量属于对象,此时还没有创建对象;因此静态方法不能调用非静态变量。
56.Java中的容器
单列集合Collection接口 双列集合Map
Collection接口下面有list set
list是有序集合,可以存储重复的值
set是无序集合,不可存储重复的值
双列集合中的Map存储的是键值对
57.数组和list之间的转化
数组转list Arrays.asList()
list转数组 list.toArray
58.队列和栈的区别
队列先进先出;栈后进先出
59.线程 run()和start()方法的区别
start()表示运行线程,run()表示执行线程的运行时代码;
start只能调用一次,run可以调用多次
60.sythronized和lock锁
sythronized是一个关键字,lock是一个接口
sythronized可以主动释放锁,lock需要手动上锁、解锁
sythronized无法判断是否获取到锁,lock可以判断是否已经获取到锁
sythronized不能响应中断,lock可以相应中断
sythronized是非公平锁,不能保证等待锁的线程们的顺序;lock默认是非公平锁,但是可以通过布尔参数的构造方法实例化出一个公平锁
sythronized是同步阻塞,采用悲观并发策略;lock是同步非阻塞,采用的是乐观并发策略