list集合
list接口继承自Collection接口,是单列集合的一个重要分支。在list集合中允许出现重复的元素,所有的元素是以一种现行方式进行存储的,在程序中可以通过所有来访问集合中的指定元素。
接下来我们来大概讲述一下list接口的特点:
- 它是一个元素存取有序的集合,存的元素是1,2,3,那么元素的存储就是按照1,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集合的遍历方式:
步骤:- 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。
- Set<string> keys = map.keySet();</string>
- 遍历键的Set集合,得到每一个键。
- 根据键,获取键所对应的值。
- 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。
for (String key : keys) { //key 就是键 //获取对应值 String value = map.get(key); System.out.println(key+"的CP是:"+value); }