CBCAC CADDD AB 1. String 、 StringBuffer 以及 StringBuilder 的区别简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象, 然后将指针指向新的 String 对象, 所以经常改变内容的字符串最好不要用 String , 因为每次生成对象都会对系统性能产生影响, 特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量, 就无需分配新的内部缓冲区数组。如果内部缓冲区溢出, 则此容量自动增大。从 JDK 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。但是如果将 StringBuilder 的实例用于多个线程是不安全的。需要这样的同步,则建议使用 StringBuffer 2. 说说 ArrayList 和 LinkedList 、 HashMap 和 Hashtable 的区别 ArrayList 采用的是数组形式来保存对象的, 这种方式将对象放在连续的位置中, 所以最大的缺点就是插入删除时非常麻烦 LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引但是缺点就是查找非常麻烦要丛第一个索引开始 Hashtable 和 HashMap 类有三个重要的不同之处。第一个不同主要是历史原因。 Hashtable 是基于陈旧的 Dictionary 类的, HashMap 是 Java 引进的 Map 接口的一个实现。也许最重要的不同是 Hashtable 的方法是同步的,而 HashMap 的方法不是。这就意味着, 虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个 Hashtable ,但你必须同样地为一个 HashMap 提供外同步。一个方便的方法就是利用 Collections 类的静态的 synchronizedMap() 方法,它创建一个线程安全的 Map 对象, 并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的 HashMap 。这么做的结果就是当你不需要同步时,你不能切断 Hashtable 中的同步(比如在一个单线程的应用程序中) ,而且同步增加了很多处理费用。第三点不同是,只有 HashMap 可以让你将空值作为一个表的条目的 key 或 value 。 HashMap 中只有一条记录可以是一个空的 key ,但任意数量的条目可以是空的 value 。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值, 那么 get() 将返回 null 。如果有必要,用 containKey() 方法来区别这两种情况。 z 3. 如何创建并启动一个新线程? 线程的状态有哪些?说一说他们之间是如何转化的? 1) 如何创建并启动一个新线程? j ava 语言已经内置了多线程支持,所有实现 Runnable 接口的类都可被启动一个新线程,新线程会执行该实例的 run() 方法,当 run() 方法执行完毕后,线程就结束了。一旦一个线程执行完毕, 这个实例就不能再重新启动, 只能重新生成一个新实例,再启动一个新线程。 Thread 类是实现了 Runnable 接口的一个实例, 它代表一个线程的实例, 并且, 启动线程的唯一方法就是通过 Thread 类的 start() 实例方法: Thread t= new Thread(); (); start() 方法是一个 native 方法,它将启动一个新线程,并执行 run() 方法。 Thread 类默认的 run() 方法什么也不做就退出了。注意:直接调用 run() 方法并不会启动一个新线程,它和调用一个普通的 java 方法没有什么区别。因此,有两个方法可以实现自己的线程: 方法 1: 自己的类 extend Thread , 并复写 run() 方法, 就可以启动新线程并执行自己定义的 run() 方法。例如: public class MyThread extends Thread { public run() { ("()"); }} 在合适的地方启动线程: new MyThread().start(); 方法 2 :
Java综合测试题答案 来自淘豆网m.daumloan.com转载请标明出处.