Java面试题自我总结(二)

1.说几个常用修饰符的区别:

   访问权限   类   包  子类 任何地方
 public     ∨   ∨    ∨     ∨          (对任何人都是可用的)

 protect    ∨   ∨   ∨     ×   (继承的类可以访问以及和private一样的权限)

 default    ∨   ∨   ×     ×    (包访问权限,即在整个包内均可被访问)

 private    ∨   ×   ×     ×    (除类型创建者和类型的内部方法之外的任何人都不能访问的元素)

2.说出几个异常

NullPointerException   空指针异常
ClassNotFoundException  指定的类异常
ArithmeticException   数学运算异常
ArrayIndexOutOfBoundsException  数组下标越界
IllegalArgumentException       方法的参数错误
ClassCastException 类型转换异常,向下转型中经常发生
ParseException 时间格式化异常,SimpleDateFormat中经常发生
IndexOutOfBoundsException 数组下标越界异常
NumberFormatException 数据格式异常

3.父类代码块,父类静态代码块 父类构造方法 子类代码块 子类静态方法 子类构造方法 执行顺序

先静态 后父类 先代码块 后构造方法
所有先后顺序是:
父类静态代码块 子类静态方法
父类代码块,父类构造方法
子类代码块 子类构造方法

4.请说出5个常见的类 ? 说出5个常见的包?

类:	Date,System,Class,List,HashMap
包:java.lang  java.io  java.util   java.sql,   javax.servlet

5.说下java中的集合

ArrayList Vector
HashMap HashTable TreeMap LinkedMap
HashSet Treeset

6.ArrayList 和Vector的区别
ArrayList:

ArrayList :  
	默认初始容量0     加载因子1       扩容1.5倍
	底层数据结构是数组结构
	线程不安全,效率高
	若有设置的初始容量使用设置的初始容量。

vector:

Vector: 
	默认初始容量10     加载因子1         扩容2倍
	底层数据结构是数组结构
	线程安全,效率低
	若有设置的初始容量使用设置的初始容量。

7.List Set Map的区别?
List:

List表示有先后顺序的集合, 注意,不是那种按年龄、按大小、按价格之类的排序。当我们多次调用add(Obj e)方法时,
每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。
有时候,也可以插队,即调用add(int index,Obj e)方法,
就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进List中,
每调用一次add方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,
而是在集合中用一个索引变量指向这个对象,当这个对象被add多次时,即相当于集合中有多个索引指向了这个对象,
List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。

Set:

Set里面不允许有重复的元素,所谓重复,即不能有两个相等(注意,不是仅仅是相同)的对象 ,
 即假设Set集合中有了一个A对象,现在我要向Set集合再存入一个B对象,但B对象与A对象equals相等,则B对象存储不进去,
 所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,
 则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。Set取元素时,
 没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。

Map:

Map与List和Set不同,它是双列的集合,其中有put方法,
定义如下:put(obj key,obj value),每次存储时,要存储一对key/value,
不能存储重复的key,
这个重复的规则也是按equals比较相等。
取则可以根据key获得相应的value,即get(Object key)返回值为key 所对应的value。
另外,也可以获得所有的key的结合,还可以获得所有的value的结合,
还可以获得key和value组合成的Map.Entry对象的集合。

总结:
List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

8.throw 跟throws的区别

throw 是在方法体中主动抛出一个异常
throws 把异常往上抛 谁调用谁处理

9.HashMAP(HashSet)用来装学生,人数在37-43人左右 请问如何初始化HashMap容量可以使性能达到最优
64 人

我们集合初始化的时候,要指定初始值大小,那么我们创建HashMap的时候,到底指定多少合适呢?
有些人会自然想到,我准备塞多少个元素我就设置成多少呗。比如我准备塞7个元素,那就new HashMap(7)。
但是,这么做不仅不对,而且以上方式创建出来的Map的容量也不是7。因为,当我们使用HashMap(int initialCapacity)来初始化容量的时候,HashMap并不会使用我们传进来的initialCapacity直接作为初始容量。
JDK会默认帮我们计算一个相对合理的值当做初始容量。所谓合理值,其实是找到第一个比用户传入的值大的2的幂。
也就是说,当我们new HashMap(7)创建HashMap的时候,JDK会通过计算,帮我们创建一个容量为8的Map;当我们new HashMap(9)创建HashMap的时候,JDK会通过计算,帮我们创建一个容量为16的Map。
但是,这个值看似合理,实际上并不尽然。因为HashMap在根据用户传入的capacity计算得到的默认容量,并没有考虑到loadFactor这个因素,只是简单机械的计算出第一个大约这个数字的2的幂。
也就是说,如果我们设置的默认值是7,经过JDK处理之后,HashMap的容量会被设置成8,但是,这个HashMap在元素个数达到 8*0.75 = 6的时候就会进行一次扩容,这明显是我们不希望见到的。
那么,到底设置成什么值比较合理呢?
这里我们可以参考JDK8中putAll方法中的实现的,这个实现在guava(21.0版本)也被采用。
这个值的计算方法就是:
 float ft = ((float)s / loadFactor) + 1.0F;
比如我们计划向HashMap中放入43个元素的时候,我们通过expectedSize / 0.75F + 1.0F计算,7/0.75 + 1 = 33 ,10经过JDK处理之后,会被设置成64,这就大大的减少了扩容的几率。

10.说下数组跟链表的区别

(1)数组的元素个数是固定的,而组成链表的结点个数可按需要增减;

(2)数组元素的存诸单元在数组定义时分配,链表结点的存储单元在程序执行时动态向系统申请:

(3)数组中的元素顺序关系由元素在数组中的位置(即下标)确定,链表中的结点顺序关系由结点所包含的指针来体现。

(4)对于不是固定长度的列表,用可能最大长度的数组来描述,会浪费许多内存空间。

(5)对于元素的插人、删除操作非常频繁的列表处理场合,用数组表示列表也是不适宜的。若用链表实现,会使程序结构清晰,处理的方法也较为简便。
	
与数组的区别 从增删改查操作的效率上来谈
增删 链表的效率更高       改查 数组的效率更高

11.成员内部类中可以定义静态的属性和方法吗?

三点说明:
static类型的属性和方法,在类加载的时候就会存在于内存中。
要想使用某个类的static属性和方法,那么这个类必须要加载到虚拟机- 中。
非静态内部类并不随外部类一起加载,只有在实例化外部类之后才会加载

 结论:
非静态内部类不能有静态成员!
成员内部类必须先实例化外部类对象然后再实例化成员内部类;

12.你知道那些jdk8新特性吗?

接口 lambda表达式 函数引用

13.mysql中where和having的区别?
where子句:

where子句:是在分组之前使用,表示从所有数据中筛选出部分数据,
以完成分组的要求,  
在where子句中不允许使用统计函数,没有group by子句也可以使用。

having子句:

having子句:是在分组之后使用的,表示对分组统计后的数据执行再次过滤,
可以使用 统计函数,有group  by子句之后才可以出现having子句。

14.final 在java中有什么区别?

final 修饰的类叫最终类,该类不能被继承
final 修饰的方法不能被重写
final 修饰的变量叫常量,常量必须初始化,初始化以后的值不能被修改

15.java中Math。round(-1.5)等于多少?

等于-1 。Math。round四舍五入大于0.5向上取整。

16.如何将字符串反转?
使用StringBuilder或者Stringbuffer的 reverse方法

StringBuilder stringBuilder = new StringBuilder();
stringBuilder. append(“abcdefg”);
System. out. println(stringBuilder. reverse()); // gfedcba

17.String类的常用方法有哪些?

indexOf() 返回指定字符的索引
charOf() 返回指定索引处的字符
replace() 字符串替换
trim() 取出字符串两边留白
aplit() 分割字符串,返回一个分割后的字符串数组
getBytes() 返回字符串的byte类型数组
length() 返回字符串长度
toLowerCase() 将字符串转成小写字母
toUpperCase() 将字符串转成大写字母
subString() 截取字符串
equals() 字符串比较

18.普通类和抽象类有什么区别?

普通类不能包含抽象方法,抽象类可以包含抽象方法
抽象类不能直接实例化, 普通类可以直接实例化

19.抽象类必须要有抽象方法吗?

不需要, 抽象类不一定非要抽象方法

20.抽象类可以使用final修饰吗?

不能,定义抽象类就是要让其他类来继承,如果用final修饰, 该类就不能被继承。这样彼此会产生矛盾,所以final不能修饰抽象类。

21.接口和抽象类有什么区别?

默认方法实现:抽象类可以有默认的方法实现;接口不能有默认的方法实现。
实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
构造函数:抽象类可以有构造函数;接口不能有。
main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

22.java中IO流分为几种?

按功能分 输入流(input) 输出流(output)
按类型分 字节流 字符流
字节流和字符流的区别是:
字节流是按8位传输以字节为单位输出输入数据
字符流是按16位传输以字符为单位输出输入数

23.Files的常用方法有哪些?

Files. exists():检测文件路径是否存在。
Files. createFile():创建文件。
Files. createDirectory():创建文件夹。
Files. delete():删除一个文件或目录。
Files. copy():复制文件。
Files. move():移动文件。
Files. size():查看文件个数。
Files. read():读取文件。
Files. write():写入文件。

24.java容器有哪些?
java容器分为Collection和Map两大类 其下又分为很多子类
Collection:

List
ArrayList
LinkedList
Vector
Stack
Set
HashSet
LinkedHashSet
TreeSe

Map:

HashMap
LinkedHashMap
TreeMap
ConcurrentHashMap
Hashtable

Collection 是一个集合接口,
它提供了对集合对象进行基本操作的通用接口方法,
所有集合都是它的子类,比如 List、Set 等。

25.HashMAP 和Hashtable有什么区别?

存储: HashMAP允许key和value为null,而Hashtable不允许
线程安全: HashMAP是非线程安全的 Hashtable是线程安全的

26.如何决定使用HashMap还是treeMap?

对于在map在插入,删除,定位一个元素这类操作。HashMap是最好的选择
因为相对而言 HashMAP的插入会更快 但如果你要对一个Key集合进行有序的遍历。那treeSet是更好的选择

27.Array和ArrayList 有何区别?

Array 可以存储基本数据类型和对象,ArrayList只能存储对象。
Array 大小是固定的, 而ArrayList大小是自动扩展的。

28.哪些集合类是线程安全的?

Vector、Hashtable、Stack 都是线程安全的,而像 HashMap 则是非线程安全的,不过在 JDK 1.5 之后随着 Java. util. concurrent 并发包的出现,
它们也有了自己对应的线程安全类,比如 HashMap 对应的线程安全类就是 ConcurrentHashMap。

29.迭代器Iterator是什么?

Iterator 接口提供遍历任何Collection的接口。
我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。
迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。

30.Iterator怎么使用? 有什么特点?
Iterator 使用代码如下:

List list = new ArrayList<>();
Iterator it = list. iterator();
while(it. hasNext()){
String obj = it. next();
System. out. println(obj);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值