Java--泛型、List、Set集合

来源:互联网 发布:android post json 编辑:程序博客网 时间:2024/06/07 12:10

一、泛型

在java集合中,因为集合可以存储任何引用类型,所以当集合中存储了不同的元素时在进行集合的遍历,这其中如果存在类型转换的话,就和很容易出现ClassCastException:类转换异常,为了解决这一在运行时期出现的异常,Java中引进一个概念,那就是泛型。

泛型:把数据类型的明确工作提供提前到了创建对象或者是调用方法的时期明确的一种特殊类型.参数化类型,可以像参数一样进行传递
   格式:<引用类型>:泛型只能放引用类型

比如:ArrayList<String> array = new ArrayList<String>() ;这个集合对象中就只能存储字符串类型的元素,如果放入非字符串的元素,程序就会报错,这就将运行时期异常提前到了编译时期,提高了程序的安全性。

泛型可以应用在接口,类,或者方法上,主要用在集合中比较多。泛型中还有一个概念就是通配符。

泛型的高级:通配符
  <?> :可以是任意类型,包括Object类型以及任意的Java类
  <? extends E>:向下限定,E类型以及E类型的子类
  <? super E>:向上限定,E类型以及E类型的父类

二、List集合

List集合有三个子实现类ArrayList、Vector


List集合的子实现类的特点:

ArrayList:
底层数据结构是数组的形式,满足数组结构的特点:查询快,增删慢
从线程安全问题来看:线程不安全的,不同步,执行效率高

Vector:
底层数据结构是数组的形式,查询快,增删慢
从线程角度看:线程安全的类,同步,执行效率低
LinkedList:
底层数据结构是链接列表,特点:查询慢,增删快
从线程角度看:线程不安全的一个类,不同步,执行效率高

如果实现多线程程序,一般要是安全的类:
StringBuffer,Vector<E>,hashtable<K,V>

synchronized(同步锁对象){
代码;
}

如果在一般的需求中没有指明使用集合去完成,都默认采用ArrayList
如果需求中要考虑线程安全,那么使用Vector集合!

1)ArrayList集合

ArrayList是List集合的自实现类,它元素可以重复,并且存储和取出一致,其他的功能已经在前面说过了,这里就不在重复叙述了。

2)Vector

特有功能:

public void addElement(E obj)------->相当于:add(Object e)

public Enumeration<E> elements()----->相当于:Iterator iterator() ;


Enumeration<E>接口:向量的组件枚举有两个方法
boolean hasMoreElements():------>相当于:hasNext()
Object nextElement():----------->相当于:next();

3)LinkedList
底层数据结构是链接列表,特点:查询慢,增删快
从线程角度看:线程不安全的一个类,不同步,执行效率高

特有功能:
添加功能:
public void addFirst(E e)将指定元素插入此列表的开头。
public void addLast(E e)将指定元素添加到此列表的结尾。
获取功能:
public Object getFirst()返回此列表的第一个元素
public Object getLast()返回此列表的最后一个元素。
删除功能:
public Object removeFirst()移除并返回此列表的第一个元素。
public Object removeLast()移除并返回此列表的最后一个元素。

三、Set集合

Set接口:Set集合继承自Collection集合
  
  Set:底层数据结构是一个哈希表,能保证元素是唯一的,元素不重复!
  它通过它的子实现了HashSet集合去实例化,HashSet集合底层是HashMap集合的实例!

 List集合和Set集合的区别在于:
 Set:元素是唯一的,无序性(存储和取出不一致)
 List:元素可以重复,有序性(存储和取出一致)
Set集合的子实现类:

1)HashSet

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。

2)LinkedHashSet

LinkedHashSet集合:
    由哈希表保证元素的唯一性、由链接列表来保证元素的有序性!

3)TreeSet
TreeSet:Set集合中的一个重点
  
  TreeSet集合底层是依赖于TreeMap的实例,而TreeMap<K,V>是依赖于红黑树结构实现的
  分两种:自然排序、比较器排序
  这种排序的使用取决于开发者是用什么样的构造方法

需要注意的是:

当TreeSet集合存储自定义对象并遍历,实现自然排序,自定义类必须要实现compareable接口,重写comapreTo()方法,这和其底层源码有关。

使用TreeSet集合的比较器排序:
   依赖于构造方法:public TreeSet(Comparator<E> comparator)
  有两种方式实现比较器排序:
方式1:自定义一个类,类实现Comparator接口,作为子实现类。
方式2:可以使用接口的匿名内部类来实现:开发中,由于减少代码书写量,不需要自定义接口的子实现类。


LinkedHashSet
原创粉丝点击