`
netxdiy
  • 浏览: 682858 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java集合Set List Map

阅读更多
Set ,List ,Map的区别和功能到底是怎样的?其实它是与数组区分开来的。
  数组:java数组的长度是固定的,在同一个数组中只能存放相同类型的数据,可以是基本数据类型,也可
  以存放引用类型的数据。
  java集合:存入于java.util包中,它不能存放基本类型数据,而只能存放对象的引用。
  Set (集):集合中的对象不按特定方式排序,并且没有重复对象。它的有些实现类能对集合中的对象按
  特定方式排序。与数学中的集合最接近,两者都不包含重复元素。
  List(列表):集合中的对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检
  索对象。List与数组有些相似。
  Map(映射):集合中的第一个元素包含一对键对象和值对象,集合中没有重复的键对象,值可以重复。
  它的有些实现类能对集合中的键对象进行排序。切记在用到MAP时一定需要传入两个参数
  键和值。
  例:
  import java.util.*;
  public static void print(Collection<? extends Object> c){
  Iterator<? extends Object> it = c.iterator();
  //遍历集合中的所有元素
  while(it.hasNext()){
  Object element = it.next();
  System.out.println(element);
  }
  }
  public static void main(String args[]){
  Set<String> set = new HashSet<String>();//<String>指定集合中元素的类型。
  set.add("Tom");
  set.add("Mary");
  set.add("Jack");
  print(set);
  List<String> list = new ArrayList<String>();
  list.add("Linda");
  lis.add("Mary");
  list.add("Rose");
  print(list);
  Map<String,String> map = new HashMap<String,String>();//两个参数,键和值
  map.put("M","男");
  map.put("F","女");//与实现了Collection接口的set,list加入元素的方法不一样。
  print(map.entrySet());//entrySet()返回SET视图
  }
  }
  要知道两个异常:ConcurrentModificatiojException和ClassCastException
  1、对一个集合不能够一边修改一边操作(除了用Iterator进行修改)不然将抛出ConcurrentModificatiojException异常。
  2、当试图将对象强制转换为不是实例的时,抛出ClassCastException异常。
  Set类
  由上图中可知实现Set接口的两个类有HashSet(无序)和TreeSet(实现了SortedSet接口、有序)
  1)TreeSet支持两种排序:自然排序(默认)和客户排序
  自然排序:实现了Comparable接口,通过compareTo(Object o)方法比较。只能向TreeSet集合中加入同类
  型的对象,并且这些对象要实现Comparable接口。
  例1:
  Set<Object> set = new TreeSet<Object>();
  set.add(new Integer(8);
  set.add(new String("9");//抛出ClassCastException异常
  例2:
  Test类没有实现了Comparable接口,带有一个 String 和 int 的成员变量。
  Set<Object> set = new TreeSet<Object>();
  set.add(new Test("A",5);
  set.add(new Test("B",6);//抛出ClassCastException异常
  这也是用TreeSet时要注意的地方
  2)HashSet:按照哈希算法来存取集合中的对象,具有很好的查找性能。当向集合中加入一个对象时,HashSet会调用对象的hashCode()方法来获得哈希码,然后根据这个哈希码进一步计算出对象在集合中的存放位置。跟数据结构中的散列存储概念一样。
  要明白一点的就是:当用户覆盖了object类的equals()方法,一定也要重写hashCode方法,而且TreetSet还要增加一个compareTo方法。
  例:
  import java.util.*;
  public class Demo2 implements Comparable{
  private String name;
  private int age;
  public Demo2(String a,int b){
  name = a;
  age = b;
  }
  public int getAge() {
  return age;
  }
  public void setAge(int age) {
  this.age = age;
  }
  public String getName() {
  return name;
  }
  public void setName(String name) {
  this.name = name;
  }
  public int compareTo(Object o) {
  Demo2 other = (Demo2)o;
//先按照name属性排序
  if(this.name.compareTo(other.getName())>0){System.out.println("1");return 1;}
  if(this.name.compareTo(other.getName())<0){System.out.println("2");return -1;}
  //再按照age属性排序
  if(this.age>other.getAge()){System.out.println("3");return 1;}
  if(this.age<other.getAge()){System.out.println("4");return -1;}
  return 0;
  }
  public boolean equals(Object o){
  if(this==o)return true;
  if(!(o instanceof Demo2))return false;
  final Demo2 other = (Demo2)o;
  if(this.name.equals(other.getName())&&this.age==other.getAge())
  return true;
  else
  return false;
  }
  public int hashCode(){
  int result;
  result=(name==null?0:name.hashCode());
  result=29*result+age;
  return result;
  }
  public static void main(String agrs[]){
  Set<Demo2> set = new TreeSet<Demo2>();
  Demo2 a = new Demo2("Tom",15);
  Demo2 b = new Demo2("Apple",16);
  set.add(a);
  set.add(b);
  Iterator<Demo2> it = set.iterator();
  while(it.hasNext()){
  Demo2 Demo2 = it.next();
  System.out.println(Demo2.getName()+" "+Demo2.getAge());
  }
  }
  }
  以上三个方法的重写必须理解。
  List类:主要特征是其元素以线性方式存储,集合中允许存放重复对象。
  ArrayList可以说是线性表,LinkedList可以说是链表。并不是自动排序的而是要通过Collection接口中sort()方法
  例:
  import java.util.*;
  public class Demo1{
  public static void insert(List<Integer> list,int data){
  ListIterator<Integer> it =list.listIterator();
  while(it.hasNext()){
  Integer in = it.next();
  if(data<=in.intValue()){
  it.previous();
  it.add(new Integer(data));
  break;
  }
  }
  }
  public static void main(String[] args) {
  List<Integer> list = new LinkedList<Integer>();
  list.add(new Integer(3));
  list.add(new Integer(2));
  list.add(new Integer(5));
  list.add(new Integer(9));
  Collections.sort(list);
  insert(list,6);
  System.out.println(Arrays.toString(list.toArray()));//toArray()返回一数组,Arrays.toString()输出数组。
  int a[] = new int[]{1,2,3};
  System.out.print(Arrays.toString(a));
  }
  }
  Map类:对容量,初始容量,大小,负载因子要知道这些知识点。
  Map map = new HashMap();
  for(int i=0; i<args.length; i++) {
  map.put(new Integer(i), args[i]);
  }
  System.out.println("HashMap的容量:" + map.size());
  System.out.println(map);
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics