Day2-java泛型与集合
- 对象顺序,Comparable接口及其使用
- Queue接口和实现类的使用 了解
- Map接口及实现类的使用
- Collections类的实用方法操作List对象
- 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个方法:
- hasNext():返回迭代器中是否还有对象
- next():返回迭代器中下一个对象
- 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对象
方法的定义如下:
public static <T> List<T> asList(T...a)
asLIst()方法与Collection接口的toArray()方法相反
String[] str = {"one","two","three","four"};
List<String> list = Arrays.asList(str); //将数组转换为列表
System.out.println(list);
或
List<String> list = new ArrayList("one","two","three","four");
Arrays.asList()方法返回的List对象是不可变的,若要对List对象操作,则将其作为一个参数传递给另一个List的构造方法
Vector类和Stack类分别实现向量和对象栈。栈:后进先出
Set接口及实现类
Set接口对象类似于数学上的集合概念,不允许有重复的元素。
Set接口没有定义新方法,从Collection中继承。
常用实现类:HashSet类,TreeSet类(存放的数按从小到大排序)
HashSet类
用散列方法存储元素,具有最好的存储性能,构造方法有:
- HashSet():创建一个空的散列集合,默认容量16,以0.75自动填充
- HashSet(Collection c):用指定集合c的元素创建一个散列集合
- HashSet(int initialCapacity):创建一个散列集合,并指定集合的初始容量
- HashSet(int initialCapacity,float loadFactor):创建集合,指定容量和装填因子
用Set对象实现集合运算
- s1.addAll(s2):实现并运算
- s1.retainAll(s2):交运算
- s1.removeAll(s2):差运算
- s1.containAll(s2):如果s2是s1的子集,返回true
TreeSet类
实现树集合,以红-黑树为元素排序,TreeSet类的默认构造方法创建一个空的树集合,其他构造方法如下:
- TreeSet(Collection c):用集合c中的元素创建一个新的树集合,元素以自然顺序排序
- TreeSet(Comparator c):创建空树集合,元素按给定的比较器c的规则排序
- TreeSet(SortedSet s):用SortedSet对象s中的元素创建一个树集合,排序与s的排序规则相同
TreeSet类实现了SortedSet接口中的常用方法:
- E first():返回有序集合中第一个元素
- E last():返回有序集合中最后一个元素
- SortedSet<E> subSet(E fromElement,E toElement):返回有序集合中的一个子有序集合,它的元素从fromElement开始到toElement结束(不包括最后元素)
- SortedSet<E> headSet(E toElement):返回有序集合小于指定元素toElement的一个子有序集合
- SortedSet<E> tailSet(E fromElement):返回有序集合大于等于指定元素fromElement的一个子有序集合
对象顺序
自然顺序是指集合对象实现了Comparable接口的compareTo()方法
字符串的默认比较规则是按字母顺序比较
Comparable接口和Comparator接口
比较两个String对象的大小,用String类的ComparaTo()方法
类的对象比较大小,需要实现Comparable<T>接口的comparaTo()方法,该方法实现当前对象与参数对象的比较,返回一个整数值,当调用对象小于,等于,大于参数对象时,返回负整数,0,正整数。按这种方法比较出的对象顺序称为自然顺序
Comparable<T>接口的定义:
package java.lang; public interface Comparable<T>{ int comparaTo(T other); }

浙公网安备 33010602011771号