推荐使用小程序阅读
为了能让您更加方便的阅读
本文全部的面试题目均已整理至下面的小程序《面试手册》
能够经过微信扫描(或长按)下图的二维码享受更好的阅读体验!java

1. Java 基本概念
1.1 Java源程序的扩展名是什么?
.java面试
1.2 什么是标识符?
在java语言中可以咱们本身起名的都叫标识符正则表达式
1.3 标识符有哪些特色?
标识符是大小写字母、数字字符、$和_组成,不能以数字开头,也不能是java关键字,而且区分大小写算法
1.4 请说明环境变量Path 与 classpath 区别
path是系统用来指定可指定文件的完整路径。Path是用来搜索所执行的可执行文件路径的,若是执行的可执行文件不在当前目录下,那就会依次搜索path中设置的路径。小程序
classpath是指定你在程序中所使用的类(.class)文件所在的位置。数组
1.5 java程序经编译后产生的字节码文件扩展名是什么?
字节码文件扩展名是 .class安全
1.6 请说出经常使用的DOS命令并解释?
- d: 回车
盘符切换
- dir (directory)
列出当前目录下的文件以及文件夹
- cd (change directory)
改变指定目录(进入指定目录)
- cd..
退回到上一层目录
- cd \
退回到跟目录
- md (make directory)
建立目录
- rd (remove directory)
删除目录
- del (delete)
删除文件,删除一堆后缀名同样的文件*.txt
- cls (clear screen)
清屏
- exit
退出dos命令行
1.7 请解释Java语言的跨平台特性?
Java语言是跨平台运行的,其实就是不一样的操做系统,使用不一样的JVM映射规则,让其与操做系统无关,完成了跨平台性。JVM对上层的Java源文件是不关心的,它关注的只是由源文件生成的类文件(class file)。服务器
1.8 请说明JDK、JRE、JVM的区别?
- JDK
Java Development Kit(Java开发工具包)。JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Environment),一堆Java工具(javac/java/javap等)
- JRE
Java Runtime Environment(java运行时环境)。也就是咱们说的JAVA平台。全部的Java程序都要在JRE下才能运行。包括JVM和JAVA核心类库和支持文件。与JDK相比,它不包含开发工具(编译器、调试器和其余工具)。
- JVM
Java Virtual Mechinal(JAVA虚拟机)。JVM是JRE的一部分,它是一个虚构出来的计算机,是经过在实际的计算机上仿真模拟各类计算机功能来实现的。
2. Java 基础
2.1 注释的分类及做用?
- 单行注释
注释单行代码或为单行代码添加描述的时候使用
- 多行注释
注释多行代码或为代码添加多行描述的时候使用
- 文档注释
生产java帮助文档的时候使用,开发中经常使用来描述类、描述方法
2.2 请说出Java中数据类型的分类?基本数据类型都有哪些?
- 基本数据类型
- byte
- short
- int
- long
- float
- double
- char
- boolean
- 引用数据类型
2.3 Java中数据的类型转换有几种?分别是什么?
- 强制类型转换
容量大的类型向容量小的类型转换时使用
- 隐式类型转换
容器小的类型向容量大的类型转换时使用
2.4 Java语言中的字符char能够存储一个中文汉字吗?为何呢?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,因此,char型变量中能够存储汉字。不过,若是某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。
补充说明:unicode编码占用两个字节,因此,char类型的变量也是占用两个字节。微信
2.5 请说明 && 和 & 的区别?
&和&&均可以用做逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,不然,只要有一方为false,则结果为false。网络
&&还具备短路的功能,即若是第一个表达式为false,则再也不计算第二个表达式
&还能够用做位运算符,当&操做符两边的表达式不是boolean类型时,&表示按位与操做。
2.6 请说明 == 与 = 的区别?
- ==
比较运算符,用来比较操做符两边的变量的值是否相等。
- =
赋值运算符,把操做符右边的值,赋值给左边的变量
2.7 三元运算符的基本格式是什么?
三元运算符的格式是: 条件表达式 ? 表达式1 : 表达式2
2.8 三元运算符的执行流程是什么?
三元运算符的执行流程: 首先计算条件表达式的值看其返回结果是true仍是false,若是是true就执行表达式1,若是是false就执行表达式2
2.9 使用键盘录入数据的三个步骤是什么?
- 第一步导包
格式: import java.util.Scanner ;位置: 在class上边
- 第二步建立Scanner对象
格式: Scanner sc = new Scanner(System.in) ;
- 第三步获取键盘录入数据
格式: int x = sc.nextInt() ;
2.10 请说明for、while、do…while三种循环的格式以及执行流程,以及它们的区别。
- for循环语句格式
for(初始化语句;判断条件语句;控制条件语句) {
循环体语句;
}
- 执行初始化语句
- 执行判断条件语句,看其结果是true仍是false,若是是false,循环结束;若是是true,继续执行。
- 执行循环体语句
- 执行控制条件语句
- 回到b继续
while循环语句格式
while(判断条件语句) {
循环体语句;
}
- 执行判断条件语句,看其结果是true仍是false
若是是false,循环结束。
若是是true,继续执行。
- 执行循环体语句
- 回到a继续
do…while循环语句格式
do {
循环体语句;
}while((判断条件语句);
- 执行循环体语句
- 执行判断条件语句,看其结果是true仍是false,若是是false,循环结束;若是是true,继续执行。
- 回到a继续
三种循环语句的区别
- do…while循环至少会执行一次循环体
- for循环和while循环只有在条件成立的时候才会去执行循环体
注意:写程序优先考虑for循环,再考虑while循环,最后考虑do…while循环
2.11 定义一个方法的格式是什么,以及方法的注意事项?
- 格式
修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2 ….){
方法体 ;
return 返回值 ;
}
- 注意事项
A. 方法不调用不执行
B. 方法与方法是平级关系,不能嵌套定义
C. 方法定义的时候参数之间用逗号隔开
D. 方法调用的时候不用在传递数据类型
E. 若是方法有明确的返回值,必定要有return带回一个值
2.12 private 关键字在哪里使用? 被 private 修饰的成员有什么特色?
类中的成员须要私有的时候使用private关键字
特色:
是一个权限修饰符。
能够修饰成员(成员变量和成员方法)
被private修饰的成员只在本类中才能访问
2.13 为何要有 this 关键字?this 关键字的含义?
this用来解决成员变量与局部变量重名问题
this关键字表明的是本类对象引用;谁调用我,this就表明谁.
2.14 final 关键字是什么意思,能够修饰那些成员?被修饰的成员有哪些特色?
final最终的意思。
可修饰
特色
- final修饰类,此类不能被继承。
- final修饰变量,变量就成了常量,只能被赋值一次
- final修饰方法,方法不能被重写
2.15 形式参数是基本类型要的是什么?是类名、抽象类名、接口名时分别要的是什么?
形式参数是基本类型要的是一个基本类型的变量或者具体的常量值
- 类名时
要的是一个该类的对象
- 抽象类名时
要的是一个继承自该类的一个子类对象
- 接口时
要的是一个实现了该接口的子类对象
2.16 返回值类型是基本类型返回的是什么?是类名、抽象类名、接口名分别返回的是什么?
返回值是基本数据类型的时候返回的是一个具体的值
- 类名时
本质上返回的是一个该类对应的子类对象
- 抽象类名时
返回的应该是一个继承自该类的子类对象
- 接口名的时
返回的是一个实现了该接口的子类对象
2.17 package它有什么做用?
package,包的意思,其实就是文件夹,它能够对类进行分类管理
2.18 import的做用?
在不一样包下的类之间相互访问的时候,发现,每次使用不一样包下的类的时候,都须要加包的全路径。比较麻烦,这个时候,java就提供了( import )导包的功能。
使用import能够将包中的类导入进来,之后使用类的时候,不需导包,直接使用,简化了书写。
2.19 请解释 ==与equals()方法的区别?
== 解读
对于基本类型和引用类型 == 的做用效果是不一样的,以下所示:
- 基本类型:比较的是值是否相同;
- 引用类型:比较的是引用是否相同;
代码示例:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
代码解读:由于 x 和 y 指向的是同一个引用,因此 == 也是 true,而 new String()方法则重写开辟了内存空间,因此 == 结果为 false,而 equals 比较的一直是值,因此结果都为 true。
equals 解读
equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。
首先来看默认状况下 equals 比较一个有相同值的对象,代码以下:
class Cat {
public Cat(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat c1 = new Cat("mbb");
Cat c2 = new Cat("mbb");
System.out.println(c1.equals(c2)); // false
输出结果出乎咱们的意料,居然是 false?这是怎么回事,看了 equals 源码就知道了,源码以下:
public boolean equals(Object obj) {
return (this == obj);
}
原来 equals 本质上就是 ==。
那问题来了,两个相同值的 String 对象,为何返回的是 true?代码以下:
String s1 = new String("mbb");
String s2 = new String("mbb");
System.out.println(s1.equals(s2)); // true
一样的,当咱们进入 String 的 equals 方法,找到了答案,代码以下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
原来是 String 重写了 Object 的 equals 方法,把引用比较改为了值比较。
总结 :== 对于基本类型来讲是值比较,对于引用类型来讲是比较的是引用;而 equals 默认状况下是引用比较,只是不少类从新了 equals 方法,好比 String、Integer 等把它变成了值比较,因此通常状况下 equals 比较的是值是否相等。
2.20 请简述泛型是什么?有什么用?在哪里用?
- 泛型是什么?
泛型是一种特殊的类型,它把指定类型的工做推迟到客户端代码声明并实例化类或方法的使用进行。也被称为参数化类型,能够把类型当作参数同样传递过来,在传递过来以前我不明确,可是在使用的时候就就明确了。
- 泛型的好处
- 提升了程序的安全性
- 将运行期遇到的问题转移到了编译期
- 省去了类型强转的麻烦
- 泛型的常见应用
2.21 如何编写一个泛型方法,让它可以接受泛型参数并返回泛型类型?并举例
泛型方法,指把泛型定义在方法上,使用泛型类型来替代原始类型
public static T[] sort(T[] t){
Arrays.sort(t);
return t;
}
2.22 请简述Java中如何使用泛型编写带有参数的类?并举例
泛型类,指把泛型定义在类上,使用泛型类型来替代原始类型
class GenericClass {
private T t;
public void setT(T t) {
this.t = t;
}
public T getT() {
return t;
}
}
2.23 请说说文件名称过滤器FilenameFilter的做用?
FilenameFilter是文件名过滤器,用来过滤不符合规则的文件名,并返回合格的文件。
2.24 请简述递归是什么?注意事项是什么?
所谓递归,是指程序调用自身。
注意,递归不会无休止地调用下去,它必然有一个出口,当知足条件时程序也就结束了,否则的话,那就是死循环了。
2.25 两个对象的 hashCode() 相同,则 equals() 也必定为 true,对吗?
不对,两个对象的 hashCode() 相同,equals() 不必定 true。
代码示例:
String str1 = "通话";
String str2 = "重地";
System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));
执行的结果:
str1:1179395 | str2:1179395
false
代码解读:很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,由于在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不必定能得出键值对相等。
2.26 Java 中的 Math. round(-1. 5) 等于多少?
等于 -1,由于在数轴上取值时,中间值(0.5)向右取整,因此正 0.5 是往上取整,负 0.5 是直接舍弃。
3. Java 变量
3.1 请写出Java标识符的命名规则
- 包
所有小写
- 单层包
小写,举例:itcast,com
- 多层包
小写,并用 . 隔开,举例:cn.itcast, com.baidu
- 类或者接口:
- 一个单词
首字母大写,举例:Student,Demo
- 多个单词
每一个单词首字母大写,举例:HelloWorld,StudentName
- 方法或者变量:
- 一个单词
首字母小写,举例:name,main
- 多个单词
从第二个单词开始,每一个单词首字母大写,举例:studentAge,showStudentNames()
- 常量
所有大写
- 一个单词
大写,举例:PI
- 多个单词
大写,并用 _ 隔开,举例:STUDENT_MAX_AGE
3.2 变量是什么?
变量,在程序运行时,值能够被修改的量。
3.3 变量的定义格式是什么?
数据类型 变量名 = 变量值
3.4 成员变量与局部变量的区别?
在类中的位置不一样
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
在内存中的位置不一样
成员变量:在堆内存
局部变量:在栈内存
生命周期不一样
成员变量:随着对象的建立而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
初始化值不一样
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,而后才能使用。
3.5 静态变量与成员变量的区别?
所属不一样
静态变量属于类,因此也称为为类变量
成员变量属于对象,因此也称为实例变量(对象变量)
内存中位置不一样
静态变量存储于方法区的静态区
成员变量存储于堆内存
内存出现时间不一样
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的建立而存在,随着对象的消失而消失
调用不一样
静态变量能够经过类名调用,也能够经过对象调用
成员变量只能经过对象名调用
4. Java String
4.1 String s = “a”+“b”+”c”; 建立了多少对象,分别是什么?
由于字符串的特色是一旦被建立就不能被改变,全部在使用常量进行相加的时候,都是在建立新的字符串对象,最后在把字符串"abc"这个常量值赋值给引用变量s
4.2 如何实现StringBuffer和String的相互转换?
- 经过String类的构造方法
- 经过StringBuffer类中的toString()方法
- 经过StringBuffer类中的substring()方法 (注:不经常使用)
String 转换到 StringBuffer的方式:
- 经过StringBuffer类的构造方法
- 经过StringBuffer类的append()、insert()方法
4.3 如何实现String和int数据的相互转换
- String – Integer – int经过Integer类的intValue()方法
- 经过Integer类的parseInt(String s)方法
Int 转换到 String的方式:
- Int – Integer – String Integer的toSting()
- 经过String类的valueOf()方法
- 经过Integer类的toSting(int i)方法
- 经过与字符串""相链接
4.4 如何实现【基本数据类型】与【基本数据封装类】之间的相互转换
- 经过包装类的构造方法
- 经过包装类的静态方法valueOf()
包装类 转换到 基本数据类型的方式:
- 经过包装类的方法xxxValue()
4.5 请说明String与StringBuffer两者之间的区别?
String类表示内容不能够改变的字符串
StringBuffer类表示内容能够被修改的字符串
4.6 请说明StringBuffer与StringBilder两者之间的区别?
4.7 什么是正则表达式?
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在不少文本编辑器里,正则达表示一般被用来检索、替换那些符合某个模式的文本。
4.8 如何实现Date与long相互转换?
- Date 转 long
经过Date类的getTime()方法
- long 转 Date
经过Date类的构造方法
4.9 如何实现Date与String相互转换?
Date 转 String
- Date类的toString()方法
- DateFormat类的format()方法
String 转 Date
Date类的构造方法
已过期,被DateFormat类的parse(String s)方法取代
DateFormat类的parse()方法
4.10 String 属于基础的数据类型吗?
String 不属于基础类型
基础类型有 8 种:
- byte
- boolean
- char
- short
- int
- float
- long
- double
而 String 属于对象
4.11 String str=“i” 与 String str=new String(“i”)同样吗?
不同,由于内存的分配方式不同。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
4.12 如何将字符串反转?
使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。
示例代码:
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System. out. println(stringBuilder.reverse()); // gfedcba
4.13 String 类的经常使用方法都有那些?
- indexOf():返回指定字符的索引。
- charAt():返回指定索引处的字符。
- replace():字符串替换。
- trim():去除字符串两端空白。
- split():分割字符串,返回一个分割后的字符串数组。
- getBytes():返回字符串的 byte 类型数组。
- length():返回字符串长度。
- toLowerCase():将字符串转成小写字母。
- toUpperCase():将字符串转成大写字符。
- substring():截取字符串。
- equals():字符串比较。
5. Java 类、抽象类、接口、内部类、代码块
5.1 类是什么? 对象是什么?举例说明
是一组相关属性和行为的集合是一个抽象的东西,对象则是该类的一个具体的体现。
举例: 学生就是一个类,而后每个学生都是学生的一个个具体的体现,因此每个学生就是一个学生。
5.2 类由哪些内容组成?
类由成员变量和成员方法组成
成员变量对应的就是事物的属性(就是事物固有的信息,好比: 人的属性有身高 , 姓名 , 年龄 , 学历…) , 成员方法对应的是行为(行为: 就是该事物能够作的事情,好比:人的行为有: 吃饭,睡觉…)
5.3 什么是匿名对象?何时使用匿名对象?
匿名对象指:没有起名字的对象
使用匿名对象:
a:调用方法,仅仅只调用一次的时候
b:匿名对象能够做为实际参数传递
5.4 构造方法的做用是什么?构造方法的特色是什么?构造方法的注意事项? 构造方法中可不能够写return 语句呢?
构造方法的做用是用于给类的成员变量赋值,完成类的初始化工做
5.5 一个类的缺省构造方法能够有参数吗?
一个类的缺省构造方法没有参数
5.6 请说明一个对象的建立过程作了哪些事情?
Student s = new Student();
- 将Student.class 字节码文件加载到内存
- 在栈内存中,开辟一个空间存储 s变量,用来记录Student对象的引用
- 在堆内存中,开辟一个空间存储 new Student()对象的成员信息
- 加载类中静态成员
- 执行类中静态代码块
- 加载对象中普通成员
- 执行构造代码块
- 执行构造方法
- 将new Student()的地址赋值给 s 变量
5.7 子父类中构造方法的执行有什么特色?为何要这样?
- 子类有全部的构造方法默认都会访问父类中空参数的构造方法。
由于子类会继承父类中的数据,可能还会使用父类的数据。因此,子类初始化以前,必定要先完成父类数据的初始化。
每个构造方法的第一条语句默认都是:super()
- 若是父类中没有空参数的构造方法,经过下列方式解决
- 子类经过super去显示调用父类其余的带参的构造方法
- 子类经过this去调用本类的其余构造方法(本类其余构造也必须首先能够访问了父类构造)
注意:super(…)或者this(…)必须出如今第一条语句上,不然,就会有父类数据的屡次初始化
5.8 静态代码块,构造代码块,构造方法的执行顺序是什么以及执行特色?
- 先执行全部的静态代码块,再执行全部的构造代码块,最后执行构造方法
- 静态代码块只执行一次, 构造代码块和构造方法,每建立一次对象就执行一次
5.9 抽象类是什么,抽象类的特色?
5.10 抽象类中有没有构造方法,若是有它是用来作什么的?
抽象类虽然不能进行实例化,可是抽象类中是存在构造方法,该构造方法的做用是用于子类访问父类数据时的初始化.
5.11 接口中成员变量的特色,以及成员方法的特色?
接口中的成员变量都是常量,存在默认的访问修饰符:
public static final
接口中的成员方法都是抽象方法,存在默认的访问修饰符:
public abstract
5.12 请说出类与类,类与接口,以及接口与接口的关系以及特色?
- 类与类
是继承的关系,只支持单继承,能够是多层继承。
- 类与接口
是实现的关系,能够是多实现
- 特色
- 一个类能够继承一个类的同时,还能够实现多个接口
- 接口与接口是继承的关系,能够是单继承也能够是多继承
5.13 抽象类和接口的区别?
成员区别
- 抽象类
- 构造方法
有
- 成员方法
能够抽象,也能够非抽象
- 接口:
关系区别
- 类与类
继承,单继承
- 类与接口
实现,单实现,多实现
- 接口与接口
继承,单继承,多继承
设计理念区别
- 抽象类
被继承体现的是:“is a”的关系。 抽象类中定义的是该继承体系的共性功能。
- 接口
被实现体现的是:“like a”的关系。 接口中定义的是该继承体系的扩展功能。
5.14 内部类有哪些访问特色?
- 内部类能够直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须先建立内部类对象
5.15 匿名内部类的格式是什么?其本质是什么?
- 匿名内部类的格式
new 类名或者接口名() {
方法重写 ;
} ;
- 本质
匿名内部类本质是一个继承了某一个类或者实现了某一个接口的子类对象
5.16 抽象类必需要有抽象方法吗?
不须要,抽象类不必定非要有抽象方法。
示例代码:
abstract class Cat {
public static void sayHi() {
System.out.println("hi~");
}
}
上面代码,抽象类并无抽象方法但彻底能够正常运行。
5.17 抽象类能使用 final 修饰吗?
不能,定义抽象类就是让其余类继承的,若是定义为 final 该类就不能被继承,这样彼此就会产生矛盾,因此 final 不能修饰抽象类
6. 封装、继承、多态
6.1 请解释什么是方法的重载?
方法重载指在同一个类中,容许存在一个以上的同名方法,只要它们的参数个数或者参数类型不一样便可。
方法重载特色:
a) 与返回值类型无关,只看方法名和参数列表
b) 在调用时,虚拟机经过参数列表的不一样来区分同名方法
6.2 使用面向对象【封装】的好处有哪些?
隐藏实现细节,提供公共的访问方式;
提升了代码的复用性;
提升安全性。
6.3 Java 中的类的继承特色是什么以及继承的注意事项?
继承的特色: 在java语言中类的继承只支持单继承,不支持多继承.可是能够多层继承。
继承的注意事项:
- 子类只能继承父类非私有的成员
- 子类不能继承父类的构造方法,可是能够经过super去访问父类的构造方法
- 不要为了某个功能去使用继承
6.4 继承的好处是什么?
- 提升了代码的维护型
- 提供了代码的复用性
- 让类与类之间产生了关系, 是多态的前提
6.5 this 和 super 分别是什么,他们各自的应用场景是什么?
this
表明的是本类对象的引用 , 谁调用我这个方法,这个方法里边的this就表明谁。通常的使用场景是,当局部变量隐藏了成员变量的时候,咱们可使用this去明确指定要访问的是成员变量
super
表明的是父类存储空间的一个标志(能够理解为父类对象的引用),咱们可使用super来访问父类的成员
6.6 什么是方法重写?须要注意哪些问题?
方法重写:指子类中出现了和父类中如出一辙的方法声明,也被称为方法覆盖,方法复写
须要注意的问题:
1. 父类中私有方法不能被重写
2. 子类重写父类方法时,访问权限不能更低
3. 父类静态方法,子类也必须经过静态方法进行重写。(其实这个算不上方法重写,可是现象确实如此)
6.7 方法重写和重载有什么区别?
- 重载Overload
表示同一个类中能够有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不一样),与返回值类型无关。
- 重写Override
发生在子父类中的一个现象, 子类中出现了和父类中如出一辙的方法,与返回值有关.
6.8 什么是多态,多态的前提是什么?
一种事物在不一样时刻表现出来的状态就是多态
多态的前提:
- 须要有继承
- 须要有方法重写(其实没有也是能够的,可是没有意义),不一样状态的表现就是就是靠方法重写体现的
- 须要有父类的引用指向子类对象:Fu f = new 子类()
6.9 多态中成员(成员变量,成员方法,静态成员方法)的访问特色是什么?
访问成员变量
编译看左边 , 运行看左边
由于成员变量其实就是属性,属性就是只该事物的描述信息,因此使用父类在访问的时候,访问的就是父类的成员变量
成员方法
编译看左边,运行看右边
这个是多态的本质,存在动态绑定的机制
静态成员方法
编译看左边,运行看左边
因此说静态算不上重写
6.10 多态的好处?
- 提供了代码的维护性(经过继承保证)
- 提供了代码的扩展性(经过多态保证),这个特色也体现了多态的最多见的应用,做为参数传递.
6.11 多态的弊端是什么,若是咱们想访问子类的特有的功能咱们应该怎么办?
多态的弊端,不能访问子类中特有的功能
若是咱们还想使用子类中特有的功能,咱们须要使用向下转型
向下转型: 就是将父类的引用强制转换成子类的引用,在向下转型的过程当中须要注意一个异常: ClassCastException
7. Java 容器
7.1 数组有几种建立的方式?分别是什么?
2种。动态建立和静态建立。
7.2 请简述集合和数组的异同点?
集合:
- 能够存储不一样类型的元素(一般使用存储一种类型元素)
- 集合的长度能够改变
数组:
7.3 迭代器Iterator是什么?怎么使用?有什么特色?
Iterator 接口提供遍历任何 Collection 的接口。咱们能够从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器容许调用者在迭代过程当中移除元素。
Iterator 使用代码以下:
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()){
String obj = it.next();
System.out.println(obj);
}
Iterator的特色是更加安全,由于它能够确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。
7.4 请简述常见的数据结构有哪些?
7.5 请简述ArrayList、Vector、LinkedList三者的特色?
ArrayList
底层数组结构
Vector
底层数组结构
LinkedList
底层链表结构
7.6 请简述ArrayList、Vector、LinkedList,分别在何时使用?
线程安全
Vector
非线程安全
- 查找多
ArrayList
- 增删多
LinkedList
7.7 请简述并发修改异常产生的缘由?如何解决?
异常
ConcurrentModificationException
在迭代器迭代的过程当中,集合中的元素个数发生了改变,此时致使并发修改异常。
解决方式
- 经过列表迭代器自带的方法完成元素增删操做。
- 经过for循环遍历集合,使用集合中的方法完成元素增删操做。
7.8 请简述List<? extends T>和List<? super T>之间有什么区别?
- List<? extends T>
向下限制
? extends T : 表明接收的泛型类型为T类型或T子类类型
- List<? super T>
向上限制
? super T :表明接收的泛型类型为T类型或T父类类型
7.9 请简述Set集合的特色?
- 不能存储重复元素;
- 元素是按照某种排序规则存储的
7.10 请简述HashSet是如何保证元素惟一性的?
HashSet集合中存储的元素,经过重写hashCode() 与 equals()方法来保证元素惟一性
7.11 请简述TreeSet是如何保证元素惟一性与排序的?
- 实现天然排序接口 Comparable,重写 compareTo(T t)方法
- 实现比较器排序接口 Comparator,重写 compare(T t1, T t2)方法
7.12 请说明Map接口和Collection接口的区别
Map接口是双列集合顶层接口,每一个位置存储一对元素(key, value)
Collection接口是单列集合顶层接口,每一个位置存储一个元素
7.13 请说出Map集合的遍历方式
- 键找值
- 键值对对象,找键,找值
7.14 请说明HashMap和Hashtable的区别
- HashMap
- 线程不一样步
- 效率高
- 能够存储null键null值
- Hashtable
- 线程同步
- 数据安全
- 不能够存储null键null值
7.15 请解释Collection与Collections的区别
- Collection
单列集合的顶层接口,包含集合中经常使用的方法。
- Collections
集合工具类,包含获取集合最大元素值、集合排序等方法。
7.16 Java 容器都有哪些?
Java 容器分为 Collection 和 Map 两大类,其下又有不少子类,以下所示:
- Collection
- List
- ArrayList
- LinkedList
- Vector
- Stack
- Set
- HashSet
- LinkedHashSet
- TreeSet
- Map
- HashMap
- LinkedHashMap
- TreeMap
- ConcurrentHashMap
- Hashtable
7.17 List、Set、Map 之间的区别是什么?
List、Set、Map 的区别主要体如今两个方面:元素是否有序、是否容许元素重复。
三者之间的区别,以下表:

7.18 如何决定使用 HashMap 仍是 TreeMap?
对于在 Map 中插入、删除、定位一个元素这类操做,HashMap 是最好的选择,由于相对而言 HashMap 的插入会更快,但若是你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。
7.19 说一下 HashMap 的实现原理?
HashMap 基于 Hash 算法实现的,咱们经过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,咱们称之为 hash 冲突,HashMap 的作法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表不然使用红黑树。
7.20 说一下 HashSet 的实现原理?
HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存全部元素,所以 HashSet 的实现比较简单,相关 HashSet 的操做,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不容许重复的值。
7.21 如何实现数组和 List 之间的转换?
数组转 List
使用 Arrays.asList(array) 进行转换。
List 转数组
使用 List 自带的 toArray() 方法。
代码示例:
// list to array
List<String> list = new ArrayList<String>();
list.add("这个");
list.add("小程序");
list.add("很赞");
list.toArray();
// array to list
String[] array = new String[]{"这个","小程序","很赞"};
Arrays.asList(array);
7.22 Array 和 ArrayList 有何区别?
- Array 能够存储基本数据类型和对象,ArrayList 只能存储对象。
- Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。
- Array 内置方法没有 ArrayList 多,好比 addAll、removeAll、iteration 等方法只有 ArrayList 有。
7.23 在 Queue 中 poll()和 remove()有什么区别?
相同点:都是返回第一个元素,并在队列中删除返回的对象。
不一样点:若是没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。
代码示例:
Queue<String> queue = new LinkedList<String>();
queue.offer("string"); // add
System.out.println(queue.poll());
System.out.println(queue.remove());
System.out.println(queue.size());
7.24 Iterator 和 ListIterator 有什么区别?
- Iterator 能够遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。
- Iterator 只能单向遍历,而 ListIterator 能够双向遍历(向前/后遍历)。
- ListIterator 从 Iterator 接口继承,而后添加了一些额外的功能,好比添加一个元素、替换一个元素、获取前面或后面元素的索引位置。
7.25 怎么确保一个集合不能被修改?
可使用 Collections.unmodifiableCollection(Collection c) 方法来建立一个只读集合,这样改变集合的任何操做都会抛出 Java. lang. UnsupportedOperationException 异常。
示例代码以下:
List<String> list = new ArrayList<>();
list. add("x");
Collection<String> clist = Collections.unmodifiableCollection(list);
clist.add("y"); // 运行时此行报错
System.out.println(list.size());
8. Java 异常
8.1 请说说什么是异常?异常的分类?
什么是异常?
Java异常是java提供的用于处理程序中错误的一种机制。
所谓错误是指在程序运行的过程当中发生的一些异常事件(如:除0错误,数组下标越界,所要读取的文件不存在)。设计良好地程序应该在程序异常发生时提供处理这些错误的方法,使得程序不会由于异常的发送而阻断或产生不可预见的结果。
Java程序的执行过程当中如出现异常事件,能够生成一个异常类对象,该异常对象封装了异常事件的信息,并将被提交给java运行时系统,这个过程称为抛出异常。
当java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交其处理,这一过程称为捕获异常。
异常的分类
- Exception
全部异常类的父类,其子类对应了各类各样的可能出现的异常事件,通常须要用户显示的声明或捕获。
- Error
称为错误,由java虚拟机生成并抛出,包括动态连接失败,虚拟机错误等,程序对其不作处理。
- Runtime Exception
一类特殊的异常,如被0除、数组下标超范围等,其产生比较频繁,处理麻烦,若是显示的声明或捕获将会对程序可读性和运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序(用户可没必要对其处理)。
8.2 请说出异常处理的方式?
8.3 请说说编译期异常和运行期异常的区别?
- 编译时异常
程序正确,但由于外在的环境条件不知足引起。对商用软件系统,程序开发者必须考虑并处理这类异常。Java编译器强制要求处理这类异常,若是不捕获这类异常,程序将不能被编译。
- 运行期异常
这意味着程序存在bug,如数组越界,0被除,传入参数不知足规则等,这类异常须要更改程序来避免,java编译器强制要求处理这类异常。
- 错误
通常不多见,也很难经过程序解决。它可能源于程序的bug,但通常更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而由运行环境处理。
8.4 请说说throws与throw的区别?
- throws
一般被应用在声明方法时,用来指定可能抛出的异常。多个异常可使用逗号隔开。当在主函数中调用该方法时,若是发生异常,就会将异常抛给指定异常对象。
- throw
一般用在方法体中,而且抛出一个异常对象。程序在执行到throw语句时当即中止,它后面的语句都不执行。一般throw抛出异常后,若是想在上一级代码中捕获并处理异常,则须要在抛出异常的方法中使用throws关键字在方法声明中指定要抛出的异常;若是要捕获throw抛出的异常,则必须使用try{}catch{}语句。
8.5 请说说final、finally与finalize的区别?
- final
用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型。
- finally
是异常处理语句结构的一部分,表示老是执行。
- finalize
是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,能够覆盖此方法提升垃圾收集时的其余资源回收,例如关闭文件等。JVM不保证此方法总被调用。
8.6 请说说异常的注意事项及如何使用异常处理?
- 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
- 若是父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常。
- 若是被重写的方法没有异常抛出,那么子类的方法绝对不能够抛出异常,若是子类方法内有异常发生,那么子类只能try…catch,不能throws
8.7 请说出最多见到的RuntimeException异常
- NullPointerException
空指针引用异常
- ClassCastException
类型强制转换异常
- IllegalArgumentException
传递非法参数异常
- ArithmeticException
算术运算异常
- ArrayStoreException
向数组中存放与声明类型不兼容对象异常
- IndexOutOfBoundsException
下标越界异常
- NumberFormatException
数字格式异常
8.8 请简述IO流的分类
- 字节流
- 字节输入流 InputStream
- 字节输出流 OutputStream
- 字符流
- 字符输入流 Reader
- 字符输出流 Writer
9. Java IO
9.1 请简述字符编码是什么?请说出常见字符编码表?
- 字符编码是什么?
字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象,以便文本在计算机中存储和经过通讯网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其余符号编号,并用7比特的二进制来表示这个整数。一般会额外使用一个扩充的比特,以便以1个字节的方式存储。
- 常见的字符编码表以下
- ASCII
- GB2312
是一个简体中文字符集,由6763个经常使用汉字和682个全角的非汉字字符组成。
- GBK
GBK编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库
- GB18030
是在GBK基础上增长了一部分汉字
Big5:在台湾、香港与澳门地区,使用的是繁体中文字符集
- Unicode
将世界上全部的符号都归入其中,不管是英文、日文、仍是中文等,你们都使用这个编码表,这样就利于同一的管理,在这个编码表中每个字符占两个字节
- UTF-8
为了提升Unicode的编码效率,因而就出现了UTF-8编码。UTF-8能够根据不一样的符号自动选择编码的长短。好比英文字母能够只用1个字节就够了。
9.2 请说出学习过的IO流中的经常使用方法?
- 字节输入流 InputStream
- read()
读取一个字节
- read(byte[])
读取一个字节数组
- 字节输出流
- write(int)
写入一个字节
- write(byte[])
写入一个字节数组
- 字符输入流
- read()
读取一个字符
- read(char[])
读取一个字符数组
- 字符缓冲输入流
- 字符输出流
- write(int)
写入一个字符
- write(char[])
写入一个字符数组
- write(String)
写入一个字符串
- 字符缓冲输出流
9.3 请说出转换流OutputStreamWriter与InputStreamReader 的做用?
- OutputStreamWriter
使用编码表对字节流的数据进行编码
- InputStreamReader
使用编码表对字节流中的数据进行解码
9.4 请简述打印流(PrintStream、PrintWriter)的特色?
- PrintStream的特色
在OutputStream基础之上提供了加强的功能,便可以方便地输出各类类型的数据(而不只限于byte类型)的格式化表示形式。PrintStream的方法从不抛出IOException
- PrintWriter的特色
提供了PrintStream的全部打印方法,其方法也从不抛出IOException。
- 区别
做为处理流使用时,PrintStream只能封装OutputStream类型的字节流,而PrintWriter既能够封装OutputStream类型的字节流,还可以封装Writer类型的字符输出流并加强其功能。
9.5 BIO、NIO、AIO 有什么区别?
- BIO
Block IO 同步阻塞式 IO,就是咱们日常使用的传统 IO,它的特色是模式简单使用方便,并发处理能力低。
- NIO
New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端经过 Channel(通道)通信,实现了多路复用。
- AIO
Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操做基于事件和回调机制。
9.6 Files的经常使用方法都有哪些?
- Files.exists():检测文件路径是否存在。
- Files.createFile():建立文件。
- Files.createDirectory():建立文件夹。
- Files.delete():删除一个文件或目录。
- Files.copy():复制文件。
- Files.move():移动文件。
- Files.size():查看文件个数。
- Files.read():读取文件。
- Files.write():写入文件。
感谢您的点赞、评论、关注;
您还能够扫码关注“公众号”获取粉丝福利。
