Test2

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的区别

1Integerint的包装类,int则是java的一种基本数据类型 
2Integer变量必须实例化后才能使用,而int变量不需要 
3Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 
4Integer的默认值是nullint的默认值是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框架中实现比较要实现什么接口?

 ComparableComparator接口

 如果一个类的不同对象需要比较大小,那么就需要实现这两个接口,根据业务需求定义规则。

 使用区别:
 (1)Comparable接口

 是需要比较的类实现自己实现,例如:定义的Student类需要比较,需要Student类自己实现这个接口,实现ComParaTo()方法。

 (2)Comparator接口

 自己定义一个比较容器,去实现这个接口(实现compare方法),然后在集合生成的时候,用一个比较对象做参数,跟集合绑定。

7. List、Map、Set三个接口,存取元素时,各有什么特点?

List接口特点:
1. 它是一个元素存取有序的集合。例如,存元素的顺序是112233。那么集合中,元素的存储就是按照112233的顺序完成的)。
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 方法,
比如 StringInteger 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

9. 简述ArrayList,Vector, LinkedList的存储性能和特性.

ArrayListVector都是基于存储元素的对象数组来实现的:
	1Vector默认扩充为原来的两倍(每次扩充空间的大小可以设置),ArrayList默认扩充为原来的1.5倍。
	2Vector是线程安全的,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 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值