第十五章——Java泛型与集合框架
一、知识结构框架
二、知识点详解
###1、泛型
编写的代码可以被不同类型的对象所重用,主要目的是可以建立具有类型安全的集合框架。
1.1 泛型类
具有泛型变量的类,在类名后用代表引用类型,如ArrayList,HashMap,HashSet
//ArrayList部分源码
public class ArrayList<E> extends AbstractList<E>
implements List<E>,RandomAccess,Cloneable,java.io.Serializable{
public E get(int index){}
}
1.1.1 设计泛型类
public class Interval<T>{
private T lower;
public getLower(){
return lower;
}
}
1.1.2 调用泛型类
Interval<Integer> v = new Interval<Integer>();
Interval<Integer> v = new Interval<>();//后面的可以省略
1.2 泛型方法
具有泛型参数的方法,可以在普通类或泛型类中,定义的泛型在修饰符后,返回类型前
1.2.1 设计泛型方法
public class ArrayUtil{
public static<T> T getMiddle(T... a){
return a;
}
1.2.1 调用泛型方法
ArrayUtil arr = new ArrayUtil();
String s = a.<String>getMiddle("a","b","c")
1.3 泛型接口
与泛型类相似,在类名后加,实现接口时,指定类型
1.3.1 设计泛型接口
public interface Calculator<T>{
public T add(T operand1,Toperand2);
}
1.3.2 实现泛型接口
public class IntegerCalculator implements Calculator<Integer>{
public Integer add(Integer operand1,Integer Toperand2){
return operand1 + operand2;
}
IntegerCalculator a = new IntegerCalculator();
Calulator<Integer> c = new IntegerCalculator();//用泛型接口声明对象时
2、集合框架
框架集合
2.1 List
2.1.1 ArrayList实现了长度可变的数组
对象创建:List list = new ArrayList();
方法:与List方法相同
方法名 | 说 明 |
---|---|
boolean add(Object o) | 在列表的末尾顺序添加元素,起始索引位置从0开始 |
void add(int index,Object o) | 在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间 |
int size() | 返回列表中的元素个数 |
Object get(int index) | 返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换 |
boolean contains(Object o) | 判断列表中是否存在指定元素 |
boolean remove(Object o) | 从列表中删除元素 |
Object remove(int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
使用例子:
public class Demo {
public static void main(String[] args) {
//1、创建4个学生对象
Student stu1 = new Student("Tom", 10);
Student stu2 = new Student("Aimee", 11);
Student stu3 = new Student("George", 11);
Student stu4 = new Student("Angelia", 13);
//2、创建ArrayList集合对象并把4个学生放入其中
List list = new ArrayList();
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(2,stu4);//添加stu4到指定的位置
//3、输出集合中学生的总数
System.out.println("总共有学生"+list.size()+"个。");
//4、通过遍历集合显示所有学生的信息
for (int i = 0; i < list.size(); i++) {
Student student=(Student)list.get(i);
System.out.println(student.getName()+"\t"+student.getAge());
}
}
}
2.1.2LinkedList采用链表存储方式
对象创建:LinkedList mylist = new LinkedList();
方法:在List方法上新增
方法名 | 说 明 |
---|---|
void addFirst(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFirst() | 返回列表中的第一个元素 |
Object getLast() | 返回列表中的最后一个元素 |
Object removeFirst() | 删除并返回列表中的第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
例子:
//对象创建
LinkedList<String> mylist = new LinkedList<String>();
//常用操作
mylist.add("h");
mylist.add("o");
mylist.add("w");
mylist.remove(1);
mylist.get(1);
mylist.getFirst();
mylist.getLAst();
mylist.removeFirst();
mylist.removeLAst();
int n = mylist.size();
int index = mylist.indexOf("o");
int index = mylist.lastindexOf("o");
//遍历
Iterator<String> iter = mylist.iterator;
while(iter.hasNext()){
System.out.println(iter.next);
}
2.2 Map
对象创建:Map countries = new HashMap();
方法:
方法名 | 说 明 |
---|---|
Object put(Object key, Object val) | 以“键-值对”的方式进行存储 |
Object get (Object key) | 根据键返回相关联的值,如果不存在指定的键,返回null |
Object remove (Object key) | 删除由指定的键映射的“键-值对” |
int size() | 返回元素个数 |
Set keySet () | 返回键的集合 |
Collection values () | 返回值的集合 |
boolean containsKey (Object key) | 如果存在由指定的键映射的“键-值对”,返回true |
使用例子:
public class Test4 {
public static void main(String[] args) {
Map countries = new HashMap();
countries.put("CN", "中华人民共和国");
countries.put("RU", "俄罗斯联邦");
countries.put("FR", "法兰西共和国");
countries.put("US", "美利坚合众国");
String country = (String) countries.get("CN");
System.out.println("CN对应的国家是:" + country);
System.out.println("Map中共有"+countries.size()+"组数据");
countries.remove("FR");
System.out.println("Map中包含FR的key吗?" +
countries.containsKey("FR"));
System.out.println( countries.keySet() ) ;
System.out.println( countries.values() );
System.out.println( countries );
}
}
三、题库考查知识点整理
1、LinkedList、Stack、ArrayList实现了List接口。
2、removeLast()是LinkedList有,但ArrayList类没有的方法。
3、ArrayList的public void add(int index,E element)方法的执行效率低于LinkedList的效率。
4、ArrayList的public E get(int index)方法的执行效率效率高于LinkedList的效率。
5、ArrayList的public E remove(int index)方法的执行效率低于LinkedList的效率。
6、ArrayList的public E get(int index)方法的执行效率效率高于LinkedList的效率。
7、LinkedList类不是线程安全的,即提供的添加,删除操作都不是同步(synchronized)的。
8、LinkedList类不是线程安全的,即提供的添加,删除操作都不是同步(synchronized)的。
9、Vector类是线程安全的,即提供的添加,删除操作都是同步(synchronized)的。
10、Stack类是线程安全的,即提供的压栈,弹栈操作都是同步(synchronized)的。
11、HashMap<K,V>对象不是采用顺序表这种数据结构存储数据的。HashMap<K,V>对象采用散列表这种数据结构存储数据。