java 学习笔记之集合框架

          java集合框架中主要包含Collection接口Map接口。

【概览】

Collection接口

    |-------------------List子接口(元素存储有序、可重复的集合,可看做动态数组。其底层仍旧是由数组实现的)

             |-------------------------ArrayList、LinkedList、Vector

         |-------------------Set子接口(元素存储无序、可重复的集合)

             |-------------------------HashSet、LinkedHashSet、TreeSet

Map接口:存储  “  键 --值  ”对,即key- value

             |-------------------------HashMap、LinkeHashMap、TressMap、Hashtable(主要子类:Properties 配置文件类)

List

1.ArrayList(主要的实现类)

//底层采用数组实现

相对于Collection接口,List新增加的方法如下:

void  add(int dex, Object ele)

boolean addAll(int index,Collection eles)

Object get(int index)

int indexof(Object obj)

int lastIndexOf(Object obj)

remove(int index)  set(int index)  subList()

//主要方法:

增  add(int dex, Object ele)   // 相当于增加,其他位置的元素会向后移动。

删  remove(int index)    插入 add(int index,Object obj)

查  get(int index)      长度 size()

改  set(int index)      // 调用该方法需要本来位置上存在元素,否则会报错。

                  // 相当于“替换”,其他元素位置不发生改变

2.LinkedList

//底层采用链表实现

//常在有频繁的插如、删除等操作时候采用

3.Vector

//较为古老、效率较低、线程安全、但不推荐实现

-------------

【遍历方法】

 //一般采用增强for循环或者iterator迭代器

 eg:

       Collection coll=new ArrayList();

       coll.add(123);

       coll.add(234);

       coll.add(345);

       coll.add(new Date());

       coll.add(“aa”);

       //增强for循环:

       for(Object  asd : coll){

       System.out.println(asd);   

       }

      

       //Iterator迭代器

       Iterator i =coll.iterator();

       While(i.hasNext){

       System.out.println(i.next());     

       }

【Set】

1.HashSet

//主要实现类

//Set中常用的方法都是Collection下定义的

//存储无序的,不可重复的元素

eg:

      Set set=new HashSet();

      set.add(123);

      set.add(345);

      set.add(456);

      set.add(“AA”);

      set.add(“BB”);

      set.add(null);

总结:

       Set接口:

 * 1. 存储无序的,不可重复的 常用方法一般是Collection下定义的

 * 2..无序!=随机。 第一次是随机排列,但再运行时顺序不变。即存储无序。

 * 3..不可重复性。 向set中添加相同的元素时,之后的不能添加进去。当加入的对象相同时。要重写对象所在类的equals和hashcode方法。

 * 不同于list。

 * 因为其无序性,不同于list的有序性。

 * 解释:Set中的元素如何存储。

 * 因为使用了哈希算法。故即使对象内容,但每个对象的哈希值不同。所以可以存入Set中

 * 存储是先调用hascode 计算对象的哈希值。然后存储到指定位置。若该位置已有,再调用equals方法。比较两个对象的内容是否相同。

2.LinkedHashSet

       * 使用链表维护了添加顺序,导致遍历LinkedHashSet集合元素时,是按照添加顺序进行遍历的。

       * 性能略低于HashSet,但在迭代访问set中的全部元素时有很好的性能。   

       * 不允许对象重复,对于对象仍旧需要重写hashcode和equals方法

      

3.TreeSet

      Set set=new TressSet();

      set.add(new Person(“CC”,24);

      set.add(new Person(“BB”,25);

      set.add(new Person(“AA”,23);

      set.add(new Person(“DD”,21);

      set.add(new Person(“EE”,22);

 

/*1.向TreeSet中添加的元素必须是同一个类的。

2.可以按照添加进集合中的元素的指定的顺序遍历。像String包装类就按照从小到大的顺序遍历。

3.当向TreeSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序。

4.自然排序:要求自定义类实现Comparable接口并重写CompareTo方法,在此方法中知名按照属性的哪个属性进行排列,以下的例子是按照name属性排列。

5.定制排序:①创建一个实现Comparator接口的对象,注意此处是comparator。与Comparable不一样。

             ②将此对象作为形参传递给TreeSet的构造器中。

             ③向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象。

当自定义类(Person类)添加进TreeSet中时,依据此方法(CompareTo方法)确定按照哪个属性排列。向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的此属性值相同,但是程序认为这两个对象时相同的,进而后一个对象不能添加进TreeSet。

compareTo与hashCode以及equals三者需要保持一致。

Comparator com=new Comparator(){

       Public int compare(Object o1,Object o2){

          If(o1 instance of 自定义类 && o2 instance of 自定义类)

          自定义类  a1= (自定义类)o1;

          自定义类  a2= (自定义类)o2;

              return a1.getId().compareTo(c2.getId());

       }

          return  0;

}

Public int CompareTo(Object o){

       If(o instanceof Person){

       Person p= (Person)o;

       return this.name.CompareTo(p.name)

   }

   return 0;//返回0意味着两个属性一样,也就填不进去

}

故重写方法修改为以下:

Public int CompareTo(Object o){

       If(o instanceof Person){

       Person p= (Person)o;

       int i=this.age.compareTo(p.age);

       if(i=0){

       return this.name.compareTo(p.name)

       }else{

       return i;

       }

   }

   return 0;//返回0意味着两个属性一样,也就填不进去

}

【Map】

  1. Map与Collection并列存在。用于保存具有映射关系的数据:key-value
  2. Key用set来存放。不允许重复。Value相当于Collection。 

  Map

           |----------HashMap:     Map的主要实现类

                  |----------LinkedHashMap:使用链表维护添加进Map中的顺序,按照添加的顺序遍历,类似HashSet与LinkedHashSet的关系

                  |----------TreeMap 按照添加进Map中的元素的key的指定属性进行排列。要求:Key必须是同一个类对象。自然排序、定制排序。同HashSet一样。Comparable 和Comparator。

                  |----------Hashtable

                             |----------Properties(配置文件类) 

 1、HashMap

 //一个键值对是一个Entry ,所有的Entry是用Set存放的,也是不可重复的。

若存的是自定义类,其一定要重写equls方法。判断两个key是否相同,若相同则只能添加进后添加的那个元素。

【遍历】

//遍历key

Set set=map.keySet();

For(Object asd: set){

System.out.println(asd);

}

//遍历value

Collection values=map.values();

Iterator i= values.iterator();

While(i.havaNext()){

      System.out.println(i.next());

}

//遍历key-value

方式一:即根据objget方法结合遍历set一起成组合输出

      Set set=map.keySet();

      for(Object asd: set){

            System.out.println(obj+”----”+map.get(obj));

      }

 

方法二:使用EntrySet

      Set set=map.entrySet();

For(Object obj: set){

    Map.Entry entry=(Map.Entry)obj;

    System.out.println(entry.getKey()+entry.getValue());

}

 

 

2.LinkedHashMap

//使用链表维护添加进入的顺序,类似于HashSetLinkedHashSet的关系

 

3.TreeMap:同上

猜你喜欢

转载自www.cnblogs.com/Mr-Sulin/p/9670890.html