1.什么是死锁(deadlock)?
两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。
2.Java中的HashMap的工作原理是什么?
Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。
- 两者都是用key-value方式获取数据
- Hashtable允许null值作为key和value,而HashMap不可以--> 说反了
- HashMap不是同步的,而Hashtable是同步的
- 迭代HashMap采用快速失败机制,而Hashtable不是
3.Array和ArrayList的区别:
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
4.List<? extends T>和List<? super T>之间有什么区别?
- <? extends T> 表示类型的上界,表示参数化类型的可能是T类或是 T的子类
- <? super T> 表示类型下界,表示参数化类型是此类型的超类型(父类型),直至Object
下列选项中关于Java中super关键字的说法正确的是()
- super关键字是在子类对象内部指代其父类对象的引用
- super关键字不仅可以指代子类的直接父类,还可以指代父类的父类
- 子类通过super关键字只能调用父类的方法,而不能调用父类的属性
- 子类通过super关键字只能调用父类的属性,而不能调用父类的方法
答案:A
super出现在继承了父类的子类中。有三种存在方式:
第一种:super.xxx;(xxx为变量名或对象名)
这种方法意义为,获取父类中的名字为xxx的变量或方法引用。
使用这种方法可以 直接访问父类中的变量或对象,进行修改赋值等操作
第二种:super.xxx();(xxx为方法名)
这种方法意义为, 直接访问并调用父类中的方法。
第三种:super();
这种方法意义为, 调用父类的初始化方法,其实就是调用父类中的public xxx()方法
此外,super只能指代其直接父类,不能指代父类的父类。如果在父类中调用super能指代父类的父类。而this代表当前对象,也就是当前类的对象的引用5.list是一个ArrayList的对象,哪个选项的代码填到//todo delete处,可以在Iterator遍历的过程中正确并安全的删除一个list中保存的对象?()
Iterator it = list.iterator(); int index = 0; while (it.hasNext()) { Object obj = it.next(); if (needDelete(obj)) //needDelete返回boolean,决定是否要删除 { //todo delete } index ++; }
- it.remove();
- list.remove(obj);
- list.remove(index);
- list.remove(index);
答案:A
如果在循环的过程中调用集合的remove()方法,就会导致循环出错,例如:
for(int i=0;i<list.size();i++){
list.remove(...);
}
循环过程中list.size()的大小变化了,就导致了错误。
所以,如果你想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。
迭代器(Iterator)
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
迭代器应用:
list l = new ArrayList();
l.add("aa");
l.add("bb");
l.add("cc");
for (Iterator iter = l.iterator(); iter.hasNext();) {
String str = (String)iter.next();
System.out.println(str);
}
/*迭代器用于while循环
Iterator iter = l.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
System.out.println(str);
}
*/7.给定以下JAVA代码,这段代码运行后输出的结果是()
public class Test { public static int aMethod(int i)throws Exception { try{ return i / 10; } catch (Exception ex) { throw new Exception("exception in a Method"); } finally{ System.out.printf("finally"); } } public static void main(String [] args) { try { aMethod(0); } catch (Exception ex) { System.out.printf("exception in main"); } System.out.printf("finished"); } }
- finally exception in main finished
- finally finished
- exception in main finally
答案:B
i / 10;无论i是多少,永远不会抛出异常,所以catch语句不会执行。
而finally语句是必定执行的语句。
所以先指向aMathod()的finally代码块,输出finally
然后执行main()方法的最后一条输出语句,输出finished
8.以下程序的运行结果是()
public class Increment { public static void main(String args[]) { int a; a = 6; System.out.print(a); System.out.print(a++); System.out.print(a); } }
- 666
- 667
- 677
- 676
答案B;a++可以理解为当访问a之后再对a进行加一操作,System.out.print(a++),a先返回后,在进行自增+1操作。
a++ 是一个表达式,表达式的值是a自增1之前的值,随后a进行加一操作。a++在后是先用后增++a在前是先增后用9.下面关于abstract关键字描述错误的是()
- abstract关键字可以修饰类或方法
- final类的方法都不能是abstract,因为final类不能有子类
- abstract类不能实例化
- abstract类的子类必须实现其超类的所有abstract方法
答案:D
abstract类的子类可以实现超类所以的抽象方法,也可以实现超类的部分抽象方法 、如果超类还有抽象方法未被子类实现,那么该子类也是abstract的
10.在如下所示的类Test中,共有()个构造方法。
public class Test { private int x; public Test() { x = 35; } public void Test(double f) { this.x = (int)f; } public Test(double f) { this.x = (int)f; } public Test(String s) {} }
- 0
- 1
- 2
- 3
答案D 。构造方法没有返回值。不能添加void,构造方法可以被重载