JAVA中集合框架和泛型重点总结
Java集合框架:
Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。
(Collection是·所有Java集合框架的父接口;Collections操作集合的工具类)
Iterator:是迭代器
- 接口:
- 具体实现类:
- 算法:
Collections(提供了对集合进行排序,遍历等多种算法实现)
Collection接口存储一组不唯一(可以重复),无序的对象
List接口存储一组不唯一,有序(插入顺序)的对象
0 |
1 |
2 |
3 |
4 |
5 |
aaaa |
dddd |
cccc |
aaaa |
eeee |
dddd |
Set接口存储一组唯一,无序的对象
aaaa |
dddd |
cccc |
Map接口存储一组键值对象,提供key到value的映射(KV值)
CN |
JP |
RU |
FR |
China |
Japan |
Russia |
France |
键Key都是唯一的,而且是无序的
而值Value不一定是唯一的(可以有两个China)
List接口:
List接口的实现类:
ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
0 |
1 |
2 |
3 |
4 |
5 |
aaaa |
dddd |
cccc |
aaaa |
eeee |
dddd |
ArrayList常用方法:
方法名 |
说明 |
Boolean add(Object 0) |
在列表的末尾顺序添加元素,起始索引位置从0开始 |
Void add(int index,Object 0) |
在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间 |
int size() |
返回列表中的元素个数 |
Object get(int index) |
返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换 |
boolean contains(Object 0) |
判断列表中是否存在指定元素 |
Boolean remove(Object 0) |
从列表中删除元素 |
Object remove(int index) |
从列表中删除指定位置元素;起始索引位置从0开始 |
Collection接口常用通用方法还有:clear()(清空)、isEmpty()(返回布尔值要么空,要么不空)、iterator()、toArray()
equals(object【另外一个集合】):判断两个集合的内容是否一样,从第一个开始一次比较
subList(0,2):取出该集合下标0到1的集合并组成一个新的集合
这些红色的都是父接口Collection有的方法。在set和LinkedList这些方法都有
集合里不能添加基本数据类型,只能添加对象或者添加引用数据类型
LinkedList采用链表存储方式。插入、删除元素时效率比较高
注意这样声明,无法使用LinkedList独有的方法:List list = new LinkedList();
而应该这样声明:LinkedList list = new LinkedList();
LinkedList中独特的方法:
方法名 |
说明 |
void addFirst(Object 0) |
在列表的首部添加元素 |
void addLast(Object 0) |
在列表的末尾添加元素 |
Object getFirst() |
返回列表中的第一个元素 |
Object getLast() |
返回列表中的最后一个元素 |
Object removeFirst() |
删除并返回列表中的第一个元素 |
Object removeLast() |
删除并返回列表中的最后一个元素 |
lastIndexOf(object arg0)最后一个重复的元素的下标
ArrayList和LinkedList有何异同?
- ArrayList和LinkedList都是list的两个实现类,可以通过get拿出来
- ArrayList适用于遍历取值,不适用于插入增加
- LinkedList插入删除的时候效率比较高,而且LinkedList还有很多自己的独特方法
Set接口:
- Set接口存储一组唯一,无序的对象
- HashSet是Set接口常用的实现类
- Set中存放对象的引用
Set接口如何判断加入对象是杏已经存在呢?
采用对象的equals()方法比较两个对象是否相等
Set set=new HashSet();
String s1=new String("java");
String s2=s1;
String s3=new String ("java");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.printIn(set.size());
最后输出1。
String重写了equals的方法,所以如果字符串一样equals最后返回的一定是true。
HashSet是Set接口常用的实现类:
Set newsTitleSet = new HashSet();
NewTitle car = new NewTitle(1,“汽车","管理员");
//增加元素
newsTitleSet.add(car);
//获取元素个数
System.out.println("新闻标题数目为: "+ newsTitleList.size()+ "条");
然而Set接口不存在get()方法:
newsTitleSet.get(0);
因为set是无序的没有索引,所以不能用下标输出。想要获取元素可以用增强性的for
如何遍历Set集合?
方法1:增强型for循环
方法2:通过迭代器lterator实现遍历:(lterator和Collection是两个并列的接口)
- 获取Iterator:Collection 接口的iterate()方法(set和list都有这个方法)
- lterator的方法
【boolean hasNext():判断是否存在另一个可访问的元素】
【Object next();:返回要访问的下一个元素】
有序的list想要get出有3种方法:
- 普通for,遍历索引
- 增强型for
- 迭代器lterator实现遍历
无序的set想要get只有2种方法:
- 增强型for
- 迭代器lterator实现遍历
Map接口:
Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作
【最常用的实现类是HashMap】
//往map集合里添加键值对
countries.put("CN", "中华人民共和国");
countries.put("RU", "俄罗斯联邦共和国");
countries.put("FR", "法兰西民主共和国");
countries.put("U.S.", "美利坚合众国");
//获取map的元素(对)数
System.out.println(countries.size());
//通过某个键获取对应值
String country = (String)countries.get("CN");
System.out.println(country);
//判断map中是否包含某个键
boolean flag = countries.containsKey("U.S.");
System.out.println(flag);
//删除特定键对应的键值对
countries.remove("U.S.");
flag = countries.containsKey("U.S.");
System.out.println(flag);
//分别显示map中键集,值集,和键值对集
System.out.println(countries.keySet());
System.out.println(countries.values());
System.out.println(countries);
//清空
countries.clear();
if(countries.isEmpty()){
System.out.println("清空");
}
Map接口常用方法:
方法名 |
说明 |
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 |
Map中取出数据的方法:
- 先获取每一个Key(使用增强性的for,或者迭代器lterator实现遍历),然后根据每个Key拿到相应value
方法一:使用增强性的for拿到每个Key
for(Object obj : keys){
String key = (String) obj;
String value = (String)countries.get(key);
System.out.println(key+"-"+value);
}
方法二:使用迭代器Interator拿到每个Key
Iterator itor = keys.iterator();
while(itor.hasNext()){
String key = (String) itor.next();
String value = (String)countries.get(key);
System.out.println(key+"-"+value);
}
- 先拿到Map中的键值对,然后再在每个键值对中分别取出来键和值
方法三:使用键值对
Set ms = countries.entrySet(); // ms就是所有键值对的集合
for(Object obj : ms){
Map.Entry me = (Map.Entry)obj; //Map中的每一个键值对(Map)
Object key = me.getKey(); //getKey取出每个键值对中的键
Object value = me.getValue(); //getValue取出每个键值对中的值
System.out.println((String)key+"-"+(String)value);
}
Set entrySet = map.entrySet();
for(Object obj : entrySet){
Entry entry = (Entry)en;
System.out.println(entry.getKey());
}
泛型:
(JDK 5之后提倡使用泛型,改写了集合框架中的所有接口和类)
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性
【本质是参数化类型】
泛型集合:
泛型集合可以约束集合内的元素类型
典型泛型集合ArrayList<E>、HashMap<K,V>
- <E>、<K,V>表示该泛型集合中的具体元素类型【写的时候写实际的类型】
- 泛型集合中的数据不再转换为Object
【除了指定了集合中的元素类型外,泛型集合和之前学习的集合的用法完全一样】
泛型的尖括号中可以放父类对象,这样子类对象也可以插入到这个集合里。
Collections算法类·
- Java集合框架将针対不同数据结构算法的实现都保存在工具类中
- Collections类定义了一系列用干操作集合的静态方法
Collections类常用方法:
- Collections和Collection不同,前者是集合的操作类,后者是集合接口
- Collections提供的常用静态方法
(1)sort () :排序
(2)binarySearch() :查找
(3)max () \min() :查找最大\最小值
(4)打印输出集合中的最大值和最小值
String strMax = (String)Collections.max(list);
String strMin = (String)Collections.min(list);
System.out.println(strMax+"-"+strMin);
(5)升序排序:
System.out.println("*********************");
Collections.sort(list);
for(String str :list){
System.out.println(str);
}
(6)查找:
System.out.println("*****************************");
System.out.println(Collections.binarySearch(list, "tom"));
(7)反转集合元素:
System.out.println("*****************************");
Collections.reverse(list);
for(String str :list){
System.out.println(str);
}
Collections排序:
- Collections类可以对集合进行排序、查找和替换操作
- 实现一个类的对象之间比较大小,该类要实现Comparable接口【重写compareTo()方法】
Student类继承Comparable接口:
public class Student implements Comparable<Student>{
编写Comparable的算法compareTo:
public int compareTo(Student stu) {
当现在的成绩大于原有的成绩时返回1:
if(this.getScore()>stu.getScore()){
return 1;
当现在的成绩小于原有的成绩时返回-1:
}else if(this.getScore()<stu.getScore()){
return -1;
}else{
当现在的年龄大于原有的年龄时返回1:
if(this.getAge()>stu.getAge()){
return 1;
当现在的年龄小于原有的年龄时返回-1:
}else if(this.getAge()<stu.getAge()){
return -1;
字符串比较时直接调用compareTo方法此时可以直接点出来,因为String重写了compareTo这个方法,所以可以直接调用(也就是 .compareTo)
}else return this.getName().compareTo(getName());
}
}
在测试类中直接利用Collections. 调用Collections的sort方法进行升序排列:
Collections.sort(list);
再利用增强型的for遍历数组输出信息:
for(Student str :list){
System.out.println(str.getName()+"-"+str.getAge()+"-"+str.getSex()+"-"+str.getScore());
}