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.   

    String长度不可变请问什么意思?
      

  2.   

     String buf=new String("this is a string");
     String buf1="this is a string";
    定义一个字符串,用String就这样吧?应该长度不变。StringBuffer 是一组可变Unicode字符的序列。
    StringBuilder是在处理单线程的时候,速度要比前者速度快,所以单线程多用StringBuilder。
    其实有的东西都可以自己查API的,上面都有很详细的讲解的。
      

  3.   

    第3个问题:如果你声明、定义了
    String str = "a";在内存中一个称为字符串常量池的地方就会放进这个“a”常量,当你再次定义
    String str2 = "a";
    的时候,JVM会查找常量池中有没有已经定义过的这个“a”,如果有就拿这个“a”赋给str2引用,如果你定义的是:
    String str3 = "ab";
    常量池中的"a"和"ab"显然是不相同的,那么又会在常量池中增加"ab" “常量”,现在常量池中就有“a”和“ab”两个常量,而不是原来是“a”修改为“ab”,可以想不断试图定义不同的字符串,内存开销有多大。StringBuilder是JAVA5新加的一个StringBuffer非同步版本,速度更快,使用方法一样。
      

  4.   

    StringBuilder和StringBuffer,可能没有差别。
    StringBuilder是一个.Net的类,它就是用来完成Java的StringBuffer功能的类。如果是区别,就是命名和其要体现出来的含义不同,
    StringBuilder强调其才用了Builder模式,其实还是聚合了一个Buffer来完成这个事情,那么这个类主要是退居为一个服务类型。
    而StringBuffer强调出了这个类的实现方式。实际上.Net的String类的强大是非其他String类可比的。所以相关其他的类确实显得很次要了。
      

  5.   

    今天复习.NET的时候看到了新词汇StringBuilder....马上就有兄弟帮忙帖,我真是  呵呵
      

  6.   

    Collection与Map,Comparator是同级的HashTable也实现了Map接口
      

  7.   

    java和.NET中数据类型很多都是类似的。
    我还看到一个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
      

  8.   

    说的对!Collection与Map,Comparator是同级的接口,Collection接口是继承了Iterator接口。Hashtable继承了Dictionary类,实现了Map接口。public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>, Cloneable, SerializableHashMap继承了AbstractMap,实现了Map接口。public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable
      

  9.   

    HashMap key值可以有一个为null value可多个为null
    Hashtable 则不可以
      

  10.   

    ding
    String s1 = "abc";
    String s2 = new String("abc");
    这两个的区别面试时也经常被问到。
      

  11.   

    StringBuffer, StringBuilder 方法几乎是一样的,只不过 StringBuffer 中的方法都是同步方法,而且 StringBuilder 中的方法都不是同步的,而且它是 JDK 5.0 新增的。
      

  12.   

    是的。
    String s1="abc"; // 文字常量"abc",存放在“文字池”里
    String s2=new String("");//使用文字常量"abc"构造一个String对象,存放在heap里。这个操作中创建了2个String对象。
      

  13.   

    ava.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。 通常,如果 sb 引用 StringBuilder 的一个实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。
    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。
      

  14.   

        String s="abc";
        s=new String("abc");
    请问 s在s=new String("abc")中创建累几个对象?
      

  15.   

    一个实体类比如person,它里面的属性相应的set和get方法已经有。编写一个程序将person类里所有的包含‘Name‘字符串的属性的值进行反转。 
     
     
    如何实现啊!
      

  16.   

    莫非 JAVA 抄袭c# 里面的 StringBuilder?!!
      

  17.   

    StringBuffer提供了同步机制,所以并发线程访问是线程安全的。适合多线程。
    StringBuilder没有提同步机制,所以线程不安全,适合单线程。但如果是单线程的话,要比StringBuffer快。
      

  18.   

    string长度不可变是指在内存中
    如果你定义
    String s1 = new String("s1");
    String s2 = new String("s2");
    时,你做操作
    s1 = s1 + s2;
    这时内存中会再开辟出一个长度为s1.size() + s2.size()的内存,再将两个字符串放进去。