学习目标和方式
目标:
1.会使用集合存储数据
2.允许有存储重复的元素
3.掌握每种集合的特性
方式:
1.学习顶层:学习顶层接口/抽象类中的共性方法,所有的子类都可以使用
2.使用底层:底层不是接口就是抽象类,无法创建对象使用,需要使用底层的子类创建对象使用
集合框架
Collection接口:
定义的是所有单列集合中共性的方法;
所有单列集合都可以使用共性的方法;
没有带索引的方法;
(包括List接口和Set接口)
(一)List接口:
特点:
1.有序的集合(存储和取出元素顺序相同)
2.允许存储重复的元素
3.有索引,可以使用普通的for循环遍历
带索引的方法有(增删改查):
add()\remove()\get(index)\set(index)
list集合的三种遍历方式:
1.普通for循环遍历,代码略
2.迭代器遍历
Iterator itr=newsList.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
3.使用增强for遍历
for (Object obj:newsList){
System.out.println(obj);
}
List接口包含的集合有:
1.Vector集合
2.ArrayList集合:底层是可变数组,底层是可变数组,遍历元素更快,改变值也就越快
3.LinkList:底层是底层是双向列表,插入,删除更快
(二)Set接口:
特点:
1.不允许存储重复元素
2.没有索引(不能使用普通的for循环遍历)
3.无序的集合(存储和去除元素的顺序可能不一致)
带索引的方法只有增和删.
Set集合的遍历方式:
1.增强for(代码同上)
2.迭代器(代码同上)
Set接口中包含的集合有:
1.TreeSet集合
2.HashSet集合(底层是HashMap的键,使用键的hash值来保证唯一性)(其中LinkedHashSet集合是有序的集合)
Map结构的集合类(实现–对应)(主要讲HashMap)
带索引的方法(增删改查):
map.put(key,value)增\map.get(key)查\map.remove(key)删\map.replace(key,value)改(map.put()也可以用来改)
遍历方式:
1.使用entrySet方法获取键值对的集合
Set entry=map.entrySet();
for (Object o : entry) {
System.out.println(o);
}
2.遍历key的方式
Set keys=map.keySet();
for (Object key : keys) {
System.out.println(key+":"+map.get(key));
}
3.遍历value的方式
Collection values=map.values();
for (Object value : values) {
System.out.println(value);
System.out.println(map);
}
4.直接遍历
System.out.println(map);
包含的集合有:
1.HashMap
2.HashTable:所有数据都上锁,如果一个线程访问了某段数据,其他人都不能访问所有数据
如何选用集合类?
1.要求线程安全,使用Vector、Hashtable
2.不要求线程安全,使用ArrayList,LinkedList,HashMap
3.要求key和value键值,则使用HashMap,Hashtable
4.数据量很大,又要线程安全,则使用Vector
泛型
概念:泛型是一个未知的数据类型
E :Element 元素(所有java本有类+接口)
T :Type 类型等(所有类+所有接口)
K : 键
V : 值
使用泛型和不使用泛型的区别:
(一)不适用泛型:
好处:集合不使用泛型,默认类型是Object类型,可以存储任意类型
弊端:不安全,会引发类型转换异常
(二)使用泛型:
好处:避免的转换的麻烦,存储什么类型,取出什么类型;把运行期异常提醒到编译器
弊端:泛型是什么类型只能存储什么类型
泛型的定义和使用
泛型类
定义格式:修饰符 class 类名<泛型>{}
泛型方法
定义格式:修饰符 <泛型> 返回值类型 方法名(参数(使用泛型)){}
泛型接口
第一种方法:定义接口的实现类,实现接口,指定接口的泛型
第二种方法:定义接口的实现类,接口是什么类型,指定实现类也是相同的接口,类跟着接口走,相当于确定了一个泛型类
泛型的通配符
泛型的通配符:?,代表任意数据类型
使用方式:不能通过创建对象使用;只能作为方法的参数使用
泛型的限定
泛型上限限定:? extend E,表示使用的泛型只能是E类的子类或者本身
泛型下限限定:? super E,表示使用的泛型只能是E类的父类或者本身