java程序员面试宝典(2)

1.      二维数组的长度是否固定:长度不固定。Java数组长度可以动态变化。如int[][] arr = new int [3][];arr[0] = newint[]{4};arr[1] = new int[]{4,5};

2.      比较器是什么:对于Comparable接口来说,它往往是进行比较类需要实现的接口,它仅包含一个compareTo()方法,只有一个参数,返回值为int类型(没有实现Comparable则不可比较)。Comparator接口一般不会被集合元素类所实现,而是单独实现或用匿名内部类的方式实现。比较器还用于集合元素的排序。

3.      Vector与ArrayList的区别:Vector的大多数成员方法都会加上synchronized关键字,是线程安全的,因此效率没ArrayList高。

4.      HashMap和HashTable的区别:(1)HashTable方法是同步的,多线程场合用它,HashMap不能同步。(2)HashTable不允许null值(key和value都不可以)。HashMap都允许。(3)HashTable有一个contains()方法,功能与containsValue()功能一样。(4)HashTable使用Enumeration,HashMap使用Iterator。(5)HashTable中的hash数组默认大小是11,增加方式是:old*2+1。HashMap中hash数组默认大小是16,而且一定是2的指数。(6)哈希值的使用不同,HashTable直接使用对象的hashCode,而HashMap会重新计算hash值。

5.      如何把集合对象中的元素进行排序:如果列表中的元素都是相同类型的,并且这个类实现了Comparable接口,可以简单的调用Collections.sort()。如果这个类没有实现Comparator,就可以传递一个Comparator实例作为sort()的第二个参数进行排序。如:Comparator comp = Collections.reverseOrder();(Collection是集合类的上级接口,继承与他的接口主要有Set 和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。)Collections.sort(集合list,比较器comp);

6.      Foreach运行原理:(1)调用指定集合对象的Iterator()方法,得到迭代器。(2)然后使用迭代器的hasNext()方法判断是否有下一个元素来进行循环。(3)每一次循环调用next()方法,得到下一个元素。数组或实现了Iterable接口的类实例都可以使用foreach循环

7.      如果没有设置布局格式,JFrame是无法直接加入JButton组件的,即使调用了add()方法,界面上也是空白的。

8.      要用Swing制作界面很简单:(1)new JFrame(“窗口名”)。(2)设置窗口关闭时,程序退出:jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)。(3)设置大小和可见性。

9.      Swing提供两种文本输入组件,一个是JTextField,它代表只能单行输入的文本框,一般创建需要提供长度参数。另一个则是JTextArea,它代表可以多行输入,创建要提供长度和高度两个参数。

10.  Swing事件类型比较多,但有通用使用和定义规则:(1)组件都有addXXXListener()和removeXXXListener()方法,XXX代表事件的类型和含义。(2)XXX事件的监听器类型叫做XXXListener。(3)XXX事件的类名叫做XXXEvent,它往往作为XXXListener接口方法中的参数类型。

11.  Swing监听器有适配器,为一些监听器接口的方法提供默认的空实现。如KeyListener可以用new KeyAdapter代替,这样无需实现KeyListener中不想实现的接口。

12.  Java提供java.io.File类对目录和文件进行操作:isDirectory和isFile方法检查该File对象所代表的是目录还是普通文件。list方法用于得到目录下所有的文件名,类型为字符串数组。getName方法得到文件名,不包含它的路径。

13.  如何使用随机存储文件RandomAccessFile类:(1)用length()方法获得文件内容长度。(2)用seek()方法随机到达任何需要存取数据的地方。(3)调用read()方法获取当前位置的数据,用write()方法写入数据(单位是字节)。(4)调用close关闭文件的打开。

14.  字节流处理的是计算机最基本的单位byte。

15.  可序列化是数据持久化的一种方案(如Tomcat保存session数据就用它)。java.io.Serializable接口是可以进行序列化的类的标志性接口,该接口本身没有任何需要实现的抽象方法。它仅仅是用来告诉JVM该类的对象可以进行序列化,并且它的序列化ID由静态的serialVersionUID变量提供。serialVersionUID变量是一个静态的finallong型的常量,它的作用在序列化和反序列化的过程中起到辨别一个类的作用。

补充:serialVersionUID 用来表明类的不同版本间的兼容性。如果你修改了此类要修改此值。否则以前用老版本的类序列化的类恢复时会出错。为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义。
  
在警告上点左键就可以自动添加。当然也可以去掉警告。设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。

16.  如何序列化和反序列化一个java对象:(1)让需要序列化的类实现java.io.Serializable接口。(2)提供静态的long型的常量serialVersionUID。(3)如果是序列化对象,则用一个输入流创建ObjectOutputStream对象,然后调用writeObject()方法。(4)如果反序列化,首先使用一个输入流创建一个ObjectInputStream对象,然后调用readObject()方法,得到一个Object类型的对象,最后再做类型的强制转换。(5)关闭流。(该方法可以将对象永久存入文本中,再从文本中还原对象)

17.  进程是CPU、内存等系统的基本单位,而线程又是进程的执行单元。多进程的并发对于数据的共享是很困难的,而多线程却相当的容易。进程是占用系统资源的基本单位。一个进程中的线程是可以相互通信的,但不同进程之间的线程是不能相互通信的。

18.  如何启动一个线程:继承自Thread类的线程类,可以通过new创建一个线程对象以后,执行start()方法开始一个线程。实现了Runnable接口的线程类,需要用它的对象实例,作为Thread类构造方法的参数,创建一个Thread对象,然后调用start()方法开始一个线程。(如:Thread t =new Thread(new RunnableTest());t.start())

19.  如何同步:sychronized关键字要为某一段代码加上一个同步锁,需要绑定在某一个对象上,即提供一个对象的引用(如sychronized(obj){```代码```})。如果是同步方法,只需加sychronized修饰即可。

补充:悲观锁假定其他用户企图访问或者改变你正在访问、更改的对象的概率是很高的,因此在悲观锁的环境中,在你开始改变此对象之前就将该对象锁住,并且直到你提交了所作的更改之后才释放锁。悲观的缺陷是不论是页锁还是行锁,加锁的时间可能会很长,这样可能会长时间的限制其他用户的访问,也就是说悲观锁的并发访问性不好。与悲观锁相反,乐观锁则认为其他用户企图改变你正在更改的对象的概率是很小的,因此乐观锁直到你准备提交所作的更改时才将对象锁住,当你读取以及改变该对象时并不加锁。可见乐观锁加锁的时间要比悲观锁短,乐观锁可以用较大的锁粒度获得较好的并发访问性能。但是如果第二个用户恰好在第一个用户提交更改之前读取了该对象,那么当他完成了自己的更改进行提交时,数据库就会发现该对象已经变化了,这样,第二个用户不得不重新读取该对象并作出更改。这说明在乐观锁环境中,会增加并发用户读取对象的次数。

20. 生产者与消费者模型的多线程例子:在所有Java.lang.Object中,包含3个重载的wait()方法以及notify()和notifyAll()方法(notifyAll唤醒所有等待线程,不管是生产者还是消费者)。主要让当前的线程进入等待池或从等待池唤醒一个或多个线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值