泛型技术

广泛的类型,jdk5.0版本的技术

  • 泛型激素不只是只能在集合使用,合理使用即可

当定义类或定义方法时,不能确定类中成员属性的类型或不能确定方法的参数类型时可以使用泛型技术来先定义着,使用时再来确定泛型的类型。

格式

  • 定义泛型时
  • <l类型名> 常用大写字母来表示:E T U R V K ...
  • 使用泛型时
  • <具体的类型名> 类型名是引用类型

泛型技术属于一种安全机制,可以将运行时会出现的问题提前至编译时期,同时也不需要做强转等操作和类型判断。

自定义泛型

  • 泛型类
  • 修饰符 class 类名<T1,T2,……>{}
  • 泛型类上的泛型,整个类都可以使用,也可不使用
  • 创建泛型类对象时,确定泛型类型,如果不确定类型,相当于是Object类型。
  • 格式
  • class Test{
    T t;
    public void method(T t){
    }
    }
  • 泛型方法
  • 修饰符 <T1,T2,...> 返回值类型 方法名(T1 t1, T2 t2,...){}
  • 泛型方法上的泛型,仅限于当前这个方法使用。
  • 当调用泛型方法时,确定泛型类型。
  • 静态方法不能直接使用泛型类上的泛型,因为静态方法不需要对象,而类上的泛型是在创建对象时确定类型的
  • 泛型接口
  • 修饰符 interface 接口名<T1,T2,……>
  • 接口上的泛型,接口中可以使用也可以不使用。
  • 确定接口泛型
  • 1、定义实现类时直接确定
  • 2、创建实现类对象时确定类型
  • 泛型限定(参数)
  • :占位符、通配符,可认为相当于Object
  • :接受E类型或E的子类型————下限
  • : 接受 E类型或E的父类型 ---下限

集合

理解

  • 是容器,用于存储数据

数组和集合区别

  • 数组
  • 1.大小固定,不能改变其长度
  • 2.可以存储基本也可以存储引用
  • 3.只能存储同一种类型数据
  • 4.有下标,通过下标进行操作数据
  • 集合
  • 1.大小可变
  • 2.只能存储引用
  • 3.不同类型数据
  • 4.有的容器有下标,有的没有

单列集合

  • 一个数据一个数据存储
  • 方法
  • add
  • remove
  • size
  • 遍历
  • for-each
  • 迭代器

双列集合

  • 一对数据一对数据存储
  • 方法
  • put
  • get(key)
  • size
  • 遍历
  • keySet()
  • entrySet()

Collection

  • List接口 有序,可重复
  • ArrayList
  • LinkedList
  • Vector 元老
  • Set接口无序,不可重复
  • HashSet
  • LinkedHashSet
  • TreeSet

Map接口

  • HashMap
  • LinkedHashMap
  • TreeMap
  • Hashtable 元老

数组

  • 适合查找,增删慢

链表(单向)

  • 适合增删,查找慢

Collection

是单列集合的根接口,该接口中定义的方法所有的子类都继承了。

常用方法

  • add()
  • 增加
  • remove()
- 删除


  • clear()
- 清除所有元素


  • size()
- 元素个数


  • contains()
- 查看是否包含


  • isEmpty()
- 集合是否为空


  • 带all方法
  • c1.addAll(c2)
  • 把另一个集合添加进去
  • c1.containsAll(c2)
  • 是否包含另一个集合所有元素
  • c1.removeAll(c2)
  • 删除另一个集合所有元素
  • c1.retainAll(c2)
  • coll和coll1中取交集

遍历几个元素

  • 1、转数组
  • toArray()
  • 2、迭代器
  • 步骤
  • Iterator i =c.Iterator();
  • while(i.hasNext){
    i.next();
    }
  • 1.并发修改异常
  • 对集合对象,进行了并发操作(使用集合方法操作同时使用迭代器方法操作)
    解决:要么都使用迭代器要么都使用集合中的方法
  • 2.hashNext()
  • 判断后,后边只能调用一次next方法,如果调用多个next方法可能
    出现NoSuchElementException异常。
  • 3、for-each语句
  • 注意:集合中存储的是对象,实际存储的是对象的引用地址值

List接口

特点

  • 有序,存入的顺序和取出元素的顺序一定一致
  • 有索引,从0开始,可以进行精确控制(插、获取、修改、异常)
  • 可以有重复的数据,包括null

方法

  • List接口除了继承Collection中的方法以外,新增了一些方法,这些方法都是与index有关。
  • 新增
  • add(index,element)
  • 增加
  • remove(index)
  • 删除
  • set(index,newElement)
  • 修改
  • get(index)
  • 取索引位置数据
  • listIterator
  • 列表迭代器,List接口特有的
  • listIterator(index)
  • 指定位置遍历
  • 方法
  • previous()
    返回列表中的前一个元素
  • next()
    返回列表中的下一个元素。

实现类

  • Vector
  • 底层实现原理是:可变数组。线程安全对象,效率慢,是List接口的一个现实类。jdk1.0。
  • 具有List接口的的所有方法
  • 提取索引返回元素
  • get(index)
  • elementAt(index)
  • LinkedList
  • 底层实现原理是:双向链接列表实现。线程不安全对象,jdk1.2版本,允许存储null元素。
  • 新增了方法:在列表的头和尾允许做get、insert、remove方法。
  • 适合增删,查询慢
  • ArrayList
  • 底层实现原理
  • 可变数组,有下标。线程不安全对象。jdk1.2版本。运行存储null元素。
  • 适合增删,查询慢
  • 法与Vector基本相同,除了线程不安全外,ArrayList替代了Vector。
  • 存不下,按照原长度的1.5倍扩充
  • 构造方法
  • ArrayList()
  • 默认容量为10
  • ArrayList(指定容量)

Set接口

特点:无序,不能存储

所有方法都来自于Collection接口。

Set实现类

  • TreeSet
  • 特点:
  • 存储的元素默认会按照自然顺序进行排序,也可以根据指定的比较器方式
    进行元素排序,最终是按照默认还是比较器取决于调用的构造方法。
  • 底层实现原理
  • 二叉树算法
  • 构造方法:
  • new TreeSet<>()
  • new TreeSet<>(Comparator)
  • 自然顺序
  • 依赖于Comparable接口,调用add方法时,元素会转为Comparable,根据该接口中的compareTo方法的返回值进行元素排序和是否存入。返回值:正整数、负整数、0
  • 比较器
  • 调用add方法时,元素会自动调用Comparator接口中的compare方法,根据该方法的返回值进行元素排序和是否存入。返回值:正整数、负整数、0。
  • 定义类实现Comparator,建立自己的排序方式。
  • 匿名内部类来实现。
  • HashSet
  • 特点
  • 使用哈希算法实现
  • 乱序、不可重复
  • 允许存储null元素,线程不安全
  • 哈希表算法
  • 每个对象都有一个哈希值(int类型的一个数字),默认不同对象有不同的哈希值,通过重写hashCode方法,可以实现不同对象有相同的哈希值。
  • 当存储元素时,元素先计算自身的哈希值(hashCode),将哈希值进行计算折算为下标值,
    找到位置,如果这个位置没有数据,直接存入;如果位置有数据,进行equals比较,是否是同一对象,如果是同一对象就不存入,如果不是同一对象,则需要存入。
  • jdk1.7前,出现哈希冲突,采用链表方式存储数据(进行equals比较)
  • jdk1.8后:出现哈希冲突,节点个数大于8,size大于64,采用红黑树(二叉树)算法,存储数据,从而减少equals比较。
  • 总结
  • 哈希值唯一直接存入,不唯一调用equals方法。
  • 当存储自定义对象,要保证元素唯一(属性信息值唯一):需重写hashCode和equals方法
  • hashCode:计算表达式,使用属性进行编写。
    equals:属性信息比较

Map接口

用于存储一对一的数据容器,

一对数据:key=value(键值对,一个映射)

注:key唯一,value可以重复

常用方法

  • put(key,value)
  • 添加
  • get(key)
  • 取value
  • size()
  • 查看大小
  • remove(key)
  • 移除
  • containsKey()/containsValue()
  • 查看是否存在键/值
  • isEmpty()
  • 查看map是否为空

遍历

  • Map不能直接遍历,需双列变成单列
  • keySet()
  • 将所有的key取出,存储到Set中,遍历Set,通过Map中的get(key)方法,获取key对应的value
  • entrySet()
  • 将Map中的键值对的映射关系取出,存储到Set中。
  • 该数据类型:Map.Entry
    Map.Entry中提供了getkey和getValue方法,分别取取关系中的key和value

实现类

  • Hashtable
  • key采用哈希表算法,保证唯一性,因此key需要重写hashCode和equals方法。
  • 不允许存储null作为键和值。

线程安全对象。


  • HashMap
  • key采用哈希表算法,保证唯一性,因此key需要重写hashCode和equals方法。
  • 允许存储null作为键和值。

线程不安全对象。


  • 子类
  • LinkedHashMap
  • key:链表+哈希表
  • 特点:有序,不可重复,线程不安全
  • TreeMap
  • 可以采用红黑树(二叉树)算法,保证元素唯一,并按照顺序排序。
  • 顺序:自然顺序Comparable或比较器Comparator顺序,看调用的构造方法。

Collections

jdk5.1特性

  • 可变参数
  • 参数列表中的参数个数可改变
  • 参数类型... 参数名
  • 赋值时:赋值个数大于等于0即可
  • 实际底层原理就是一个数组,调用时会自动创建数组,并将数据存储到数组
  • 注:
  1. 在一个参数列表中,只能最多有一个可变参数
  2. 可变参数必须在参数列表的最后一个位置

集合工具类,类中成员静态的

  • 方法
  • addAll(集合,T… elements)
  • sort(集合)
  • shuffle(集合)

集合和数组转换问题

  • 将集合转为数组,Collection中提供的方法
  • Object[] toArray():
  • 将数组转为集合
  • List Arrays.asList(T...)