11 集合

1 Collection接口

  常用的方法:

  add(Object e) 确保此 collection 包含指定的元素(可选操作)。

   size(): 获取集合中元素的个数

  remove(Object e): 移除元素

   clear(): 清空集合中元素

   contains(Object e): 判断集合中是否包含指定的元素

   isEmpty(): 判断集合是否为空

    iterator(): 获取集合对应的迭代器。

  元素数组和集合的区别:

   数组:一旦声明了数组长度无法改变,只能保持指定的数据类型,元素的数据类型必须相同,不能混排。

   集合:长度和动态扩容类型可以是任何类型,可以混合使用。

2 List接口(Collection接口)

  LIst接口存储一组不唯一,有序(插入顺序)的对象。

  ----ArrayList类:在内存中存储位置是连续的,线性结构(可变长度的数组),随机访问或遍历效率较高,但插入和删除元素效率较低.

  ----LinkedList类:在内存中存储位置是不连续的,链表结构,插入和删除元素时效率较高,但随机访问或遍历效率较低。

2.1 ArrayList

  ArrayList可以看作可变长度的数组,本质上就是通过数组实现的,在内存中存储空间是连续的。

  优点:随机访问或遍历时效率较高。

  缺点:添加和删除元素时效率较低。

  常用的构造方法

   ArrayList()  构造一个初始容量为 10 的空列表。

    ArrayList(int initialCapacity)  构造一个具有指定初始容量的空列表。

   eg:Collection list = new ArrayList();

  常用的方法:

    add(Object e):将元素添加到集合中。

   --Object get(int index):获取指定下标位置的元素.

*在调用add方法添加元素时,该元素会向上转型为Object类型,所有使用get方法获取是返回值为Object

  add(int index, E element) 将指定的元素插入此列表中的指定位置。

   get(int index) 返回此列表中指定位置上的元素。下标从0开始

   addAll(Collection<? extends E> c) 按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。

   set(int index, E element)用指定的元素替代此列表中指定位置上的元素。

   remove(int index)移除此列表中指定位置上的元素。

   remove(Object o) 移除此列表中首次出现的指定元素(如果存在)。

  泛型:限定集合中元素的类型。一旦对集合使用泛型,该集合中能容纳的元素类型就固定了。

   语法:List<E> list = new ArrayList<E>();  E为数据类型

  优点:1)可以避免强制转换

         2)可以消除黄色的警告。

2.2 LinkedList

  LinkedList类: 采用的链表结构进行存储,在内存中存储位置是不连续的,插入和删除元素时效率较高,但随机访问或遍历效率较低。

  优点:添加和删除元素是效率较高

  缺点:随机访问或遍历时效率较低。

  常用方法:

  add(Object o):将指定元素添加到此列表的结尾。

  add(int index, E element)在此列表中指定的位置插入指定的元素。

  addFirst(E e) 将指定元素插入此列表的开头。(LinkedList特有的)

  addLast(E e)将指定元素添加到此列表的结尾。(LinkedList特有的)

  getFirst() 返回此列表的第一个元素。

   getLast() 返回此列表的最后一个元素。

  removeFirst() 移除并返回此列表的第一个元素。

  removeLast() 移除并返回此列表的最后一个元素。

2.3 Vector

   Vector类似与ArrayList的线性结构,Vector是基于线程安全的,在多线程中使用;ArrayList是非线程安全的,效率较高。

2.4 Stack/Quence

  Stack栈LIFO/FILO:后进先出(Last In First Out),先进后出(First In Last Out)

  ---类似于玩具枪的弹夹,第一个压进去的子弹最后一个弹出

  ---入栈(压栈):将元素添加到栈中。

  ---出栈(弹栈):将元素从栈的顶部移除。

  Quence队列FIFO:先进先出(First In First Out)

2.5 Iterator接口

  java.util.Iterator接口:对 collection 进行迭代的迭代器。

   boolean hasNext()   如果仍有元素可以迭代,则返回 true。

  next() 返回迭代的下一个元素。

  使用迭代器进行遍历:

  Iterator<String> iter = list.iterator();

  while(iter.hasNext()){

  String str = iter.next();

  System.out.println(str);

  }

3 Set接口(Collection接口)

  Set接口: 无序,唯一(不重复)

3.1HashSet

  HashSet:采用哈希表(散列表)的方式存储。

  优点:查询,添加,删除效率较高

  缺点:无序(添加顺序)

  常用的构造方法:

   HashSet()  构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。

   HashSet(int initialCapacity) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。

  常用的方法:

   add(E e)如果此 set 中尚未包含指定元素,则添加指定元素。

   clear() 从此 set 中移除所有元素。

   contains(Object o) 如果此 set 包含指定元素,则返回 true。

   iterator()  返回对此 set 中元素进行迭代的迭代器。

   size()返回此 set 中的元素的数量(set 的容量)。

   remove(Object o)如果指定元素存在于此 set 中,则将其移除。

  HashSet如何保证其元素的唯一性?

  在添加元素时调用hashCode()获取元素的哈希码,判断要添加元素的哈希码是否相同,如果相同调用equals方法比较内容是否相同;如果哈希码不相同,equals方法将不再调用。

  如果equals相同,hash码肯定相同;hash码相同,equals结果不一定相同。

3.2 LinkedHashSet

  LinkedHashSet继承了HashSet,采用的是哈希码+链表的结构进行存储,其中的元素有序(添加顺序)。

  常用的构造方法

   LinkedHashSet() 构造一个带默认初始容量 (16) 和加载因子 (0.75) 的新空链接哈希 set

    LinkedHashSet(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的新空链接哈希 set。

  常用的方法:

    add(Object a):添加元素

    remove(Object a):移除指定的元素

    contains(Object a):是否包含指定的元素

    size():获取元素的个数。

   iterator():返回一个迭代器

3.3 TreeSet

  TreeSet:采用二叉树的方式进行存储,其中元素有序(大小顺序)。要添加元素是必须实现Comparable接口或传入一个比较器(需要实现Comparator接口)。

  原理:当向TreeSet容器添加元素时,会将当前元素的值与根节点/父节点的值进行比较,

    如果比根节点/父节点的值大,保存在右子节点上;

    如果比根节点/父节点的值小,保存在左子节点上。

  优点:有序,查询速度比List要快(折半查找)。

  常用的构造方法:

   TreeSet()  构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。插入该 set 的所有元素都必须实现 Comparable接口

  TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。

常用的方法:

   add(Object o): 添加元素

    remove(Object o): 移除元素

    contains(Object o): 如果此 set 包含指定的元素,则返回 true。

    size(): 返回 set 中的元素数(set 的容量)。

    iterator():返 回在此 set 中的元素上按升序进行迭代的迭代器

示例:在实现 Comparable接口时重写compareTo方法

  public class Student implements Comparable<Student>

  * 定义比较规则:

  比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数

  @Override

  public int compareTo(Student o) {

    // if(age>o.age){

    // return 1;

    // }else if(age==o.age){

    // return 0;

    // }else{

    // return -1;

    // }

    return age-o.age;

  }

4 Map接口

  Map接口并不是Collection接口的子接口,Map接口采用的键值对方式进行存储数据,提供key到value的映射。无序

4.1 HashMap

  HashMap:基于哈希表的 Map 接口的实现。

  常用的构造方法:

     HashMap() 构造一个具有默认初始容量 (16) 和默认加载因子(0.75) 的空HashMap。

      HashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。

  常用方法:

   put(K key, V value) 在此映射中关联指定值与指定键。

   get(Object key) 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。

    size() 返回此映射中的键-值映射关系数。

     remove(Object key) 从此映射中移除指定键的映射关系(如果存在)。

     clear() 从此映射中移除所有映射关系。

  containsKey(Object key)  如果此映射包含对于指定键的映射关系,则返回 true。

  containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。

4.2 Hashtable

  Hashtable与HashMap类似,不同之处主要是以下两点:

  1)HashMap是非线程安全的,而Hashtable是线程安全的

  2)HashMap中的键和值都运行为null,而Hashtable不允许。

4.3 LinkedHashMap

  java.util.LinkedHashMap:哈希表+链表结构,有序(添加顺序),继承了HashMap类。

  常用的构造方法:

    LinkedHashMap() 构造一个带默认初始容量 (16) 和加载因子 (0.75) 的空插入顺序 LinkedHashMap 实例

   LinkedHashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空插入顺序 LinkedHashMap 实例。

  常用的方法:

   put(K key, V value) 在此映射中关联指定值与指定键。

   get(Object key) 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。

   size() 返回此映射中的键-值映射关系数。

   remove(Object key) 从此映射中移除指定键的映射关系(如果存在)。

   clear() 从此映射中移除所有映射关系。

    containsKey(Object key)  如果此映射包含对于指定键的映射关系,则返回 true。

    containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。

  * Set<K> keySet() 返回此映射中所包含的键的 Set 视图。

  * Set<Map.Entry<K,V>> entrySet() 返回此映射所包含的映射关系的 Set 视图。

4.4 TreeMap

  TreeMap采用二叉树的方式存储,与TreeSet类似。其中的元素有序(大小顺序)。

  要求添加的元素必须是可比较大小

  1)实现Comparable接口

  2)创建一个比较器(实现Comparator接口)

  在添加元素时根据键的自然顺序进行存储数据。

  常用的构造函数:

   TreeMap() 使用键的自然顺序构造一个新的、空的树映射。 插入该映射的所有键都必须实现 Comparable 接口.

    TreeMap(Comparator<? super K> comparator)   构造一个新的、空的树映射,该映射根据给定比较器进行排序。

5 Collections类

  Collections类是一个对Collection集合进行操作的工具类型,其中提供一些静态的工具方法方便操作。

  Collection和Collections的区别:

  1) Collection是List和Set的父接口,而Collections是操作Collection集合的工具类。

  2)Collections(对Collection集合进行操作的工具类),类似Arrays类(对数组进行操作的工具类),提供了若干个静态的方法以方便操作集合。

  常用的方法:

    addAll(Collection<? super T> c, T... elements) 将所有指定元素添加到指定 collection 中。

    sort(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序。

    reverse(List<?> list)反转指定列表中元素的顺序。

   max(Collection<? extends T> coll) 根据元素的自然顺序,返回给定 collection 的最大元素。

    min(Collection<? extends T> coll) 根据元素的自然顺序 返回给定 collection 的最小元素。

    binarySearch(List<? extends Comparable<? super T>> list, T key) 使用二分搜索法搜索指定列表,以获得指定对象,必须根据列表元素的自然顺序对列表进行升序排序

  eg:Collections.sort(list);  //排序,默认按照升序进行排列

    Collections.reverse(list);  //反转:倒序输出

    int index = Collections.binarySearch(list, 9);  //二分查找:待查找的集合中元素必须有大小顺序

时间: 2024-07-31 22:06:01

11 集合的相关文章

Java学习日记-11 集合(1)

Collection接口集合中存储的只是对象的引用,不是对象本身. 1.ArrayList<E>类1.1ArrayList和Collection的关系 public interface List<E>extends Collection<E> public class ArrayList<E> implements List<E> 1.2构造方法 ArrayList() 构造一个初始容量为 10 的空列表. ArrayList(Collectio

5.11 集合 与 特殊集合

一 .Arraylist 集和 属性 功能 .count 获取arraylist中实际包含的元素数 方法 功能说明 .Add () 将对象添加到arraylist 结尾处 .clear () 从arraylist中移除所有元素 .Clone 创建ArrayList的浅表副本 .Contains () 确定某元素是否在arraylist 中 .indextOF() 返回Arraylist或它的一部分中某个值的第一匹配项的从0开始的索引 .insert () 将元素插入Arraylist 的制定索引

5.11 集合与特殊集合

一 .Arraylist 集和 属性 功能 .count 获取arraylist中实际包含的元素数 方法 功能说明 .Add () 将对象添加到arraylist 结尾处 .clear () 从arraylist中移除所有元素 .Clone 创建ArrayList的浅表副本 .Contains () 确定某元素是否在arraylist 中 .indextOF() 返回Arraylist或它的一部分中某个值的第一匹配项的从0开始的索引 .insert () 将元素插入Arraylist 的制定索引

2018.6.11 集合和泛型的课后练习总结

介绍Set接口和List接口的区别 提及 介绍Map接口 Collection表示一组对象,这些对象也称为collection的元素;一些 collection允许有重复的元素,而另一些则不允许;一些collection是有序的,而另一些则是无序的;JDK中不提供此接口的任何直接实 现,它提供更具体的子接口(如 Set 和 List)实现;Map没有继承Collection接口,Map提供key到value的映射;一个Map中不能包含相同key,每个key只能映射一个value;Map接口提供3

java入门篇11 --- 集合

无论什么语言,集合应当是我们最常用的一种类型啦,大体上分为有序列表.map.sey.队列 首先先来看一下有序列表, List内部跟数组一样也是按照先后顺序排放的,但对于增删,非常方便,list的实现大多是使用ArrayList实现的,先来看一下List的源码,这里面有一个<E>,这个就是泛型,java是面向对象语言,他在运行期间,才会将我们的类进行初始化,因此,就利用这一特性,我们输入指定的引用类型,注意必须是引用类型,基本类型不是类,JVM在编译是,会把它当作object,然后再运行期间就会

redis源码学习_整数集合

redis里面的整数集合保存的都是整数,有int_16.int_32和int_64这3种类型,和C++中的set容器差不多. 同时具备如下特点: 1.set里面的数不重复,均为唯一. 2.set里面的数是从小到大有序的,这在后面的intsetAdd函数中可以看到. 然后由于我们可以同时存储int_16.int_32和int_64这3种类型,一开始只能为一种类型.假设为int_32,那么我们要插入一个int_16类型的数,只需要找到位置直接插入就可以了:但是我们要插入一个int_64类型的数,我们

【集合】

1.1集合简介 在前面学习了Java数组,Java数组的长度是固定的,在同一个数组中只能存放相同类型的数据.数组可以存放基本类型的数据,也可以存放引用类型的数据. 在创建Java数组时,必须明确指定数组的长度.数组一旦创建,其长度就不能被改变.在许多应用中,一组数据的数目是不固定的.比如一个单位的员工数目是变化的.有老员工跳槽,也有新员工进来. 为了使程序能方便地存储和操纵数目不固定的一组数据,JDK类库提供了Java集合,所有Java集合类都位于java.util包中.与Java数组不同,Ja

集合【迭代器、增强for、泛型】

java.util.Collection接口 是集合的最顶层的接口,定义了集合共性的方法 接口无法直接创建对象,使用多态的方式创建对象 Collection<集合中的数据类型(泛型)> coll = new ArrayList<集合中的数据类型(泛型)>(); 迭代器 集合中存储数据的方式(数据类型)不一样,取出集合中元素的方式也不同,java给我们提供了一种公共的取出元素的方式,叫迭代器 描述迭代器的接口:java.util.Iterator 接口中的抽象方法: boolean

第十五章 接口和集合

1.  接口的关键字:interface 2.  接口的特性: 1)接口属性都是静态常量 2)方法都是抽象方法 3)实现类必须实现接口的所有方法 4)实现类可以实现多个接口 5)接口不能被实例化,没有构造方法 6)接口中的方法不能私有化 3.  实现的关键字:implements 4.  子类和父类是is a 的关系     实现类和接口是has a 的关系 5.  集合:可以存放一组不同或相同类的数据. 6.  接口: collection List Set 类        Arraylis