目录
5、final、finally、finalize三者有什么区别?
7、break、continue、return的区别和作用?
10、String、StringBuffer、StringBuillder的区别?
6、Static修饰的方法能调用非Static修饰的变量和方法吗?
7、局部内部类和匿名内部类访问局部变量的时候,为什么必须加上final?
8、 方法的重载(Overload)与重写(Override)的区别?
15、构造器代码块、局部代码块、静态代码块执行顺序和执行次数?
18、Integer的缓存区间是什么?什么时候触发缓存区间?
19、String str = “abc” 与String str = new String(“abc”)的区别?
22、Comparable与Comparator的区别?分别使用的场景?
2、Collection 和Conllections的区别?
3、HashMap线程安全吗?如何得到一个线程安全的Map?
11、ConcurrentHashMap 与 Hashtable的区别?
一、基础
1、JRE、JDK、JVM区别?
JRE:Java Runtime Environment Java开发环境,包含JVM与核心类库。
JDK:Java Development Kit 开发者工具包,包含了JRE,JVM。
JVM: Java虚拟机
三者关系:JDK=JRE+JVM+类库 JRE = JVM+类库
2、Java基本数据类型
整型:byte(字节型)、short(短整型)、int(整型)、long(长整型)
浮点:float(f)、double(d)
布尔类型:Boolean
字符型:(char)
3、什么是方法签名?
方法的名称和参数列表的组成 ,称为方法签名
4、Java中的访问修饰符
public:公共的,对所有的包(包内包外)的类都可访问。
private:私有的,只对本类开放,其他任何形式无法访问。
default:默认的,同包同类可以访问(包括包内继承的子类),其他任何类不能访问(包括继承了包内类的子类),重点突出包。
protect:受保护的,包内的任何类(包括包外继承了包内类的子类)都可以访问。重点在于继承。
5、final、finally、finalize三者有什么区别?
final:final是一个关键字,可以修饰类,方法,变量。被final修饰的
- 类不能被继承。
- 方法不能重写。
- 变量变为常量,不能被重新赋值。
finally:finally是和异常处理相关的一个关键字。用于Try_Catch语句中,无论前面是否出现异常,finally后面语句总是会被执行。(通常用于释放资源)
finalize:finalize是Object中的一个方法。垃圾回收器将对象从堆内存回收之前,会调用对象的finalize方法。
6、this和super的区别?
this:指的是对象本身。this() :调用的是本类的构造方法。
super:指自己最近的父类对象,又称为超类对象。super()调用的是父类的构造方法。
7、break、continue、return的区别和作用?
break: 跳出当前循环。
continue:结束当前循环进入下一次循环。
return:结束方法。
8、局部变量和成员变量的区别?
- 定义位置不同:
局部变量:定义在方法内部。
成员变量:在类中定义的变量。- 作用范围不一致:
局部变量只在本方法中使用。
成员变量在所有的非静态方法中都可以使用,静态变量在所有方法中都能使用。- 默认值不一样:
成员变量有默认值。基本类型为0,引用类型为null。
局部变量没有默认值。- 生命周期不同:
局部变量:随着方法的进栈而生成,随着方法的出栈而消逝。
成员变量:随着对象的创建而生成,随着对象被gc回收而消逝。
静态变量随着类的加载而生成,类被卸载时被销毁。
9、值传递和引用传递区别?
- 基本数据类型的变量,由于存储的就是数据本身;所以就是值传递。
- 引用数据类型的变量,存储的是对象的地址,所以是引用传递。
- Java中只有值传递。
10、String、StringBuffer、StringBuillder的区别?
- String是字符串常量。一旦被创建则无法修改(被final修饰)。StringBuffer与StringBuilder表示的字符串对象可以被修改。
- 运行速度不一样。StringBuilder > StringBuffer>String。
- StringBuilder线程不安全。String、StringBuffer线程安全。
String是不可变类,所有的不可变类都是线程安全的。StringBuffer里面的很多方法都带有Synchronized锁。所以可以保证线程安全,但是StringBuilder并没有此关键字。单线程使用 StringBuilder效率高,多线程使用StringBuffer安全。
11、equals与 == 的区别 ?
- ==可以判断基本类型,也可以判断引用类型,判断基本类型比较的是值,判断引用类型比较的是地址。
- equals如果没有重写Object类的equals方法,在原码会使用“==”比较,重写了Object类就会比较值。
12、hashcode与equals的区别?
1、hashcode和equals都是Object类中的方法
2、equals的默认实现是:对象的地址值是否一样
3、hashcode是基于native方法实现的,底层是通过hash函数返回一个hash值
13、&和&& ,|,|| 的区别
1、& 与 | :既可以作为逻辑运算符又可以作为位运算符。
2、&& 与 ||:只能作为逻辑运算符。
3、& | 作为逻辑运算符与 && || 作为逻辑运算符的区别:&& || 有短路效果,当有多个表达式时,左边的表达式可以确定结果时,就不再继续运算右边的表达式。
14、JDK 1.8 之后有什么新特性
1、Lambda表达式
2、stream流
3、接口增强
4、并行数组排序
5、Optional
6、新的时间和日期API
7、可重复注解
二、面向对象
1、Java中什么是面向对象?
面向对象是一种程序的设计思想。该思想注重是将现实生活中的一些形象事物作为出发点来构建软件,尽可能的运用人类的思维模式来设计程序。该思想侧重于程序中有哪些对象、不同的对象有哪些行为和属性,对象直接的关系等,更注重实现功能步骤和顺序。
三大要素:
- 继承:子类继承父类可以拥有父类所有的行为和属性(被某些关键字修饰的除外),还可以追加行为和属性。Java中继承只支持单继承不支持多继承。但支持多层继承。
- 抽象:将事物和行为抽取出来封装成为一个类,提高复用性。
- 多态:父类引用指向子类实现。实现多态必须要继承,重写父类方法,向上转型。
2、是否可以继承String类,为什么用final修饰?
不可以继承String类,因为String类被final修饰,被final修饰的类为最终类,不能被继承。
被final修饰的原因:
- 方法锁定,防止任何继承关系修改他的意义与实现
- 高效,编译器在遇到final时会转入内嵌机制,大大提高效率
内嵌机制:当代码调用到final时,这个方法会自动展开,而不是函数调用形式。提 高了函数运行效率。
3、JDK1.8之前与JDK1.8之后定义接口有什么不同?
- 在JDK1.8之前定义接口只能定义抽象方法和静态常量。
- JDK1.8之后可以有default方法和静态方法。
- 静态常量使用接口名调用。抽象方法必有实现类重写,由实现类调用。default方法由实现类对象调用。静态方法通过接口名称调用。
4、接口和抽象类有什么不同?
语法区别:
- 包含抽象方法的类必须是抽象类,抽象类中也可不包含抽象方法。
- 在JDK1.8以前接口中只能定义抽象方法和静态常量。
功能不同:
- 接口的设计目的是对类中的方法进行约束,接口是对象行为的抽象。
- 抽象的设计是为了代码的复用。
5、抽象类是否能被final修饰?
不能,final修饰的类不能被继承,而抽象类本身是需要被继承的,互相矛盾。
6、Static修饰的方法能调用非Static修饰的变量和方法吗?
不能,以为静态方法被加载的时候非静态资源还没有被加载,所以静态方法只能调用静态方法以及变量。
7、局部内部类和匿名内部类访问局部变量的时候,为什么必须加上final?
因为生命周期不一致,局部变量存储在栈中,随着方法的结束 而被销毁,而局部内部类对局部变量的引用仍然存在,在调用局部变量时就会出错。
8、 方法的重载(Overload)与重写(Override)的区别?
- 重载:方法的重载是指,在同一个类中,方法名称相同,参数列表不同的多个方法,构成方法的重载,参数列表不同分为:参数类型,参数数量,参数顺序。
- 重写:在继承的条件下,方法的名称,参数相同的情况下构成了方法的重写。JDK以前,返回值必须一样,JDK8以后可以不相同,但必须是父类返回值的派生类。
9、构造器Constructor是否能够被重写?
不可以,也没必要,构造器不能被继承,所以不能被重写,但可以被重载。
10、Java中创建对象的方式有哪些?
- 使用关键字 new
- 使用class类的newInstance方法
- 使用Constructor的newInstance方法
- 使用clone
- 使用反序列化
11、Java的引用数据类型
类、接口、枚举、数组、注解
12、包装类型和基本数据类型的区别?
包装类型是对基本数据类型的封装。
1、包装类对象,用于方法和字段,对象的调用都是通过引用对象的地址,基本数据类型不是.
2、包装类是引用传递。基本类是值传递
3、声明方式不同。包装类需要new在堆中,基本类不用。
4、初始值不同,int的初始值是0,boolean的初始值是false,而包装类的初始值是null
5、存储位置不同,基本数据类型是保存在值栈中。而包装类是在堆中,然后通过对象的引用来调用。
13、为什么要提供包装类?
包装类型作为基本数据类型对应的引用数据类型,方便了涉及对象的操作。让基本类型拥有了方法和属性,实现了对象化交互。
包装类型中提供了对应的基本数据类型的最大值,最小值等属性,以及相关的方法。
14、包装类型和基本数据类型怎么互相转换?
1、基本类型转换为包装类型(装箱)。包装类.valueOf(基本类型)
2、包装类型转为基本类型(拆箱)。对象.xxValue();
JDK1.5以后提供了自动的包装类和基本类型的转化,不需要调用上面的两个方法了。被称为:自动装箱和自动拆箱。
15、构造器代码块、局部代码块、静态代码块执行顺序和执行次数?
1、执行顺序:
静态代码块:当类加载的时候执行,如果类中有多个静态代码块则按顺序执行。
构造器代码块:对象被创建之前执行,优于构造方法,如果有多个,按照书写顺序执行
局部代码块:当方法执行的时候,如果有多个,按照书写顺序执行。
2、执行次数:
静态代码块:执行一次
构造器代码块:每次创建对象都会执行。
局部代码块:每次调用方法都会执行。
16、构造代码快的作用?
1、可以把所有的构造方法公共的代码放在构造代码块中
2、匿名内部类的初始化操作,匿名内部类没有明显的构造方法。
17、Integer、String是否可以被继承?为什么?
不可以,因为都被final修饰
18、Integer的缓存区间是什么?什么时候触发缓存区间?
Integer内部定义了一个内部类IntegerCache,在IntegerCache中维护者一个Integer数组。范围在-128~127中。当基本数据类型转化为包装数据类型的时候,如果基本数据类型范围在-128~127中,则直接从数组中返回Integer实例,否则创建Integer实例。
19、String str = “abc” 与String str = new String(“abc”)的区别?
1、String str = “abc”
如果字符串常量池中没有“abc“,则在常量池中创建”abc“。
Str指向常量池中的”abc“
2、String str = new String("abc")
如果字符串常量池中没有”abc“,则在常量池中创建”abc“
在堆中创建对象,将常量池中的”abc“复制到堆中
str指向堆中的对象
20、包装类型、Math、String常用的方法有哪些?
包装类:将包装类转换为各种基本类型的方法,intValue、longValue等
Math:abs,ceil/floor、random、max/min
String:parseInt() parseDouble() 将字符串转换为各种基本类型方法
21、 Java中的深克隆与浅克隆的区别?怎么实现?
浅克隆:原对象中为基本数据类型的属性值克隆给克隆对象,原对象中为引用数据类型的引用值克隆给克隆对象。原对象和克隆对象中引用类型的属性指向的是同一个对象。
深克隆:原对象和克隆对象引用数据类型的属性指向不是同一个对象。
实现: 1、首先实现Cloneable接口
浅克隆重写Object类中的clone方法即可
深克隆可以利用 IO读写 与 JSON的序列化和反序列化
22、Comparable与Comparator的区别?分别使用的场景?
区别:1、排序逻辑:comparable排序逻辑必须在待排序元素的类中,也成为自然排序
comparator排序的逻辑写在另一个实现类中,也成为比较器排序
2、排序方法:int conpareto(e o1);----->comparable 重写
int compare( e o1,e o2 );----->comparator 重写
3、接口所在包:comparable在java.long下
comparator在java.util 下
使用场景:Comparabel 可以看作是"对内"进行排序的接口。Comparator是“对外”进行排序
的接口。
用Comparable必须要修改原有的类,也就是你要排序那个类,就要在那个中实现Comparable接口并重写compareTo方法,所以Comparable更像是“对内”进行排序的接口。
而Comparator的使用则不相同,Comparator无需修改原有类。也就是在最极端情况下,即使Person类是第三方提供的,我们依然可以通过创建新的自定义比较器Comparator,来实现对第三方类Person的排序功能。也就是说通过Comparator接口可以实现和原有类的解耦,在不修改原有类的情况下实现排序功能,所以Comparator可以看作是“对外”提供排序的接口。
23、Object类和泛型的区别?说出泛型执行的机制,为什么要使用泛型?
共同点:如果从方法的调用层面来说是没有区别的
为什么要是有泛型:不需要做强转,更方便,编译时更加安全,如果是Object类没法保证
返回值类型一定是想要的,也可能是其他类型,这时候就会产生运行
时异常。
泛型的机制:泛型的本质是一种参数化类型,也就是将数据类型作为参数进行传递,其中
T 相当于形式参数负责占位,而真正传递的参数根据调用的方法类型的不同
而改变,由于实际参数有很多类型,所以叫泛型。
24、Erro 与 Exception 有什么区别?
1、从继承体系:Erro和Exception都是Throwable的子类
2、功能方面:Erro是无法处理的异常
Exception是程序可以处理的异常
25、什么是反射?
1、反射是为了动态加载一个类,动态调用一个方法,动态访问一个属性等 为这些动态要
求设计的。
2、JVM会为每一个类创建一个java.long.Class 的实例,通过改对象就可以获取该类的信息,然后通过java.lang.reflect 包下的API达到各种动态需求。
三、集合
1、Java中常用的容器有哪些?
2、Collection 和Conllections的区别?
Collection:1、Collection是集合的顶级接口,定义了集合中统一的接口方法
2、Collection接口有很多常用的实现类
3、Collection的意义是为了具体的集合提供了最大化的统一操作方法
4、直接继承Collection的接口有List和set以及Queue。
Conllections:Collerctions是集合的工具类。提供了很多方法用于对集合元素的排序等。
3、HashMap线程安全吗?如何得到一个线程安全的Map?
HashMap线程不安全,可以利用Conllections里面的synchronizedMap(map)的增强方法
使用ConcurrentHashMap
使用Hashtable
4、List,Set,Map之间的区别?
List集合:单例集合,存储的都是一个一个的元素
List集合可以存在重复元素
每一个元素都有对应的索引,可以通过索引获取元素
元素的存取顺序一致
Set集合:单列集合,存储的都是一个个的元素
Set集合不允许存在重复的元素
元素没有索引,不能通过索引获得元素
不能保证元素的存取一致
5、HashMap和Hashtable有什么区别?
相同点:HashMap和Hashtable都实现了Map接口,都是存储Key——Value数据
不同点:HashMap允许把null值作为key或者value,而Hashtable不可以
HashMap线程不安全,效率高,Hashtable线程安全,效率低
6、如何决定使用HashMap还是TreeMap?
TreeMap可以对元素进行排序,如果需要元素按照一定的顺序进行排序的话使用TreeMap,
没有特殊的要求一般使用HashMap。
7、ArrayList和LinkedLsit的区别是啥?
ArrayList底层实现的数据结构是数组,查询元素较快,增删慢。
LinkedList的底层数据结构是双向循环链表,查询速度慢,增删快。
8、如何做到数组和List之间的转换
List对象转换为数组:可以调用ArrayList(或其他List)的toarray()方法。
数组转换为List:调用Arrays的asList方法。
9、ArrayList和Vector之间的区别
Vector是线程安全的,而ArrayList是线程不安全的,所以单线程下使用ArrayList的效率会更高。
在扩容时,Vector是扩容100%,而ArrayList是扩容50%,更节省内存
10、哪些集合类是线程安全的?
Vector:比ArrayList多了一个同步化机制。Stack 栈 。Hashtable。