集合框架

来源:互联网 发布:淘宝 红包套现 熟人 编辑:程序博客网 时间:2024/05/17 04:51

集合:

Collcetion是一个接口类,其继承了JAVA的迭代接口Iterable。

Collection接口有两个主要的子接口List和Set,Map不是Collection的子接口。

Collection中可以存储的元素无序,可以重复组各自独立的元素,即其内的的每个位置仅有一个元素,可以允许同时由多个null对象。

Collection接口中的方法如下:

size():int

isEmpty():boolean

contains(Object):boolean

iterator():iterator<E>

toArray():Object[]

toArray(T[])<T>:T[]

add(E):boolean

remove(Object):boolean

containsAll(Collection<?>):boolean

addAll(Collection<? extends E>):boolean

removeAll(Collection<?>):boolean

clear():void

equals(Object):boolean

hashCode():int

1)List接口

List接口中元素的特点为:存储的元素实现类排序,而且可以重复存储相关信息。

1)实现类ArrayList(数组线性表)

特点:类似数组的方式存储,因为他随机访问的速度极快。

缺点:不适合于在线性表中进行频繁的插入和删除操作,因为每次插入和删除都要移动数组中的元素。

注意:

a.如果在初始化ArrayList的时候没有指定初始化长度的话,默认的长度为10.

b.ArrayList在增加新元素的时候如果超过了原始的容量的话,ArrayList扩容ensureCapacity的方案为“原始容量*3/2+1

int newCapacity = (oldCapacity * 3)/2 1;

c.ArrayList是线程不安全的,在多线程的情况下不要使用。(多线程情况下可以使用Vector)

d.ArrayList实现遍历的几种方法

package com.yonyou.test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List
public class Test{
public static void main(String[] args) {
     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[] strArray=new String[list.size()];
    list.toArray(strArray);
    for(int i=0;i<strArray.length;i++) //这里也可以改写为foreach(String str:strArray)这种形式
    {
        System.out.println(strArray[i]);
    }
     
    //第三种遍历 使用迭代器进行相关遍历
     
     Iterator<String> ite=list.iterator();
     while(ite.hasNext())
     {
         System.out.println(ite.next());
     }
 }
}

2)LinkedList

LinkedList的链式线性表的特点为: 适合于在链表中间需要频繁进行插入和删除操作。

LinkedList的链式线性表的缺点为: 随机访问速度较慢。查找一个元素需要从头开始一个一个的找。

LinkedList的内部实现

LinkedList的内部是基于双向循环链表的结构来实现的。在LinkedList中有一个类似于c语言中结构体的Entry内部类。

         在Entry的内部类中包含了前一个元素的地址引用和后一个元素的地址引用类似于c语言中指针。

LinkedList不是线程安全的

         注意LinkedList和ArrayList一样也不是线程安全的,如果在对线程下面访问可以自己重写LinkedList

         然后在需要同步的方法上面加上同步关键字synchronized

LinkedList的遍历方法

package com.yonyou.test;
import java.util.LinkedList;
import java.util.List
public class Test{
public static void main(String[] args) {
    List<String> list=new LinkedList<String>();
    list.add("Hello");
    list.add("World");
    list.add("龙不吟,虎不啸");
    //LinkedList遍历的第一种方式使用数组的方式
    String[] strArray=new String[list.size()];
    list.toArray(strArray);
    for(String str:strArray)
    {
        System.out.println(str);
    }
    //LinkedList遍历的第二种方式
    for(String str:list)
    {
        System.out.println(str);   
    }
  }
}
LinkedList可以被当做堆栈来使用
2)Set接口
Set中的元素实现了不重复,类似集合的概念,无序,不允许有重复的元素,最多允许有一个null对象。
虽然Set中元素没有顺序,但是元素在set中的位置是有由该元素的HashCode决定的,其具体位置其实是固定的。
Set接口的常见实现类有HashSet,LinedHashSet和TreeSet这三个。
1)HashSet
HashSet是Set接口的最常见的实现类了。其底层是基于Hash算法进行存储相关元素的。

  a.HashSet中存放null值

        HashSet中时允许出入null值的,但是在HashSet中仅仅能够存入一个null值哦。

     b.HashSet中存储元素的位置是固定的

        HashSet中存储的元素的是无序的,这个没什么好说的,但是由于HashSet底层是基于Hash算法实现的,使用了hashcode,

        所以HashSet中相应的元素的位置是固定的哦。

     c.遍历HashSet的几种方法

package com.yonyou.test;
 
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Test{
public static void main(String[] args) {
     Set<String> set=new HashSet<String>();
     set.add("Hello");
     set.add("world");
     set.add("Hello");
     //遍历集合的第一种方法,使用数组的方法
     String[] strArray=new String[set.size()];
     strArray=set.toArray(strArray);
     for(String str:strArray)//此处也可以使用for(int i=0;i<strArray.length;i++)
     {
         System.out.println(str);
     }
     //遍历集合的第二中方法,使用set集合直接遍历
     for(String str:set)
     {
         System.out.println(str);
     }
      
     //遍历集合的第三种方法,使用iterator迭代器的方法
     Iterator<String> iterator=set.iterator();
     while(iterator.hasNext())
     {
         System.out.println(iterator.next());
     }
}
}

2)LinkHashSet

       LinkHashSet不仅是Set接口的子接口而且还是上面HashSet接口的子接口。

 对于LinkedHashSet而言,它和HashSet主要区别在于LinkedHashSet中存储的元素是在哈希算法的基础上增加了

     链式表的结构。

 3)TreeSet

       TreeSet是一种排序二叉树。存入Set集合中的值,会按照值的大小进行相关的排序操作。底层算法是基于红黑树来实现的。

       TreeSet和HashSet的主要区别在于TreeSet中的元素会按照相关的值进行排序~

       TreeSet和HashSet的区别和联系

       1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key
       2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.
       3. hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.
           a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.
           b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象
              才可以真正定位到键值对应的Entry.
           c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value
       4. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.
           a. Comparator可以在创建TreeMap时指定
           b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.
           c. TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了.

3)Map接口

Map接口实现的是一组Key-Value的键值对的组合。 Map中的每个成员方法由一个关键字(key)和一个值(value)构成。Map接口不直接继承于Collection接口(需要注意啦),因为它包装的是一组成对的“键-值”对象的集合,而且在Map接口的集合中也不能有重复的key出现,因为每个键只能与一个成员元素相对应。

Map接口的常见实现类HashMap、TreeMap、LinkedHashMap、Properties(继承HashTable)以及老版本的HashTable

HashMap

       HashMap实现了Map、CloneMap、Serializable三个接口,并且继承自AbstractMap类

         HashMap基于hash数组实现,若key的hash值相同则使用链表方式进行保存

 新建一个HashMap时,默认的话会初始化一个大小为16,负载因子为0.75的空的HashMap

在HashMap中当数据量很多时,并且已经达到了负载限度时,会重新做一次哈希,也就是说会再散列。调用的方法为resize(),并且java默认传入的参数为2*table.length。




0 0