Java面试中,最常被人问到的几个问题:
1. java.util.*包的UML结构图。
2. Vector和ArrayList、LinkedList区别 Hashtable 和 HashMap之间的区别
3. String、StringBuffer,StringBuilder之间区别。--回答--
1. Collection
|
|_List
| |_LinkedList
| |_ArrayList
| |_Vector
|
|_Set
|
|_Map
| |_HashMap
|
|_Compare,Comparetor
|
|_Dictionary
| |_Hashtable
|_ ...2. LinkedList内部以链表形式存储数据
ArrayList内部以数组形式存储数据。
Vector同ArrayList,不过它与ArrayList比较起来是thread-safe的。 Hashtable是继承了Dictionary,是线程安全的。HashMap实现了Map接口,不是线程安全的。
如何保证线程安全的?每个修改容器中数据的操作都是同步的(synchronized),因此保证了线程安全。3. String是长度不可变的,StringBuffer和StringBuilder长度都是可以变化的。
StringBuffer是线程安全的,StringBuilder不是线程安全的。
1. java.util.*包的UML结构图。
2. Vector和ArrayList、LinkedList区别 Hashtable 和 HashMap之间的区别
3. String、StringBuffer,StringBuilder之间区别。--回答--
1. Collection
|
|_List
| |_LinkedList
| |_ArrayList
| |_Vector
|
|_Set
|
|_Map
| |_HashMap
|
|_Compare,Comparetor
|
|_Dictionary
| |_Hashtable
|_ ...2. LinkedList内部以链表形式存储数据
ArrayList内部以数组形式存储数据。
Vector同ArrayList,不过它与ArrayList比较起来是thread-safe的。 Hashtable是继承了Dictionary,是线程安全的。HashMap实现了Map接口,不是线程安全的。
如何保证线程安全的?每个修改容器中数据的操作都是同步的(synchronized),因此保证了线程安全。3. String是长度不可变的,StringBuffer和StringBuilder长度都是可以变化的。
StringBuffer是线程安全的,StringBuilder不是线程安全的。
String buf1="this is a string";
定义一个字符串,用String就这样吧?应该长度不变。StringBuffer 是一组可变Unicode字符的序列。
StringBuilder是在处理单线程的时候,速度要比前者速度快,所以单线程多用StringBuilder。
其实有的东西都可以自己查API的,上面都有很详细的讲解的。
String str = "a";在内存中一个称为字符串常量池的地方就会放进这个“a”常量,当你再次定义
String str2 = "a";
的时候,JVM会查找常量池中有没有已经定义过的这个“a”,如果有就拿这个“a”赋给str2引用,如果你定义的是:
String str3 = "ab";
常量池中的"a"和"ab"显然是不相同的,那么又会在常量池中增加"ab" “常量”,现在常量池中就有“a”和“ab”两个常量,而不是原来是“a”修改为“ab”,可以想不断试图定义不同的字符串,内存开销有多大。StringBuilder是JAVA5新加的一个StringBuffer非同步版本,速度更快,使用方法一样。
StringBuilder是一个.Net的类,它就是用来完成Java的StringBuffer功能的类。如果是区别,就是命名和其要体现出来的含义不同,
StringBuilder强调其才用了Builder模式,其实还是聚合了一个Buffer来完成这个事情,那么这个类主要是退居为一个服务类型。
而StringBuffer强调出了这个类的实现方式。实际上.Net的String类的强大是非其他String类可比的。所以相关其他的类确实显得很次要了。
我还看到一个Java面试题。
Math.round(11.5) = 12
Math.round(-11.5) = -11但是在.NET里面就不是这样了。
Math.round(10.5) = 10
Math.round(11.5) = 12
Math.round(-11.5) = -12无论.NET还是JAVA,其类库都是很庞大的。
所以使用的时候我们最好的助手就是MSDN/JAVA API REFERENCE
Hashtable 则不可以
String s1 = "abc";
String s2 = new String("abc");
这两个的区别面试时也经常被问到。
String s1="abc"; // 文字常量"abc",存放在“文字池”里
String s2=new String("");//使用文字常量"abc"构造一个String对象,存放在heap里。这个操作中创建了2个String对象。
java.lang.StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。 在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。 例如,如果 z 引用一个当前内容为“start”的字符串生成器对象,则该方法调用 z.append("le") 将使字符串生成器包含“startle”,而 z.insert(4, "le") 将更改字符串生成器,使之包含“starlet”。将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。
s=new String("abc");
请问 s在s=new String("abc")中创建累几个对象?
如何实现啊!
StringBuilder没有提同步机制,所以线程不安全,适合单线程。但如果是单线程的话,要比StringBuffer快。
如果你定义
String s1 = new String("s1");
String s2 = new String("s2");
时,你做操作
s1 = s1 + s2;
这时内存中会再开辟出一个长度为s1.size() + s2.size()的内存,再将两个字符串放进去。