疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java基础集合类


 

   

  集合

  定义:为了保存一些数目不确定的对象。JDK中提供了一系列特殊的类,这些类可以存储任意 类型的对象,并且长度可变,统称为集合。

  特点:

  1、长度可以发生改变

  2、只能存储对象

  3、可以存储多种类型对象(一般存储的还是同一种)

  集合和数组的区别

  1、长度问题

  数组固定

  集合可变

  2、存储元素问题

  数组可以是基本类型,也可以是引用类型。

  集合只能是引用类型。

  3、是否同一类型

  数组元素类型一致。

  集合元素类型可以不一致。

  单列集合collection

  集合体系的由来

  集合是存储多个元素的容器,但是,由于数据结构不同,java就提供了多种集合类。

  而这多种集合类有共性的功能,所以,通过不断的向上抽取,最终形成了集合体系

  结构。

  数据结构:数据存储的方式。

  程序 = 算法 + 数据结构

  Collection

  |--List:元素有序,元素可以重复(接口)

  |--ArrayList:查询快,增删慢,因为底层是数组结构,线程不安全,效率高

  |--Vector:查询快,增删慢,因为底层是数组结构,线程安全,效率低

  |--LinkedList:查询慢,增删快,因为底层是链表结构,线程不安全,效率高

  |--Set:元素无序并且不可以重复。注意:这里的无顺序是指存入和取出的顺序(接口)

  |--HashSet:不保证元素的迭代顺序。并且,不保证该顺序恒久不变。

  |--TreeSet:可以对元素进行排序并保持元素的唯一。

  如何学习和使用一个继承体系呢?

  学习顶层:因为顶层定义的是共性内容。

  使用底层:因为底层才是具体的实现

  Collection的功能

  1、添加功能

  boolean add(Object obj):向集合中添加一个元素。

  boolean addAll(Collection c):向集合中添加一个集合的元素。

  2、删除功能

  void clear():删除集合中所有的元素。

  boolean remove(Object obj):删除集合中指定的元素。

  boolean removeAll(Collection c):删除集合中指定的集合元素。

  3、判断功能

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

  boolean contains(Object obj):判断集合是否包含指定的元素。

  boolean containsAll(Collection c):判断集合是否包含指定的集合中的元素。

  4、遍历功能

  Iterator iterator():迭代器。

  hasNext():判断是否还有元素

  next():获取下一个元素

  5、长度功能

  int size():获得集合的元素个数。

  6、交集功能

  boolean retainAll(Collection c):判断集合中是否有相同的元素。

  7、转换功能

  Object[] toArray():把集合变成数组。

  迭代器的使用

  1、使用步骤

  1、通过集合对象获取迭代器对象。

  2、通过迭代器对象判断。

  3、通过迭代器对象获取。

  2、迭代器原理

  由于多种集合的数据结构不同,所以存储方式不同,所以,取出方式也不同。

  这个时候,我们就把判断和获取功能定义在了一个接口中,将来,遍历哪种

  集合的时候,只要该集合内部实现这个接口即可。

  3、迭代器源码

  public interface Iterator

  {

  public abstract boolean hasNext();

  public abstract Object next();

  }

  public interface Collection

  {

  public abstract Iterator iterator();

  }

  public interface List extends Collection

  {

  ...

  }

  public class ArrayList implements List

  {

  public Iterator iterator()

  {

  return new Itr();

  }

  private class Itr implements Iterator

  {

  public boolean hasNext(){...}

  public Object next(){...}

  }

  }

  集合的常见使用步骤:

  1、创建集合对象

  2、创建元素对象

  3、把元素添加到集合中

  4、遍历集合

  1、通过集合对象获取迭代器对象。

  2、通过迭代器对象判断。

  3、通过迭代器对象获取。

  Collection存储字符串和自定义对象并遍历。

  Collection c = new ArrayList();

  c.add("hello");

  c.add("world");

  c.add("java");

  Iterator it = c.iterator();

  while(it.hasNext())

  {

  String s = (String)it.next();

  System.out.println(s);

  }

  List的特有功能

  1、添加功能

  void add(int index,Object obj):

  2、删除功能

  Object remove(int index):

  3、修改功能

  Object set(int index,Object obj):

  4、获取功能

  Object get(int index):

  int indexOf(Object obj):

  ListIterator listIterator():

  List的遍历方式

  1、Iterator迭代器

  2、ListIterator迭代器(了解)

  3、普通for+get()

  ListIterator迭代器

  是Iterator的子接口。

  常见异常:并发修改异常

  1、并发修改异常的产生原因

  用迭代器遍历集合,用集合去操作集合。

  2、解决方案:

  1、使用集合操作。

  2、使用列表迭代器操作。

  Set

  Set的特点:

  元素无序,唯一。

  注意:这里的顺序是指存储和取出顺序。

  HashSet

  HashSet:不保证元素的迭代顺序。并且,不保证该顺序恒久不变。

  怎么保证的呢?

  HashSet底层数据结构是哈希表。

  它依赖两个方法:hashCode()和equals()

  顺序:

  首先,判断hashCode()值是否相同。

  相同:

  继续走equals()方法,根据其返回值:

  true:说明元素重复,不添加到集合。

  false:说明元素不重复,添加到集合。

  不同:直接添加到集合。

  怎么重写hashCode()和equals()方法呢?

  hashCode():

  把对象的所有成员变量值相加即可。

  如果是基本类型,就加值。如果是引用类型,就加哈希值。

  equals():

  A:this==obj

  B:!(objinstanceof Student)

  C:所有成员变量的值比较。基本类型用==,引用类型用equals()。

  我的总结:很重要的一点:往HashSet集合里面存入数据,要先后调用两个

  方法:hashCode方法和equals方法!!!

  TreeSet

  根据构造方法的不用,选择使用自然排序或者比较器排序。

  按照实际的需求,可以对元素进行排序。并且保证唯一。

  怎么保证的呢?

  排序:底层结构是二叉树。按照树节点进行存储和取出。

  两种实现:

  A:自然排序(元素具备比较性)

  TreeSet的无参构造,要求对象所属的类实现Comparable接口。

  B:比较器排序(集合具备比较性)

  TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。

  唯一:根据返回值是否为0。

  注意:

  如果同时有两种方案,以谁为主呢?以比较器为主。

  什么时候,使用哪种Collection集合。

  元素唯一吗?

  唯一:

  Set

  需要排序吗?

  需要:TreeSet

  不需要:HashSet

  不知道,用HashSet。

  不唯一:

  List

  需要安全码?

  需要:Vector

  不需要:ArrayList和LinkedList

  查询多:ArrayList

  增删多;LinkedList

  不知道,用ArrayList。

  Map

  Map是一个键值对形式的集合。它的元素都是有键和值组成。

  Map和Collection的区别?

  A:Map 是由键值对组成的集合,Map的键(key)是唯一的,值(value)可以重复。

  B:Collection 是有单列数据组成的集合,它的儿子List是可以重复的,Set是唯一的。

  HashMap和Hashtable的区别?

  HashMap:线程不安全,效率高。允许null键和值。

  Hashtable:线程安全,效率低。不允许null键和值。

  Map的功能:

  A:添加功能

  void put(Object key,Object value) 将指定的值与次映射中的指定键关联

  B:判断功能

  boolean containKey(Object key) 判断指定的键在集合中是否存在

  boolean containKey(Object value) 判断指定的值在集合中是否存在

  C:删除功能

  void clear() 清除所有键值对数据

  D:获取功能

  V get(Objecty key) 返回指定键映射的值,如果此映射不存在则返回nul

  Map的两种遍历方式

  A:丈夫找妻子

  a:把所有丈夫给集合起来。SetketSet()

  b:遍历丈夫集合,获取到每一个丈夫。增强for , 迭代器

  c:让丈夫去找妻子。get(Objectkey)

  B:根据结婚证找丈夫和妻子

  a:获取所有结婚证的集合。Set<>entrySet()

  b:遍历结婚证集合,获取到每一个结婚证对象。迭代器,增强for

  c:通过结婚证对象获取丈夫和妻子getKey()和getValue()

  Collections

  Collections操作集合的工具类:

  static void reverse(List list):反转指定List集合中的顺序;(和ListItertor的逆序排列一样!)

  static void shuffle(List list):对集合元素随机排序

  static void sort(List list):自然升序排序

  static vois swap(List list,int i, int j):将指定的List集合i处元素和j处元素进行交换;

  staticint binarySearch(List list, Object key) 使用二分搜索法搜索指定列表,以获得指定对象。

  调用之前 必须调用 Collections.sort(List list)(完成自然排序)。