1. String和StringBuffer、StringBuilder有什么区别?
1、可变性:
简单的来说:String 类中使用 final 关键字字符数组保存字符串,`private final char value[]`,所以 String 对象是不可变的。
而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串`char[]value` 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
StringBuilder 与 StringBuffer 的构造方法都是调用父类构造方法也就是 Abstract StringBuilder 实现的,大家可以自行查阅源码。
AbstractStringBuilder:
abstract class AbstractStringBuilder implements Appendable, CharSequence {
char[] value;
int count;
AbstractStringBuilder() {
}
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
2、线程安全:
String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公
共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同
步锁,所以是非线程安全的。
3、性能:
每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会
对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer
仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
总结:
1. 操作少量的数据 = String
2. 单线程操作字符串缓冲区下操作大量数据 = StringBuilder
3. 多线程操作字符串缓冲区下操作大量数据 = StringBuffer
2. 简述 Integer与int的区别
1 、Integer 是int 的包装类,int 则是java的一种基本数据类型
2 、Integer 变量必须实例化后才能使用,而int 变量不需要
3 、Integer 实际是对象的引用,当new 一个Integer 时,实际上是生成一个指针指向此对象;而int 则是直接存储数据值
4 、Integer 的默认值是null ,int 的默认值是0
3. Abstract Class和Interface有什么区别?
实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
构造函数:抽象类可以有构造函数;接口不能有。
main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
4. 请写出你最常见到的5个Runtime Exception。
NullPointerException :当应用程序试图访问空对象时,则抛出该异常。
SQLException :提供关于数据库访问错误或其他错误信息的异常。
IndexOutOfBoundsException :指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
NumberFormatException :当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
FileNotFoundException :当试图打开指定路径名表示的文件失败时,抛出此异常。
IOException :当发生某种I / O 异常时,抛出此异常。此类是失败或中断的I / O 操作生成的异常的通用类。
ClassCastException :当试图将对象强制转换为不是实例的子类时,抛出该异常。
ArrayStoreException :试图将错误类型的对象存储到一个对象数组时抛出的异常。
IllegalArgumentException :抛出的异常表明向方法传递了一个不合法或不正确的参数。
ArithmeticException :当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
NegativeArraySizeException :如果应用程序试图创建大小为负的数组,则抛出该异常。
NoSuchMethodException :无法找到某一特定方法时,抛出该异常。
SecurityException :由安全管理器抛出的异常,指示存在安全侵犯。
UnsupportedOperationException :当不支持请求的操作时,抛出该异常。
RuntimeExceptionRuntimeException :是那些可能在Java 虚拟机正常运行期间抛出的异常的超类。
5. JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
throws : 声明异常
throw : 抛出异常
try : 可能出现异常的代码块
catch :捕获出现的异常
finally :不管怎么样都会执行的代码块
在try 中可以抛出异常,并且被catch 捕获
6. Collection框架中实现比较要实现什么接口?
Comparable 和 Comparator 接口
如果一个类的不同对象需要比较大小,那么就需要实现这两个接口,根据业务需求定义规则。
使用区别:
( 1 ) Comparable 接口
是需要比较的类实现自己实现,例如:定义的Student 类需要比较, 需要Student 类自己实现这个接口,实现ComParaTo ( ) 方法。
( 2 ) Comparator 接口
自己定义一个比较容器,去实现这个接口(实现compare方法),然后在集合生成的时候,用一个比较对象做参数,跟集合绑定。
7. List、Map、Set三个接口,存取元素时,各有什么特点?
List 接口特点:
1. 它是一个元素存取有序的集合。例如,存元素的顺序是11 、22 、33 。那么集合中,元素的存储就是按照11 、22 、33 的顺序完成的)。
2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
Set 接口特点
java. util. Set 接口和java. util. List 接口一样,同样继承自Collection 接口,它与Collection 接口中的方法基本一致,并没有对
Collection 接口进行功能上的扩充,只是比Collection 接口更加严格了。与List 接口不同的是,Set 接口中元素无序( 个别有序-
LinkedHashSet ) ,并且都会以某种规则保证存入的元素不出现重复。
Map 接口特点
1. Map中的集合,元素是成对存在的( 理解为夫妻) 。每个元素由键与值两部分组成,通过键可以找对所对应的值。
2. Collection`中的集合称为单列集合,Map 中的集合称为双列集合。
3. 需要注意的是,Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
8. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set 集合一般是重写equals方法和hashcode方法来让元素不重复
== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,
比如 String 、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
9. 简述ArrayList,Vector, LinkedList的存储性能和特性.
ArrayList 和Vector 都是基于存储元素的对象数组来实现的:
1 、Vector 默认扩充为原来的两倍(每次扩充空间的大小可以设置),ArrayList 默认扩充为原来的1.5 倍。
2 、Vector 是线程安全的,ArrayList 不是线程安全的
LinkedList 是采用双向列表来实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问则效率比较低,但是插入元素时不需要对数据
进行移动,因此插入效率较高。同时,LinkedList 是非线程安全的容器
10、Map中数据的迭代方式有哪些?
2 种迭代方法
1. 通过keySet方法取出Map 的键到Set 集合中,然后通过遍历键取到对应的值,从而迭代出Map 集合
2. 通过Map. Entry < T , U > 方法取出Entry ,然后遍历Entry ,getKey取出键值,getValue取出对应的值。
11、说说怎么进行日期格式化?
Java 中通过DateFormat 进行格式化日期,列如:
Date date = new Date ( ) ;
DateFormat dateFormat = new SimpleDateFormat ( "yyyy年MM月dd日" ) ;
String d = dateFormat. format ( date) ;
System . out. println ( d) ;
12、简述Object中hashcode、equals理解
hashCode()介绍:
hashCode ( ) 的作用是获取哈希码,也称为散列码;它实际上是返回一个int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode ( ) 定义在JDK的Object . java中,这就意味着Java 中的任何类都包含hashCode ( ) 函数。
散列表存储的是键值对( key- value) ,它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码! (可以快速找到所需要的对象)
为什么要有 hashCode
我们以“HashSet 如何检查重复”为例子来说明为什么要有hashCode:
当你把对象加入HashSet 时,HashSet 会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他已经加入的对象的hashcode
值作比较,如果没有相符的hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java 启蒙书《Head first java》第二版)。
这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。
hashCode()与equals()的相关规定:
1. 如果两个对象相等,则hashcode一定也是相同的
2. 两个对象相等, 对两个对象分别调用equals方法都返回true
3. 两个对象有相同的hashcode值,它们也不一定是相等的
4. 因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
5. hashCode ( ) 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode ( ) ,则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)