JavaSE进阶(集合泛型)
一,集合
- Collection 单例集合,每个元素(数据)只包含一个值
张三 | 李四 |
---|
- Map双列集合,每个元素包含两个值(键值对)
张三 | 北京 |
---|---|
李四 | 上海 |
- List系列集合:添加的元素是有序,可重复,有索引
- Array,LinkedList:有序,可重复,有索引
- Set系列集合:添加的元素是无序,不重复,无索引
- HashSet:无序,不重复,无索引
- LinkedHashSet:有序,不重复,无索引
- TreeSet:按照大小默认升序排序,无索引,不重复
集合和类型都只支持引用类型数据,不支持基本数据类型
如果要存储基本类型数据,就要用包装类
Collection<Integer> list = new ArrayList<>();
二,Collection集合的常用API
-
1.添加元素,添加成功返回true
list.add("张三"); -
2清空集合所有元素
list.clear() -
3判断集合是否为空,为空true
list.isEmpty() -
4获取集合大小,返回int
list.size() -
5是否包含某个元素,包含true
list.contains("张三"); -
删除某个元素,如有相同的,默认删第一个
list.remove("张三"); -
7集合转换成数组
Object[] arr = list.toArray(); -
8 addAll 将clist2集合元素全部导入list1中
list1.addAll(list2);
1 迭代器Iterator
是集合专用的遍历方式
Iterator<String> it =list.Iterator;
String ele = it.next();
sout(ele)//只能输出一个 要想全部遍历需要循环
while(it.hasNext())//询问有没有这个元素
{
String ele = it.next();
system.out.println(ele);
}
2 foreach遍历
既可以遍历集合也可以遍历数组
内部原理是迭代器,遍历集合相当于迭代器简化写法
实现Iterator接口的类才可以实现,Collection接口已实现
Collection<String> c = new ArrayList<>();
for(String ele:list){
system.out.println(ele);
}
3 lambda表达式遍历
list.forEach(s->{
system.out.println(s);
})
三,集合存储自定义类型的对象
如存储一些学生对象,老师对象,动物对象..
Collection<Student> student = new ArrayList<>();
四,常见的数据结构
数据结构是计算机底层存储,组织数据的格式.指数据相互之间是以什么方式排列在一起的。
栈
先进后出,如弹夹存储子弹
队列
就是排队 ,先进先出
数组(查询快,增删慢)
根据索引查询速度快
删除效率低,因为数组后面的元素需要前移
添加效率低
链表
内存中不连续存储的,每个元素节点包含数据值和下一个元素的地址
查询慢 因为无论查询那个数据都要从第一个开始
增删快
二叉树
- 二叉查找树(小的存左边,大的存右边) 从左向右依次变大(提高检索数据性能)
平衡二叉树
在满足查找二叉树的规则小,尽可能让树变得矮小,提高查数据性能
红黑树
通过红黑规则来实现的
- 每个节点是红或黑色的,根节点必须是黑色
四,List集合(ArrayList,LinkdList)
- 有序:存储和取出元素顺序一致
- 有索引:可以通过索引操作元素
- 可重复:存储的元素可以重复
ArrayList是基于数组实现的,查询快,增删慢
LinkdLis底层基于双链表实现的查询慢,增删首尾非常快
List <String> list = new ArrayList<>();
在某个索引位置插入元素
list.add(2,"18");
//删除某个位置元素
list.remove(2);
//根据索引获取元素
String rs = list.get(2);
//修改索引位置的元素
list.set(1,"修改的值");
list遍历集合的四种方式
- 1迭代器
- 2forEach()
- 3lambda表达式
- 4for循环(因为有索引)
LinkedList集合特有功能
LinkedList<String> queue = new LinkedList<>();
//入队
queue.addLast("1");
//出队
queue.removeFirst();
入栈push()
出栈pop()
并发修改异常
从集合中的一批元素中找出某些数据并删除,如何操作,是否存在问题
解决:需要边遍历边删除会出现异常问题
用迭代器进行遍历删除时,用it,remove()删除,
用集合list.remove(ele);会出毛病
for循环删除必须从后面遍历元素才可以
五,泛型
泛型类
格式:修饰符class 类名<泛型变量>{}
public class ArrayList<T>{} //E T K V