Java集合类的使用

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 = new ArrayList();

    改成

    List users = 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 = new ArrayList<Integer>();

    list.add(new Integer(42));

    list.add(43);

##. Map的迭代取值

    Map<String,String> map = new HashMap<String, String>();
    for(Map.Entry<String, String> entry : map.entrySet()){
        entry.getKey();
        entry.getValue();
    }


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

     Map<String,String> map = new HashMap<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 = new ArrayList<String>();
     list.add("rose");
     list.add("tony"); 
     list.add("adson"); 

    // 第一种For Each遍历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);
      }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值