您的位置:首页 > 编程语言 > Java开发

[置顶] Java集合类的使用

2016-02-17 10:31 603 查看

Java集合类的使用

集合类按接口分为以下两类:Collection接口和Map接口

Collection接口的特点

    List集合代表一个有序集合,允许集合中存在相同的元素,允许多个null 元素.

    Set集合不允许包含相同的元素, 并且最多包含一个null 元素。

    Queue模拟队列的数据结构,关注元素被处理时的顺序, 队列通常以FIFO(先进先出),

         不过优先级队列和 LIFO 队列或堆栈例外。

实现Collection接口的一些常用类

    ArrayList可以将它理解成一个可增长的数组,它提供快速迭代和快速随机访问的能力。

   LinkedList 中的元素之间是双链接的,当需要快速插入和删除时LinkedList成为List中的不二选择。

    Vector是ArrayList的线程安全版本,性能比ArrayList要低,现在已经很少使用。

    HashSet当不希望集合中有重复值,并且不关心元素之间的顺序时可以使用此类。

   LinkedHashset 当不希望集合中有重复值,并且希望按照元素的插入顺序进行迭代遍历时可采用此类。

    TreeSet当不希望集合中有重复值,并且希望按照元素的自然顺序进行排序时可以采用此类。

             (自然顺序意思是某种和插入顺序无关,而是和元素本身的内容和特质有关的排序方式,

               譬如“abc”排在“abd”前面。)

Map接口的特点

    Map关注元素的Key:Value映射关系,以Key标识唯一性,相同的Key会覆盖掉之前的Value。

实现Map接口的一些常用类

    HashMap当需要键值对表示,又不关心顺序时可采用HashMap。

    Hashtable注意Hashtable中的t是小写的,它是HashMap的线程安全版本,现在已经很少使用。

   LinkedHashMap 当需要键值对,并且关心插入顺序时可采用它。

    TreeMap当需要键值对,并关心元素的自然排序时可采用它。

##.在声明集合变量时,不应该使用具体的类,用合适的接口

    ArrayList users = newArrayList();

    改成

    Listusers = new ArrayList();

##. 关于线程安全

   ArrayList,LinkedList类不是线程安全的, 如果想共享在多线程下使用,

   这最好在创建时用以下方式创建,以防止意外对列表进行不同步的访问:

    List list= Collections.synchronizedList(new ArrayList(...));

    List list= Collections.synchronizedList(new LinkedList(...));

   

   HashMap,LinkedHashMap类不是线程安全的, 如果想共享在多线程下使用,

   这最好在创建时用以下方式创建,以防止意外对列表进行不同步的访问:

    Map m =Collections.synchronizedMap(new HashMap(...));

    Map m =Collections.synchronizedMap(new LinkedHashMap(...));

   关于ConcurrentHashMap,这个类与Hashtable一样是线程安全的,但性能比Hashtable要好很多,

    但需注意此类与Hashtable 相似,但与HashMap 不同,它不允许将null 用作键或值,

    还有不要频繁调用ConcurrentHashMap.size()方法,这个方法要遍历Map才能得出结果,性能不好。

   

##. 后进先出集合类Stack,Deque

##.基本数据类型的的自动装箱

   我们知道集合中存放的是对象,而不能是基本数据类型,在Java5之后可以使用自动装箱功能,

   更方便的使用集合类

   List<Integer> list = newArrayList<Integer>();

   list.add(new Integer(42));

   list.add(43);

##.Map的迭代取值

   Map<String,String> map = newHashMap<String, String>();

   for(Map.Entry<String, String>entry : map.entrySet()){

       entry.getKey();

       entry.getValue();

    }

##.将Map对象加上“写保护”

    Map<String,String> map = newHashMap<String, String>();

     //这个操作将使unmodMap 对象不支持对元素的变更操作,否则报UnsupportedOperationException

    Map<String,String> unmodMap =Collections.unmodifiableMap(map);

##.不要过度类型强制转换,向上转型是安全的,向下转则有可能会报错

   如将一个对象强制转换为ArrayList,但是实际上List就可以啦。过度强制转会导致ClassCastException错误,

    而且也会给测试带来麻烦。

   printUsers((ArrayList)getUsers());

    改成

    printUsers((List)getUsers());

##. ArrayList的排序

    List<String> list =new ArrayList<String>();

    list.add("abc");

    list.add("def"); 

    list.add("tony");

    list.add("amy");

    list.add("leon"); 

     Collections.sort(list);  // 元素的自然顺序

    Collections.sort(list, new Comparator(){ //自定义Comparator排序

         public int compare(Object o1, Object o2){

             if(o1.equals(o2)){

                 return 0;

             }

             return 1;

      }});

##.数组和List之间的转换

     数组转LIST

     String[] array = {"a","b","c"};

     List<String> list =Arrays.asList(array);

      LIST转数组

     array = (String[])list.toArray();

     array = list.toArray(new String[0]);

 ##.几种遍历LIST的方法

    List<String> list = newArrayList<String>();

    list.add("rose");

    list.add("tony"); 

     list.add("adson"); 

    // 第一种ForEach遍历LIST,其实这是编译器帮你做的Iterator操作

    for(String s : list){//注意: list不能为null,否则NPE

        System.out.println(s);

    }

    // 第二种Iterator遍历LIST

    Iterator<String> iter =list.iterator();

    while(iter.hasNext()){

        String s = iter.next();

        System.out.println(s);

     }

     // 第三种通过元素下标遍历

     for(int i=0; i<list.size(); i++){

         String s = list.get(i);

         System.out.println(s);

     }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: