浅谈java集合

  

1、集合的分类(都位于java.util包下)

 1)collection是集合的父类接口(map集合除外),set和list集合都是继承自他;

1> list接口

     1)他的实现类有Arraylist、Vector和LinkedList三种;

   Arraylist: 实现了长度可变的数组,在随机查找和遍历时效率比较高;往集合中添加元素是用add()方法;并且它是线程非同步的,ArrayList 增长当前长度的50%,插入删除效率低;

  LinkedList:采用链表存储方式,在插入、删除元素时比较方便;并且其中允许null值得存在;《list.add(null);》

  Vector: 他和Arraylist非常相似,唯一区别是他是线程安全的,即线程同步;每次增加原来长度的一倍;

2〉Set接口

  1)它的实现类有Hashset和ThreeSet;

  hashset:集合中元素无序,唯一,可以存放null值;线程非同步的;当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。简单的说,hashset集合存放元素是通过equals()方法比较相等,并且hashcode()的返回值也相等;如果要把一个对象放入集合中,重写该对象对应类的equals(),也应该重写其hashcode(),其规则是如果两个对象的equals比较返回值true,其hashcode值也应该相等;另外,对象中用来比较equals的属性也应该用来比叫hashcode值;

  threeSet:集合中元素有序,TreeSet是SortedSet接口的唯一实现类,他的两种排序方式为自然排序和定制排序;其中自然排序为默认的排序方式,定制排序需要实现comparable接口;

  这两种集合都需要通过迭代器来方问,因为他们都没有get();

2)Map集合的实现类hashmap、HashTable、TreeMap

1〉 Map集合是通过键——值对的方式来存放元素的;根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,但是他的只可以有多个null,不支持线程同步。

2〉 HashMap和hashTable区别:

  hashmap的元素可以为空,线程非安全的,hashtable的元素不可以为空,是线程安全的;

  Hashtable 比 HashMap 慢,因为它是同步的

  HashMap可以通过Map m = Collections.synchronizedMap(hashMap)来达到同步的效果。

  TreeMap的内部结构是一棵红黑树(又叫排序数,是二叉树的一种),使用链式存储,可以指定比较器Comparator,key需实现Comparable接口。key不能为null。存结点性能稍差,因为需要调整树结构;取结点用的是链表遍历,但是属于有序比较,性能中等。迭代遍历时用的树的中序遍历,是一个有序序列。适用于有排序需求的情况。

  3)迭代器(算法)

    一般遍历数组都是采用for循环或者增强for,这两个方法也可以用在集合框架,但是还有一种方法是采用迭代器遍历集合框架,它是一个对象,实现了Iterator 接口或ListIterator接口。

1〉遍历Arraylist集合

 

  List<String> list=new ArrayList<String>();
     list.add("Hello");
     list.add("World");
     list.add("HAHAHAHA");
     //第一种遍历方法使用foreach遍历List
     for (String str : list) {            //也可以改写for(int i=0;i<list.size();i++)这种形式
        System.out.println(str);

   //第二种方法,把链表变为数组相关内容进行遍历
  String [] s=new String[list.size()]
  list.toArray(s);
  for(int i=0,i<s.length,i++){
  system.out.print(s[i]);
}
  //第三种,使用迭代器进行遍历
  Iterator is=list.itrrator();
  while(is.haNext){
   system.out.print(is.next()) 

}

2> 遍历Map集合

 

 Map<String, String> map = new HashMap<String, String>();
      map.put("1", "value1");
      map.put("2", "value2");
      map.put("3", "value3");
   //第一种:普遍使用,二次取值
      System.out.println("通过Map.keySet遍历key和value:");
      for (String key : map.keySet()) {
       System.out.println("key= "+ key + " and value= " + map.get(key));
      }
    //第二种
      System.out.println("通过Map.entrySet使用iterator遍历key和value:");
        for(Entry<String,String> item: map.entrySet()){
     system.out.print(item.getKey()+"-"+item.getValue())
}
   //第三种
      System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
      for (String v : map.values()) {
       System.out.println("value= " + v);
      }
     }


  

 

 

 

  

 

posted @ 2017-05-13 15:45  ruanjiancainiao  阅读(138)  评论(0编辑  收藏  举报