疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java -- 容器使用 Set, List, Map, Queue


 

   Java -- 容器使用 Set, List, Map, Queue
 
  1. ArrayList
 
  ArrayList<String> c = new ArrayList<String>();
 
  c.add("hello");
 
  c.add("world");
 
  String a = new String("aya");
 
  c.add(a);
 
  for( Object obj : c  )
 
  {
 
  System.out.println( (String)obj );
 
  }
 
  c.set(2, "111");
 
  Iterator<String> it = c.iterator();
 
  while(it.hasNext())
 
  {
 
  System.out.println( (String)it.next() );
 
  }
 
  ArrayList 的迭代器还有 ListIterator 可以有正反两种查询,先hasNext知道最后 hasPrevious才能有值
 
  [java] view plaincopy
 
  ListIterator<String> it2 = c.listIterator();
 
  while(it2.hasNext())
 
  {
 
  System.out.println( "hasNext " + (String)it2.next() );
 
  }
 
  while(it2.hasPrevious())
 
  {
 
  System.out.println( "hasPrevious " + (String)it2.previous() );
 
  }
  2. HashSet 集合是无序的。
 
  HashSet集合判断两个元素相等的标准是两个对象通过equals 方法比较相等,并且两个对象的hashCode()方法返回值也相等。
 
  向HashSet中添加可变对象时,必须小心,如果修改HashSet集合中的对象有可能导致该对象与集合中其他对象相等,从而导致Hashset无法准确访问该对象。
 
  3. TreeSet 集合有序
 
  由于TreeSet有序, 所有有访问第一个,前一个,后一个,最后一个并可以截取子集。
 
  排序的顺序并不是根据插入的顺序,而是根据元素实际值来排序。
 
  TreeSet<Integer> nums = new TreeSet<Integer>();
 
  nums.add(4);
 
  nums.add(3);
 
  nums.add(2);
 
  nums.add(1);
 
  System.out.println(nums);  //整个集合
 
  System.out.println(nums.first());
 
  System.out.println(nums.last());
 
  System.out.println(nums.headSet(3)); //小于3,但不包括3
 
  System.out.println(nums.tailSet(3)); //大于等于3
 
  System.out.println(nums.subSet(1, 3));  大于等于1,小于3
 
  结果为
 
  [1, 2, 3, 4]
 
  1
 
  4
 
  [1, 2]
 
  [3, 4]
 
  [1, 2]
 
  TreeSet自然排序:根据元素大小,升序排列。 对于TreeSet判断两个元素相等的标准是,两个对象通过equals方法比较返回true,并且通过compareTo(Object obj)比较 返回0.
 
  和HashSet一样集合中为可变对象时,修改对象值后可能容易出错,为了健壮性,HashSet和TreeSet推荐放入不可变对象。
 
  TreeSet定序排列: 使用comparator接口帮助。
 
  4. EnumSet 是一个专为枚举类设计的集合类,其中所有的值都是指定枚举类型的枚举值。没有暴露构造器,必须用静态方法创建。
 
  enum Season
 
  {
 
  SPRING,SUMMER,FALL,WINTER;
 
  }
 
  public class Main {
 
  public static void main(String[] args) {
 
  EnumSet es1 = EnumSet.allOf(Season.class); //创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值
 
  System.out.println(es1);
 
  EnumSet es2 = EnumSet.noneOf(Season.class); //空集合,但指定其中的元素是Season类的枚举值
 
  System.out.println(es2);
 
  es2.add(Season.SPRING);
 
  es2.add(Season.SUMMER);
 
  System.out.println(es2);
 
  EnumSet es3 = EnumSet.of(Season.SPRING, Season.SUMMER); // 以指定枚举值创建EnumSet
 
  System.out.println(es3);
 
  EnumSet es4 = EnumSet.range(Season.SPRING, Season.FALL); // 范围值
 
  System.out.println(es4);
 
  EnumSet es5 = EnumSet.complementOf(es4); //Season中 除去es4里剩下的部分 为es5
 
  System.out.println(es5);
 
  }
 
  }
 
 输出结果:
 
  [SPRING, SUMMER, FALL, WINTER]
 
  []
 
  [SPRING, SUMMER]
 
  [SPRING, SUMMER]
 
  [SPRING, SUMMER, FALL]
 
  [WINTER]
 
  5. LinkedList 不仅可以当做双向队列使用,还可以当做"栈"使用,其包含有 pop出栈 和 push入栈 方法
 
  LinkedList<String> books = new LinkedList<String>();
 
  books.offer("test1");  //加入队列尾部
 
  books.push("test2");   //入栈
 
  books.offerFirst("test3"); //放入头部
 
  for(int i=0; i<books.size(); i++)
 
  {
 
  System.out.println( books.get(i) );
 
  }
 
  System.out.println( books.peekFirst() ); //访问不删除
 
  System.out.println( "log1: " + books );
 
  System.out.println( books.pollFirst() );  //访问并删除
 
  System.out.println( "log2: " + books );
 
  输出结果:
 
  test3
 
  test2
 
  test1
 
  test3
 
  log1: [test3, test2, test1]
 
  test3
 
  log2: [test2, test1]
 
  6. Map
 
  HashMap 和 HashTable 判断Value相等的条件只需要equals方法返回true即可,判断Key相等的条件是equals()和hashCode()返回值都相等。
 
  LinkedHashMap以链表来维护内部顺序。性能低于HashMap,消耗低于TreeMap.
 
  TreeMap key的排序也是根据红黑树排列,有两种排序方式,自然排序和定制排序。
 
  WeekHashMap 只保留key对应对象的弱引用,可能被垃圾回收。
 
  enum Season
 
  {
 
  SPRING,SUMMER,FALL,WINTER;
 
  }
 
  public class Main {
 
  public static void main(String[] args) {
 
  HashMap<Integer, String> map1 = new HashMap<Integer, String>();
 
  map1.put(1, "hello");
 
  map1.put(2, "world");
 
  System.out.println(map1);
 
  System.out.println(map1.containsKey(3));
 
  System.out.println(map1.containsValue("world"));
 
  map1.put(2, "aya");
 
  System.out.println(map1);
 
  for(Map.Entry<Integer, String> m : map1.entrySet())
 
  {
 
  System.out.println(m);
 
  System.out.println(m.getKey());
 
  }
 
  EnumMap map2 = new EnumMap(Season.class);
 
  map2.put(Season.SPRING, "spring");
 
  map2.put(Season.SUMMER, "summer");
 
  System.out.println(map2);
 
  }
 
  }