list集合

list接口继承自Collection接口,是单列集合的一个重要分支。在list集合中允许出现重复的元素,所有的元素是以一种现行方式进行存储的,在程序中可以通过所有来访问集合中的指定元素。
接下来我们来大概讲述一下list接口的特点:

  1. 它是一个元素存取有序的集合,存的元素是1,2,3,那么元素的存储就是按照1,2,3来完成的。
  2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素,和数组中的索引是一样的。
  3. 集合中允许有重复的元素,并且可以通过元素的equals方法,来比较是否有重复的元素。
  • 下面是list集合特有的方法:
    • public void add(int index,E element):将制定的元素,添加到该集合中的指定位置上。
    • public E get(int index ):返回集合中指定索引的元素。
    • public E remove(int index):删除集合中指定索引的元素,返回的是删除的元素。
    • public E set (int index,E element):用指定元素替换集合中指定位置的元素,返回值是更新前的元素。
      ArrayList集合是List的子类,数据存储的结构是数组结构,元素增删慢,查找快。

      LinkedList集合

      linkedList集合是list的子类,因此list中的所有方法linkedList都能用。
      linkedList集合是一个双向链表集合,,对linkedList集合元素的添加和删除经常涉及到收尾操作,因此
      linkedList集合提供了大量收尾操作的方法。
  • public void addFirst(E e):将指定元素插入此列表的开头。
  • public void addLast(E e):将指定元素添加到此列表的结尾。
  • public E getFirst():返回此列表的第一个元素。
  • public E getLast():返回此列表的最后一个元素。
  • public E removeFirst():移除并返回此列表的第一个元素。
  • public E removeLast():移除并返回此列表的最后一个元素。
  • public E pop():从此列表所表示的堆栈处弹出一个元素。
  • public void push(E e):将元素推入此列表所表示的堆栈。
  • public boolean isEmpty():如果列表不包含元素,则返回true。

Set接口

set集合同样也是继承自Collection接口,但是set集合中的方法基本与Collection一直,没有太多的扩展功能,只是比Collection接口更加严格了,与 List接口不同的是,Set集合中的元素无序,并且都会以某种规则保证存入的元素不会出现重复

HashSet集合

HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。HashSet底层的实现其实是一个HashMap支持。
HashSet是根据对象的哈希值来确定元素在集合中的存储位置,钦此具有良好的存取和查找性能,保证元素唯一性的方式依赖于:hashCode与equals方法。
下面我们来说HashSet集合存储数据的结构(哈希表)
什么是哈希表呢?

JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

简单的来说,哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的。
如果给HashSet存放自定义类型元素时,需要重写对象中的HashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一。

LinkedHashSet(有序)

HashSet集合可以保证元素唯一,可是元素存放进去的是没有顺序的,如果我们想要保证有序,那么该怎么办呢?
在HashSet下面中有一个子类LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。
下面将有一段演示代码:

public class LinkedHashSetDemo {
    public static void main(String[] args) {
        Set<String> set = new LinkedHashSet<String>();
        set.add("bbb");
        set.add("aaa");
        set.add("abc");
        set.add("bbc");
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}
结果:怎么样存进去,就怎么样取出
  bbb
  aaa
  abc
  bbc

Collections

下面讲述的是一个集合工具类,用来对集合进行操作。具体有如下方法:

  • public static <t> boolean addAll(Collectiuon<t> c,T...element):往集合中添加一些元素。</t></t>
  • public static void shuffle(List<?> list):打乱集合中的顺序
  • public static <t> void sort(List<t> list):将集合中元素按照默认规则排序。</t></t>
  • public static <t> void sort(List<t> list,Comparator<? super T>):将集合中元素按照指定规则排序。</t></t>

那么我们要怎么按照指定规则进行排序呢,接下来我们就来说说Comparator比较器。

将这个之前我们先来说说这个方法:
public static <t> void sort (List<t> list ):将集合中元素按照默认规则排序。
如果存储的类型是字符串类型呢?看如下代码:</t></t>

public class CollectionsDemo2 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("cba");
list.add("aba");
list.add("sba");
list.add("nba");
//排序方法
Collections.sort(list);
System.out.println(list);
}
}
结果:[aba, cba, nba, sba]

可以看出输出结果是按照首字母排序的,这种规则是摩恩规则完成字符串的排序,那么默认规则是怎么定义出来的呢?
简单的说就是两个对象之间比较大小,在Java中提供了两种比较实现的方式,一种是比较死板的采用Comparable接口去实现,另外一种是灵活的,当我需要做排序的时候再去选择的。
那么 public static <t> void sort(List<t> list)这个方法实际上要求了被排序的类型需要实现Comparable接口完成比较的功能
String类实现了这个接口,并完成了比较规则的定义,但是这样就把这种规则写死了,那比如我想要字符串按照第
一个字符降序排列,那么这样就要修改String的源代码,这是不可能的了,那么这个时候我们可以使用
public static <t> void sort(List<t> list,Comparator<? super T> ) 方法灵活的完成,这个里面就涉及到了
Comparator这个接口,位于位于java.util包下,排序是comparator能实现的功能之一,该接口代表一个比较器,比
较器具有可比性!顾名思义就是做排序的,通俗地讲需要比较两个对象谁排在前谁排在后,那么比较的方法就是:
* public int compare(String o1, String o2) :比较其两个参数的顺序。
* 两个对象比较的结果有三种:大于,等于,小于。
* 如果要按照升序排序,则o1小于o2,返回(负数),相等返回0,01大于02返回(正数) 如果要按照
降序排序 则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)
代码如下:</t></t></t></t>

public class CollectionsDemo3 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("cba");
list.add("aba");
list.add("sba");
list.add("nba");
//排序方法 按照第一个单词的降序
Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
    return o2.charAt(0) ‐ o1.charAt(0);
        }
    });
    System.out.println(list);
    }
}
结果:[sba, nba, cba, aba]

Map

  • Collection中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储。
  • Map集合中,元素是成对存在的,每个元素由键与值两部分组成,通过键可以找到对应的值。
  • Collection中的集合成为单列集合,Map集合中称为双列集合。
  • Map中集合不能包含重复的键,但是值是可以重复的。每个键只能对应一个值。

    Map常用的子类

  • HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致(无序)。由于要保证键的唯一,不重复,需要重写键的hashCode方法、equals方法。
  • LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用哈希表结构+链表结构,通过链表结构可以保证元素的存取顺序一致;通过哈希表解雇可以保证键的唯一、不重复,需要重写键的hashCode、equals方法。
  • Map接口中定义的常用方法:*
  • public V put (K key , V value):把指定的键与指定的值添加到Map集合中。
  • public V remove(Object key):把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值。
  • public V get(Object key):根据指定的键,在Map获取对应的值。
  • public Set<k> keySet():获取Map集合中所有的键,存储到Set集合中。</k>
  • public Set<Map.Entry<K,V>> entrySet();获取到Map集合中所有的键值对对象的集合(Set)
    Map集合的遍历方式:
    步骤:
    1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。
      • Set<string> keys = map.keySet();</string>
    2. 遍历键的Set集合,得到每一个键。
    3. 根据键,获取键所对应的值。
for (String key : keys) {
//key 就是键
//获取对应值
String value = map.get(key);
System.out.println(key+"的CP是:"+value);
}