Day2-java泛型与集合

jiay-gm-xxrj- / 2023-05-27 / 原文

 
  1. Set接口及实现类的使用  了解
  2. 对象顺序,Comparable接口及其使用
  3. Queue接口和实现类的使用  了解
  4. Map接口及实现类的使用
  5. Collections类的实用方法操作List对象
  6. StreamAPI的使用  了解

泛型类型 

取出和输入不用强制类型转换

泛型是带一个或多个类型参数的类或接口

Node<T> node = new Node<T>();
或者
Node<T> node = new Node<>();

泛型类型的使用与方法调用类似,方法调用需向方法传递参数,使用泛型需传递一个类型参数,即用某个具体的类型替换T。

常用的类型参数名:

E(元素)、K(键)、N(数字)、T(类型)、V(值)。

泛型可能具有多个类型参数,但在类和接口的声明中,每个参数名必须是唯一的。例

 

public interface Entry<K,V>{
    public K getKey();
    public V getValue();
}

Pair<Integer,String> p1 = new Pair<>(20,"twenty");
Pair<String,String> p2 = new Pair<>("China","Beijing");

 

泛型方法

泛型方法是带类型参数的方法,类的成员方法和构造方法都可以定义为泛型方法。

泛型方法类型参数的作用域仅限于声明的方法和构造方法内。

可为静态也可为非静态。

public static <T> void swap(T[] array,int i,int j){
}

通配符(?)的使用

public static void printList(List<?> list){
}

表示该方法可接受的元素是任何类型的List对象

有界类型参数

限制传递类型参数的类型种类。

有界类型分为上界和下界,上界用extends指定,下届用super指定.

例:声明上(下)界类型参数,使用?,后跟extends(super)关键字,然后是上(下)界类型

List<? extends Number> numberList

 

集合框架

集合是集中存放一组对象的一个对象。相当于一个容器,提供保存,获取和操作其他元素的方法。

java集合框架由Collection和Map构成,Collection对象用于存放一组对象,Map对象用于存放一组“关键字/值”的对象。

 Collection接口的集合操作常用方法可分为基本操作,批量操作,数组操作,流操作。

基本操作:有添加元素,删除指定元素,返回集合中元素的个数,返回集合的迭代器对象。

  • add(E e):向集合中添加元素e;
  • remove(Object o):从集合中删除指定的元素o;
  • contains(Object o):返回集合中是否包含指定的元素o;
  • size():返回集合中包含的元素个数;
  • iterator():返回包含所有元素的迭代器对象

批量操作:

  • addAll(Collection<? extends E> c):将集合c中的所有元素添加到当前集合中;
  • removeAll(Collection<?>c):从当前集合中删除c中的所有元素;
  • containsAll(Collection<?>c):返回当前集合是否包含c中的所有元素;
  • retainAll(Collection<?>c):在当前集合中只保留指定集合c中的元素,其他元素删除;
  • clear():将集合清空

数组操作:将集合元素转换成数组元素

  • Object[ ] toArray():返回包含集合中所有元素的对象数组

List接口及实现类

List接口是Collection的子接口,实现一种线性表的数据结构,存放在List中的元素都从下标0开始,可包含重复元素。

List的操作:既继承Collection的方法,还实现可定位访问、查找、迭代、返回子线性表

  • get(int index):返回指定下标处的元素;
  • set(int index,E element):修改指定下标处的元素;
  • add(int index,E element):将指定元素插入到指定下标处;
  • remove(int index):删除指定下标处的元素;
  • iterator():获得表的遍历器;
  • indexOf(Object o):查找指定对象第一次出现的位置;
  • lastIndexOf(Object o):查找指定对象最后一次出现的位置;
  • List<E>subList(int from,int to):返回从from到to元素的一个子线性表;

List虽然继承Collection,但有的操作不同,如:remove():从线性表中删除指定首次出现的元素

                     add()和addAll():将元素插入到线性表的末尾

ArrayList类

通过数组实现的集合对象,元素可以动态地增加和删除,快速访问、频繁的增删。

ArrayList的构造方法:

  • ArrayList():创建一个空的数组线性表对象,默认初始容量为10,线性表大小自动增大
  • ArrayList(Collection c):用集合c中的对象创建一个线性表对象
  • ArrayList(int initialCapacity):创建一个空的线性表对象,指定初始容量

遍历集合元素

方法:1简单的for循环、2增强的for循环、3用Iterator迭代器对象

1

for(int i=0;i<bigCities.size();i++){
        System.out.print(bigCities.get(i)+" ");
}

2

for (String city : bigCities){
    System.out.println(city);
}

含义:将集合bigCities中的每个对象存储到city变量中,然后打印输出。(只能访问,不能修改或删除)

若只是简单的输出每个元素,可以调用集合对象的forEach()方法:

bigCities.forEach(System.out::println);

3

迭代器是一个可以遍历集合中每个元素的对象。调用集合对象的iterator()方法可以得到Iterator对象,再调用Iterator对象的方法就可以遍历集合中的每个元素。Iterator接口定义如下3个方法:

  1. hasNext():返回迭代器中是否还有对象
  2. next():返回迭代器中下一个对象
  3. remove():删除迭代器中的当前对象

访问myList中的每一个元素:

Iterator iterator = myList.iterator();    //得到迭代器
wile(iterator.hasNext()){
    System.out.println(iterator.next());
}

Iterator开始指向第一个元素的前面,如果指针后面还有元素,hasNext()方法返回true。调用next()方法指针将移到下一个元素并返回该元素。

双向迭代器

可以从前后两个方向遍历线性表中的元素,可以修改元素、获得元素当前的位置,是Iterator的子接口,常用方法有:

  • hasNext():返回是否还有下一个元素
  • next():返回下一个元素
  • hasPrevious():返回是否还有前一个元素
  • previous():返回前一个元素
  • nextIndex():返回下一个元素的索引
  • previousIndex():返回前一个元素的索引
  • remove():删除当前元素
  • set(E o):修改当前元素
  • add(E o):在当前位置插入一个元素

不能同时使用两个迭代器修改一个线性表中的元素,否则将抛出异常。

//将迭代器指针从前往后移
while(iterator.hasNext()){
    iterator.next();
}
//从后往前
while(iterator.hasPrevious()){
    System.out.println(iterator.previous());
}

数组转化为List对象