Java集合

概念:

  为了保证数量不确定的数据,以及保存具有映射关系的数据,Java提供集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类;集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象;而集合里只能保存对象(对象的引用变量);

  集合类主要由两个接口派生:Collection和Map,

;

Collection和Iterator接口:

  Collection接口是List、Set和Queue接口的父接口;

方法摘要
 booleanadd(E e)
          确保此 collection 包含指定的元素(可选操作)。
 booleanaddAll(Collection<? extends E> c)
          将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
 voidclear()
          移除此 collection 中的所有元素(可选操作)。
 booleancontains(Object o)
          如果此 collection 包含指定的元素,则返回 true。
 booleancontainsAll(Collection<?> c)
          如果此 collection 包含指定 collection 中的所有元素,则返回 true。
 booleanequals(Object o)
          比较此 collection 与指定对象是否相等。
 inthashCode()
          返回此 collection 的哈希码值。
 booleanisEmpty()
          如果此 collection 不包含元素,则返回 true。
 Iterator<E>iterator()
          返回在此 collection 的元素上进行迭代的迭代器。
 booleanremove(Object o)
          从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
 booleanremoveAll(Collection<?> c)
          移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
 booleanretainAll(Collection<?> c)
          仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
 intsize()
          返回此 collection 中的元素数。
 Object[]toArray()
          返回包含此 collection 中所有元素的数组。
<T> T[]
toArray(T[] a)
          返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

  Iterator接口:

  主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器;

public void test(){
        MyList list=new MyListImpl();
        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
        Iterator iterator=list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

也可以用foreach循环遍历集合元素;

Set接口:

  Set是一种集合元素无序、不可重复的集合,Set根据equals方法判断两个对象是否相同

HashSet类:

  HashSet按哈希算法来存储集合中的元素,具有很好的存取和查找性能,底层数据结构是哈希表;

  • 不能保证元素的排列顺序,顺序有可能发生变化;
  • 不是同步的;
  • 集合元素值可以是null;
  • 依赖hashCode()和equals()来保证元素唯一性;

LinkedHashSet类:

  也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使元素是以插入的顺序来保存的;

TreeSet类:

  TreeSet是SortedSet接口的唯一实现,TreeSet可以保证集合元素处于排序状态(不是根据元素的插入顺序进行排序,而是根据元素实际值来进行排序),TreeSet采用红黑树的数据结构对元素进行排序,TreeSet支持两种排序:自然排序和定制排序;

  自然排序:

  TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将其按升序排列;如果将一个对象添加进TreeSet时,该对象的类必须实现Comparable接口,否则程序将会抛出异常;

  定制排序(比较器):

  TreeSet的自然排序是根据集合元素的大小,TreeSet将它们以升序排列;如果需要实现定制排序,例如以降序排列,则可以使用Comparator接口的帮助,该接口包含了int compare(T o1,T o2)方法;

List接口:

  List是一种集合元素有序、可重复的集合

ArrayList类:

  底层是数组,查询快,增删慢,线程不安全(非同步),效率高;

Vector类:

  底层是数组,查询快,增删慢,线程安全(同步),效率低;

LinkedList类:

LinkedList实现了List接口也实现了Deque接口,即它可以当做双向队列使用,也可以当作栈使用,底层是链表,查询慢,增删块,线程不安全,效率高;

Map接口:

  Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。Map的key不允许重复。如果把Map里的所有key放在一起,它们就组成了一个Set集合;

Map接口定义的方法:

 

方法摘要
 voidclear()
          从此映射中移除所有映射关系(可选操作)。
 booleancontainsKey(Object key)
          如果此映射包含指定键的映射关系,则返回 true。
 booleancontainsValue(Object value)
          如果此映射将一个或多个键映射到指定值,则返回 true。
 Set<Map.Entry<K,V>>entrySet()
          返回此映射中包含的映射关系的 Set 视图。
 booleanequals(Object o)
          比较指定的对象与此映射是否相等。
 Vget(Object key)
          返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
 inthashCode()
          返回此映射的哈希码值。
 booleanisEmpty()
          如果此映射未包含键-值映射关系,则返回 true。
 Set<K>keySet()
          返回此映射中包含的键的 Set 视图。
 Vput(K key, V value)
          将指定的值与此映射中的指定键关联(可选操作)。
 voidputAll(Map<? extends K,? extends V> m)
          从指定映射中将所有映射关系复制到此映射中(可选操作)。
 Vremove(Object key)
          如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
 intsize()
          返回此映射中的键-值映射关系数。
 Collection<V>values()
          返回此映射中包含的值的 Collection 视图。

Map中包括一个内部类:Entry,该类封装了一个key—value对:

 

方法摘要
 booleanequals(Object o)
          比较指定对象与此项的相等性。
 KgetKey()
          返回与此项对应的键。
 VgetValue()
          返回与此项对应的值。
 inthashCode()
          返回此映射项的哈希码值。
 VsetValue(V value)
          用指定的值替换与此项对应的值(可选操作)。

HashMap类和Hashtable类:

  • HashMap和Hashtable都是Map接口的典型实现类;
  • Hashtable继承自Dictionary类,HashMap继承自AbstractMap抽象类;
  • 在HashMap中,null可以作为键且只能有一个,可以有一个或多个key所对应的值为null,Hashtable中不允许键值为null;
  • Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的,因此Hashtable比HashMap慢;
  • 两者哈希值的使用不同,Hashtable直接使用对象的hashcode,而HashMap需要重新计算hash值,而且用于代替求模;
  • Hashtable中hash数组默认大小是11,增加的方式是old*2+1,HashMap中hash数组的默认大小是16,增加为old*2;
  • 当使用自定义类作为HashMap,Hashtable的key时,要使重写该类的equals(Object obj)和hashCode方法的判断标准一致;

SortedMap接口和TreeMap实现类:

  与TreeSet类似,TreeMap也是基于红黑树对TreeMap中所有key进行排序,从而保证TreeMap中所有key-value对处于有序状态;

  TreeMap的两种排序方式:

  • 自然排序:TreeMap的所有key必须实现Comparable接口,而且所有key应该是同一个类的对象,否则会抛出ClassCastException异常;
  • 比较器排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中所有key进行排序,采用定制排序时不要求Map的key实现Comparable接口;

Collections工具类:

   Java提供了一个操作Set、List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法;

排序操作:

  • static void reverse(List list):反转指定List集合中的元素;
  • static void sort(List list):根据元素的自然顺序对指定List集合的元素按升序进行排序;
  • static void sort(List list,Comparator c):根据指定Comparator 产生的顺序对List集合的元素进行排序;
  • static void swap(List list,int i,int j):将指定List集合中i处元素和j处元素进行交换;
  • static void rotate(List list,int distance):根据指定的距离轮换指定列表中的元素;

查找、替换操作:

  • static int binarySearch(List list,Object key):使用二分搜索法搜索指定List集合,以获得指定对象在List集合中的索引,List中的元素需有序;
  • static Object max(Collection coll):根据元素的自然顺序,返回给定集合中的最大元素;
  • static Object min(Collection coll):根据元素的自然顺序,返回给定集合中的最小元素;
  • static bollean replaceAll(List list,Object oldVal,Object newVal):使用一个新值替换旧值;

同步控制:

  Collections类中提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而可以解决多线程并发访问集合时的线程问题;

Collection collection=Collections.synchronizedCollection(new ArrayList<>());

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream答案

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值