集合
javaee基础中的重点
*集合概述和集合的继承体系
*collection集合
*List集合
*ArrayList集合
*LinkedList集合
*泛型
集合和数组的对比小结
1.数组的长度是不可变的,集合的长度是可变的
2.数组可以存基本数据类型和基本数据类型
集合只能存储引用数据类型,如果要存基本数据类型,需要存对应的包装类
集合的体系
Collection 集合概述
1.是单列集合的顶层接口,他表示一组对象,这些对象也称为Collection的元素
2.JDK不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)的实现
创建collection集合的对象
多态的方式
具体的实现类ArrayList
具体的方法 方法名boolean add(E e) 说明:添加元素
方法名boolean remove(Object o) 说明:从集合中移除指定的元素
方法名boolean removeif(Object o) 说明:根据条件进行删除
方法名void clear() 说明:清空集合
方法名boolean comtains(Object o) 说明:判读集合中是否存在指定的元素
方法名boolean isEmpty() 说明:判读集合中是否为空
方法名int size() 说明:集合的长度,也就是集合中元素的个数
代码实例:
public class test {
public static void main(String[] args) {
// 方法名boolean add(E e) 说明:添加元素
// 方法名boolean remove(Object o) 说明:从集合中移除指定的元素
// 方法名boolean removeif(Object o) 说明:根据条件进行删除
// 方法名void clear() 说明:清空集合
// 方法名boolean comtains(Object o) 说明:判读集合中是否存在指定的元素
// 方法名boolean isEmpty() 说明:判读集合中是否为空
// 方法名int size() 说明:集合的长度,也就是集合中元素的个数
Collection<String> list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("aa")
System.out.println(list);
//注意 remove方法返回的是一个true或者false 成功就是true 失败就是false
boolean remove = list.remove("a");
boolean remove1 = list.remove("d");
System.out.println(remove);//true
System.out.println(remove1);//false
//removeif 根据条件删除
//removeif底层会遍历集合,得到集合的每一个元素 s依次表示这每一个元素
//就会把每一个元素放到lambda表达式去判断一下
//如果true则删除 如果false就会删除
list.removeIf((String s)->{
return s.length()==1;
});
System.out.println(list);
//void clear清空集合
list.clear();
System.out.println(list);
//判断集合是否存在 返回值和remove一样是一个boolean值
boolean contains = list.contains("a");
System.out.println(contains);
//判断集合是否存在 返回值和remove一样是一个boolean值
boolean empty = list.isEmpty();
System.out.println(empty);
//集合的长度
int size = list.size();
System.out.println(size);
}
}
Collection集合的遍历
Iterator : 迭代器,集合的专用遍历方式
Iterator<E> iterator(): 返回集合中的迭代器对象,该迭代器对昂默认指向当前集合的0索引
Iterator中的常用方法
boolean hasNext():判断当前位置是否有元素可以被取出
E next(): 获取当前位置元素 将迭代器对象移向下一个索引位置
代码:
public class test1 {
public static void main(String[] args) {
Collection<String> list =new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
//获取迭代器的对象
//迭代器对象一旦被创建出来,默认指向集合的0索引处
Iterator<String> iterator = list.iterator();
//表示当前位置是否有元素可以被取出 返回 boolean值
System.out.println(iterator.hasNext());
//取出当前位置元素+将迭代器往后移动一个索引的位置
System.out.println(iterator.next());
//集合的遍历 使用之前先看看是否可以移动到下一个索引 如果有正常取出 如果没有就 会报错
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
迭代器的删除方法
案例:使用迭代器删除集合中的某一个元素(for循环的话 如果元素重复就会删除一个 这是for循环的缺陷)
public class test3 {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String s="b";
if ("b".equals(s)){
iterator.remove();
}
}
}
}
增强for
简化数组和collection集合的遍历
JDK1.5之后出现的,内部原理是一个Iterator迭代器
实现Iterable接口的类才可以使用迭代器和增强for
增强for的格式
for(元素数据类型名 变量名:数组或者是Collection集合){
//在此处使用变量即可,该变量就是元素
}
代码:
public class tets4 {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
//数据类型一定是集合或者数组中元素的类型
//s仅仅是一个变量名,在循环的时候代表的集合或者数组中的每一个元素
//list就是遍历的集合和数组
for(String s : list){
System.out.println(s);
}
}
}
注意:再增强for中 修改s的变量值 并不会影响集合的元素
循环的使用场景
如果需要操作索引,使用for使用 在刚刚的代码中也可以使用for 但要加上i--去检索前一个值
如果在遍历的过程中需要操作元素,请使用迭代器
如果只是遍历集合的元素,使用增强for
List集合的概述和基本使用
List集合概述
有序集合,这里的有序是指的存区顺序
用户可以精确到列表每个元素的插入位置,用户可以通过访问索引方式访问元素,并搜索列表中的元素
与set元素不同,列表允许存储重复的元素
总结就是有序,存取顺序一致,有索引,可以通过索引操作元素,可重复,存储的元素可以重复
代码:
public class tets5 {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("a");
list.add("a");
list.add("c");
list.add("d");
//迭代器
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
//增强for
for (String s : list) {
System.out.println(s);
}
}
}
List集合特有方法
void add(index,E element) 在次集合中的指定位置插入指定元素
E remove(int index) 删除指定元素索引处的元素,返回被删除的元素
E set(int index,E element) 修改指定元素索引处的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素
代码实例:
public class tets5 {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add(0,"sss");//原来的元素会到下一个位置 1索引位置
System.out.println(list);
//list集合中有两个删除的方法
//第一个删除指定的元素,返回值是boolean 是否成功
//第二个删除指定索引的元素,返回值表示实际删除的元素
String remove = list.remove(0);
System.out.println(remove);
System.out.println(list);
//修改元素 使用后原来的元素就不存在了
String set = list.set(0, "123");
System.out.println(set);//123
System.out.println(list);
//返回指定处索引
String s = list.get(0);
System.out.println(s);
}
}
数据结构
概述:数据结构就是计算机存储,组织数据的方式,是指相互之间存在一种或多种特定关系的数据元素的集合
通常情况下,选择合适的数据结构会带来更高的运行和存储效率
常见数据结构之栈
数据进入栈模型的过程称为:压/进栈
数据离开栈模型的过程称为:弹/出栈
比较像弹夹
栈是一种先进后出的模型
数据从后端进入队列模型的过程称为:入队列
数据从前端进入队列模型的过程称为:出队列
比较像买票的过程 (没有插队情况!!!!) 先排队的先买
数组和链表
数组 :查询数据通过地址值和索引定位,查询任意数据耗时相同,查询速度快
删除数据时,要将原始数据删除,同时后面每个数据前移,删除效率低
添加数据时,添加位置后的每个数据后移,再添加元素,添加效率低
数组是一个查询快,增删慢的模型
链表:每一个元素都称之为节点,每一个节点都有特定在内存中的位置,里边记录的有数据和下一个节点的地址值 第一个创建出来的节点称之为头节点,
最后一个节点没有地址值,当只有第一个节点时,头节点没有下一个节点的地址值,当第二个节点进来的时候,第一个节点才会有地址值,依次类推
链表是一个增删快的模型(对比数组)查询慢从第一个一次往后找(单向链表)
双向链表和单向链表相比 存的不只有数据,下一条数据的地址值,还有上一条数据的地址值,查询数据的时候会看数据在链表的前端还是后端,
如果在前端,从前开始找,离后边进,从后开始找
LinkedList
ArrayList 底层数据结构是数组,查询快,增删慢
LinkedList 底层数据结构是链表,查询慢,增删快
因为LinkedList和ArrayList都是List包下的 方法大多类似
所以直接写一个案例 使用LinkedList 存储字符串 并遍历
public class test6 {
public static void main(String[] args) {
LinkedList<String> list=new LinkedList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
for (String s : list) {
System.out.println(s);
}
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(next);
}
}
}
特有功能:
public void addFirst(E e) 在该列表开头插入指定的元素
public void addLast(E e) 将该元素追加到列表的末尾
public E getFirst() 返回此列表中的第一个元素
public E getLast() 返回此列表中的最后一个元素
public E removeFirst() 从此列表中删除并返回第一个元素
public E removeLast() 从此列表中删除并返回最后一个元素
大家可以自己写一下Demo
泛型
概述:是JDK5中引入的特性,它提供了编译时类型安全检测机制
泛型的好处:
把运行时期的问题提前到了编译时期
避免了强制转换(类似于迭代器 遍历字符串 如果时基本数据类型 int 就会报错)
每次创建集合都会有 ArrayList<String> list=new ArrayList<>();
<> 这个尖括号内的数据类型,如果不规定的话 就是Object 任何数据类型都可以
泛型使用的地方:
类后面 -》泛型类 方法声明上-》泛型方法 接口后面-》泛型接口