到底Vector和ArrayList,Hashtable和HashMap有什么区别? 很多面试官喜欢问这个问题,其实更专业一点应该这样问:新集合框架和旧集合框架有哪些区别?新集合框架大家可以在这些包中找since jdk1.2的,之前的如vector和Hashtable都是旧的集合框架包括的类。那么区别是? a. 新集合框架的命名更加科学合理。例如List下的ArrayList和LinkedList b. 新集合框架下全部都是非线程安全的。建议去jdk里面包含的源代码里面自己去亲自看看vector和ArrayList的区别吧。当然如果是jdk5.0之后的会比较难看一点,因为又加入了泛型的语法,类似c++的template语法。
a. 通过Class.forName(“Bean的类名”)得到Class对象,例如叫ABeanClass b. 通过ABeanClass的getMethods()方法,得到Method[]对象 c. 按照规范所有get方法名后的单词就代表着该Bean的一个属性 d. 当已经知道一个方法名,可以调用newInstance()得到一个实例,然后通过invoke()方法将方法的名字和方法需要用的参数传递进去,就可以动态调用此方法。
2.关于Java的多线程编程 关于Java的线程,初学或者接触不深的大概也能知道一些基本概念,同时又会很迷惑线程到底是怎么回事?如果有人认为自己已经懂了不妨来回答下面的问题: a. A对象实现Runnable接口,A.start()运行后所谓的线程对象是谁?是A么? b. 线程的wait()、notify()方法到底是做什么时候用的,什么时候用? c. 为什么线程的suspend方法会被标注过时,不推荐再使用,线程还能挂起么? d. 为了同步我们会对线程方法声明Synchronized来加锁在对象上,那么如果父类的f()方法加了Synchronized,子类重写f()方法必须也加Synchronized么?如果子类的f()方法重写时声明Synchronized并调用super.f(),那么子类对象上到底有几把锁呢?会因为竞争产生死锁么?
a. 明确一个概念,只有Frame组件才可以单独显示的,也许有人会说JOptionPane里面的静态方法就实现了单独窗口出现,但追寻源代码会发现其实现实出来的Dialog也需要依托一个Frame窗体,如果没有指定就会默认产生一个然后装载这个Dialog显示出来。
b. JFrame是由这么几部分组成: 最底下一层JRootPane,上面是glassPane (一个JPanel)和layeredPane (一个JLayeredPane),而layeredPane又由contentPane(一个JPanel)和menuBar构成。我们的组件都是加在contentPane上,而背景图片只能加在layeredPane上面。 至于glassPane是一个透明的覆盖了contentPane的一层,在特定效果中将被利用到来记录鼠标坐标或掩饰组件。
c. 为了增强用户体验,我们会在一些按钮上添加快捷键,但Swing里面通常只能识别键盘的Alt键,要加入其他的快捷键,必须自己实现一个ActionListener。
d. 通过setLayout(null)可以使得所有组件以setBounds()的四个参数来精确定位各自的大小、位置,但不推荐使用,因为好的编程风格不应该在Swing代码中硬编码具体数字,所有的数字应该以常数的形式统一存在一个静态无实例资源类文件中。这个静态无实例类统一负责Swing界面的风格,包括字体和颜色都应该包括进去。
e. 好的界面设计有一条Golden Rule: 用户不用任何手册通过少数尝试就能学会使用软件。所以尽量把按钮以菜单的形式(不管是右键菜单还是窗体自带顶部菜单)呈现给顾客,除非是频繁点击的按钮才有必要直接呈现在界面中。
关于class loader,我知道的: 比如你写了个类A,里面有个方法调用类B 首先自定义的class loader把加载的任务委派给其parent,比如system class loader, system class loader再委派给其parent, extension class loader, extension class loader再委派给其parent, bootstrap class loader, 如果 bootstrap class loader 能找到B,就加载它(如果找不到,就由extension class loader负责找并加载,下同) 并返回该对象给extension class loader, extension class loader再返回给system class loader, system class loader 再返回给该自定义的class loader 如果都找不到,自定义class loader尝试寻找并加载B
a) 需要有一个服务器角色,它拥有真正的功能代码方法。例如B,它提供加法服务 b) 如果想远程使用B的功能,需要知道B的IP地址 c) 如果想远程使用B的功能,还需要知道B中那个特定服务的名字
我们很自然可以想到这些,虽然不完善,但已经很接近正确的做法了。实际上RMI要得以实现还得意于Java一个很重要的特性,就是Java反射机制。我们需要知道服务的名字,但又必须隐藏实现的代码,如何去做呢?答案就是:接口! 举个例子: public interface Person(){ public void sayHello(); }
Public class PersonImplA implements Person{ public PersonImplA(){}
public void sayHello(){ System.out.println(“Hello!”);} }
Public class PersonImplB implements Person{ public PersonImplB(){}
public void sayHello(){ System.out.println(“Nice to meet you!”);} }
客户端:Person p = Naming.lookup(“PersonService”); p.sayHello();