1.通过字面量创建字符串和new一个字符串对象有什么区别?
内存分配的方式不不一样
通过字面量创建字符串对象会分配到常量池中 若再次使用该字面量创建新字符串时候,不在创建新对象,而是从常量池中获取
通过new一个字符串对象会分配到堆内存中
2.什么是常量池?
常量池在Java用于保存在编译器已确定的,已编译的class文件中的一份数据.它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = “Java” 这种声明方式; 当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间
3.做字符串拼接的时候可以使用String吗?
不建议直接使用String做拼接,最好使用StringBuilder或者StringBuffer来做拼接
4.StringBuilder和StringBuffer有什么区别呢?
共同之处:
1.都继承了AbstractStringBuilder这个抽象类,实现了CherSequence接口
2.其append方法都是super.append(str),调用了父类AbstractStringBuilder的append(String str)方法
3.初始容量都是16,扩容机制都是"旧容量*2+2"
4.底层都是char[]字符数组实现,且字符数组都是可变的,这点不同于String
不同之处
1.StringBuffer从JDK1.0就有了,StringBuilder是JDK5.0才出现
2.StringBuilder是非线程安全的,效率更高。StringBuffer是线程安全的,效率低一些,但安全。
3.只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。
4.在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全而StringBuffer则每次都需要判断锁,效率相对更低。
5.子类重写父类含有抛出异常的方法时候,有哪些要求?
不再抛出任何异常;
仅抛出部分异常;
抛出子类异常;
不可以抛出额外异常;
不可以抛出父类异常;
6.final. finally. finalize有什么区别?
final 用于修饰类,变量,方法,修饰类表示该类不可以被继承,修饰方法表示该方法不可以被重写,修饰变量表示不可以重新赋值
finally一般作用在try-catch捕获异常代码块中,不论代码是否发生异常,finally中的代码一定会被执行,通常用来关闭一些资源时候使用
finalize 属于Object类中的一个方法,当对象被收回的时候,会调用此方法
7.List集合和Set集合有什么区别?
相同部分:
List 与 Set 具有相似性,他们都是单列元素的集合,所以他们有一个功能共同的父接口,叫Collection
区别:
Set里边不允许有重复的元素,所谓重复,即不能有两个相等的对象.
假设Set集合中有了一个A对象,现在我要向Set集合中再存入一个B对象,但是B对象与A对象equals相等,则B对象存储不进去,所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素,则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,则返回值结果为false.
Set取元素时候,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素.
List表示有先后顺序的集合, 注意, 不是那种按照年龄,按大小, 按价格之类的排序
当我们多次调用当我们多次调用 add(Obj e)方法时,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。有时候,也可以插队,即调用 add(int index,Obj e)方法,就可以指定当前对象在集合中的存放位置.一个对象可以被反复存入List中,每调用一次add方法,这个对象就被插入进集合中一次,其实并不是把这个对象本身存储到集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被add多次时候,即相当于集合中有多个索引指向了这个对象.
List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确的说明取第几个元素
总结:
List以特定次序来持有元素,可以有重复元素, Set无法拥有重复元素,内部排序
另外,再Set集合中, hashset集合比较两个对象是否相等,首先看Hashcode方法是否相等,然后看equals方法是否相等. new两个Student插入到HashSet中,看HashSet的size,实现hashcode和equals方法后再看size
8.集合中的泛型有什么用?
泛型,在C++中被称为模板,就是一种抽象的编程方式,当我们定义类和方法的时候,可以用一种通用的方式进行定义,而不必写出具体的类,这些未知的东西会在真正使用的时候再确定
对于集合类来说,他们可以存放格中类型的元素,如果在存放之前,就能确定元素的类