笔试之java总结

1.说出你所知道的集合,并说出它们的区别

集合区别的详细解释可以参考这个

HashSet\ArrayList\HashMap都是线程不安全的.如果有多条线程访问它们,而且有超过一条的线程试图修改它们,则可能出现错务.Collections提供了多个静态方法用于创建同步集合
下面程序创建了四个同步的集合对象

1)List接口(继承Collection):元素有序,可重复,(允许多个null元素对象)

实现类:

ArrayList  实现一个数组,它的规模可变并且能像链表一样被访问。它提供的功能类似Vector类但不同步,它是以Array方式实现的List,允许快速随机存取注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:

        List list = Collections.synchronizedList(new ArrayList(...)); 

 

 

LinkedList实现一个链表,提供最佳顺序存取,适合插入和移除元素。由这个类定义的链表也可以像栈或队列一样被使用。提供最佳顺序存取适合插入和移除元素。 

2)Set接口(继承Collection);元素无序(在集合中某个元素的位置是不确定的,每次遍历时的结果可能不同),不可重复,(最多一个null元素对象)

实现类:

HashSet能快速定位一个元素的位置,由哈希表(实际上是一个 HashMap 实例)支持,需要注意的是:存入HashSet的对象必须实现HashCode()方法

注意,此实现不是同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问。

3)Map接口:Key值不能重复

实现类:

HashMap 实现一个键到值映射的哈希表,通过键取得值对象,没有顺序,通过get(key)来获取value,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个); 

注意,此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。(结构上的修改是指添加或删除一个或多个映射关系的任何操作;仅改变与实例已经包含的键关联的值不是结构上的修改。)这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:

   Map m = Collections.synchronizedMap(new HashMap(...));

再附几个类似的面试题

Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。
List, Set, Map是否继承自Collection接口? List,Set是 Map不是
ArrayList和Vector的区别。
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
HashMap和Hashtable的区别
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

2.怎样解决线程同步问题

3.重载和重构的区别

 

重写方法的规则

1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。

2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。

3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)

4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:

父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。

JAVA中方法的重写时发生在子类继承父类的方式产生的。当子类继承父类的方法时相对父类的方法作一定的修改,这时就用到了方法的重写。在子类中进行方法的重写时,要求子类中重写的方法的访问修饰符,返回类型,方法名,以及参数列表必须与父类的相同,否则编译将出错。有一种情况除外:即当子类中重写的方法的返回类型是父类的返回类型(返回值)的子类,此时也可进行方法的重写(但此法实行于JAVA5之后),如子类的返回类型为String,而父类的为Object。如果子类的返回类型是父类中返回类型的父类或者返回类型是基本数据类型,此时编译将会报错。此时若还想用父类的方法,可用super关键字来调用。

而重载的规则:

1、必须具有不同的参数列表;

2、可以有不责骂的返回类型,只要参数列表不同就可以了;

3、可以有不同的访问修饰符;

4、可以抛出不同的异常;

4.int和Interger的区别

5.StringBuilder和StringBuffer的区别

6.error和Exception的区别

7.多态的两种表现形式

对象的多态:继承是多态实现的基础

引用多态:父类的引用可以指向本类的对象

父类的引用可以指向子类的对象

例:Animal obj1=new Animal();

Animal obj2=new Dog();

方法多态:

创建本类对象时,调用的方法是本类方法

创建子类对象时,调用的方法是子类重写的方法或者子类继承的方法

 

 

 

你可能感兴趣的:(java)