概述——集合框架
Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为java集合框架(Java Collection Framework)。Java程序员在具体应用时,不必考虑数据结构和算法的实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了,这样就大大提高了编程效率
为什么使用集合框架
如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用
Java集合框架
Java集合框架包含的内容
Java集合框架中四个常用表示集合的接口(Collection,List,Set,Map)
集合框架的接口
Collection接口存储一组不唯一,无序对象
List接口存储一组不唯一,有序(插入顺序)的对象
Set接口存储一组唯一,无序的对象
Map接口存储一组键值对象,提供key(键)到value(值)的映射
List接口的实现类
list(ArrayList,LinkedList)
ArrayList
实现了长度可变的数组,在内存中分配连续的空间。
遍历元素和随机访问元素的效率比较高
LinkedList
采用链表存储方式。
插入、删除元素是效率比较高
例题:
package com.jredu.ch10;
import java.util.List;
import java.util.ArrayList;
public class Ch02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//声明集合
List list =new ArrayList<>();
//声明要存储的数据
Theme theme =new Theme(1, "主题1", "主题简介1");
Theme theme2 =new Theme(2, "主题2", "主题简介2");
//添加数据到集合中
list.add(theme);
list.add(theme2);
//显示数据
for(int i=0;i<list.size();i++){
//父类object强转成子类Theme
Theme t=(Theme)list.get(i);
//通过get方法获取对应属性的值
System.out.println(t.getId()+"\t"+t.getTitle()+"\t参与调查\t调查结果");
System.out.println("\t"+t.getRemark());
}
}
}
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) | 从列表中删除元素 |
boolean remove(int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
例题:
package com.jredu.ch10;
import java.util.ArrayList;
import java.util.List;
/**
* 集合框架位于java.util包中 集合List:ArrayList
* List:有序不唯一
* @author Yoga11s
*
*/
public class Ch01 {
/**
* ArrayList:内部采用了可变长度的数组,分配的是连续的空间 遍历元素(从第一个到最后一个)及随机访问(随机查看某一个)
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 左边:接口 右边:实现类 多态
List list = new ArrayList<>();
// 接口定义的方法
// 在List中追加一条数据
list.add(1);
list.add('a');
list.add(true);
list.add(123);
//访问某个数据
// System.out.println(list.get(2));
//在指定下标位置插入元素
list.add(1,"abc");
//ArrayList中重写了toString方法,下标位置必须介于0到个数之间
System.out.println(list.toString());
//size方法:获取List个数
System.out.println("list的元素个数是:"+list.size());
//remove方法,有两个重载(int a),(Object o)
//通过传入具体的元素值来删除元素,返回删除结果
// list.remove("abc");
// System.out.println("是否删除成功?"+list.remove((Character)'a'));
System.out.println("是否删除成功?"+list.remove("abc"));
//通过传入对应元素下标来删除元素,返回被删除的元素内容
//下标位置范围在0到最后一个元素下标之间
System.out.println("被删除的元素是"+list.remove(3));;
System.out.println("list的元素个数是:"+list.size());
System.out.println(list.get(2));
//contains:判断是否存在某个元素值
System.out.println(list.contains("abc"));
}
}
--------------------------------------------------------------------------------
LinkedList集合类
LinkedList采用链表存储方式。
插入、删除元素是效率比较高
常用方法
方法名 | 说明 |
void addFirst(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFirst() | 返回列表中的第一个元素 |
Object getLast() | 返回列表中的最后一个元素 |
Object removeFirst() | 删除并返回列表中的第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
例题:
package com.jredu.ch10;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class Ch03 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//addAll
//向集合当中添加一个集合
List list2=new ArrayList<>();
Set set=new HashSet<>();
set.add(8);
list2.add(1);
list2.add(2);
list2.add(3);
List list=new LinkedList<>();
list.add(0);
list.add(1);
list.add(1);
list.add(1);
list.add(1);
(list).addAll(list2);
list.addAll(set);
System.out.println(list);
System.out.println(list.size());
//isEmpty()判断集合是否为空,true,false
//判断一个集合是否为空
// if(list!=null&&!list.isEmpty()){
// }
//clear():清空数据,保留对象,重置list
// list.clear();
// list=null;
System.out.println(list);
System.out.println(list.size());
//indexOf:返回元素第一次出现位置的下标
//lastIndexOf:返回元素最后一次出现位置的下标
System.out.println(list.indexOf(3));
System.out.println(list.lastIndexOf(1));
//removeAll从集合中删除另一个集合所包含的元素
list.removeAll(list2);
System.out.println(list2);
System.out.println(list);
//数组和List之间的相互转换
//toArray可以把集合转成数组
Object[] arr=list.toArray();
//数组转集合
List l=Arrays.asList(arr);
System.out.println(l);
}
}
迭代器Iterator
如何遍历List集合呢?
方法1:通过for循环和get()方法配合实现遍历
方法2:通过迭代器Iterator实现遍历
所有集合接口和类都没有提供相应遍历方法,而是由Iterator实现集合遍历
Collection接口的iterate()方法返回一个Iterator,然后通过Iterator接口的两个方法可实现遍历2
boolean hasNext():判断是否存在另一个可访问的元素
Object next():返回要访问的下一个元素
terator iter=list.iterator();
while(iter.hasNext()){
//每次循环只调用一遍next方法
//next每调用一次就获取下一条数据
//获取的类型和集合中add的类型一样
Dog dog=(Dog)iter.next();
System.out.println(dog.getName()+"\t"+dog.getType());
}