javase复习day22集合进阶
集合体系结构
Collection单列集合
import java.util.ArrayList;
import java.util.Collection;
public class A01_CollectionDemo1 {
public static void main(String[] args) {
/*
public boolean add(E e) 添加
public void clear() 清空
public boolean remove(E e) 删除
public boolean contains(Object obj) 判断是否包含
public boolean isEmpty() 判断是否为空
public int size() 集合长度
注意点:
Collection是一个接口,我们不能直接创建他的对象。
所以,现在我们学习他的方法时,只能创建他实现类的对象。
实现类:ArrayList
*/
//目的:为了学习Collection接口里面的方法
//自己在做一些练习的时候,还是按照之前的方式去创建对象。
Collection<String> coll = new ArrayList<>();
//1.添加元素
//细节1:如果我们要往List系列集合中添加数据,那么方法永远返回true,因为List系列的是允许元素重复的。
//细节2:如果我们要往Set系列集合中添加数据,如果当前要添加元素不存在,方法返回true,表示添加成功。
// 如果当前要添加的元素已经存在,方法返回false,表示添加失败。
// 因为Set系列的集合不允许重复。
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
System.out.println(coll);
//2.清空
//coll.clear();
//3.删除
//细节1:因为Collection里面定义的是共性的方法,所以此时不能通过索引进行删除。只能通过元素的对象进行删除。
//细节2:方法会有一个布尔类型的返回值,删除成功返回true,删除失败返回false
//如果要删除的元素不存在,就会删除失败。
System.out.println(coll.remove("aaa"));
System.out.println(coll);
//4.判断元素是否包含
//细节:底层是依赖equals方法进行判断是否存在的。
//所以,如果集合中存储的是自定义对象,也想通过contains方法来判断是否包含,那么在javabean类中,一定要重写equals方法。
boolean result1 = coll.contains("bbb");
System.out.println(result1);
//5.判断集合是否为空
boolean result2 = coll.isEmpty();
System.out.println(result2);//false
//6.获取集合的长度
coll.add("ddd");
int size = coll.size();
System.out.println(size);//3
}
}
package Collection;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo1 {
public static void main(String[] args) {
//由于callection为接口,无法直接创建对象
//所以可以使用多态来创建对象
Collection<String> coll = new ArrayList<>();
//添加,
/**
* 由于Collection被全部单例集合继承,add的返回值在ArrayList下都为true
* 在set中由于其不重复的特性,当set中没有时返回true,当已经存在时返回fales
*/
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
System.out.println(coll);//[aaa, bbb, ccc]
//清空
// coll.clear();
System.out.println(coll);//[aaa, bbb, ccc]
//删除
/**
* set中无索引只能使用对象删除
*/
System.out.println(coll.remove("aaa"));//true
//判断是否存在
/*
底层实现为调用对象的equse方法来判断,所以对象需要重写equse方法,让方法判断内容是否正确,
而不是内存地址是否一致
*/
System.out.println(coll.contains("bbb"));//true
//判空
System.out.println(coll.isEmpty());//false
//长度
System.out.println(coll.size());//2
}
}
Collection的遍历方式
没有for循环的原因:
for循环通过访问索引的方式进行遍历,但是set没有索引因此无法使用for循环遍历。
迭代器遍历
特点:不依赖索引。
package Collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo3 {
public static void main(String[] args) {
//创建一个集合
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
//集合对象获取迭代器对象
Iterator<String> it = coll.iterator();
//进行循环遍历
//判断当前位置是否存在对象
while (it.hasNext()){
String next = it.next();//获取对象并将指针下移一位
System.out.println(next);
}
}
}
迭代器细节:
- 当指针指向集合外时,依然强制获取对象则报错,NoSuchElementException错误。
- 迭代器遍历完毕,指针不会复位。
- 循环中只能用一次next方法。
- 迭代器遍历时,不能使用集合的方法进行增加和删除。会出现并发修改异常。如果要删除可以使用迭代器提供的方法进行删除。
package Collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo4 {
public static void main(String[] args) {
//创建一个集合
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
//集合对象获取迭代器对象
Iterator<String> it = coll.iterator();
//进行循环遍历
//判断当前位置是否存在对象
while (it.hasNext()){
String next = it.next();//获取对象并将指针下移一位
System.out.println(next);
}
//强制获取对象
// System.out.println(it.next());//NoSuchElementException异常
//指针不复位
System.out.println(it.hasNext());//false,没有获取到对象,即指针没有复位
//想要再次遍历则需要再次获取迭代器
//集合对象获取迭代器对象
Iterator<String> it2 = coll.iterator();
//进行循环遍历
//判断当前位置是否存在对象
while (it2.hasNext()){
String next = it2.next();//获取对象并将指针下移一位
System.out.println(next);
}
}
}
package Collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo5 {
public static void main(String[] args) {
//创建一个集合
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
coll.add("eee");
//集合对象获取迭代器对象
Iterator<String> it = coll.iterator();
//进行循环遍历
//判断当前位置是否存在对象
while (it.hasNext()){
//在循环中对集合进行增加和删除操作,出现异常:ConcurrentModificationException
if("bbb".equals(it.next())){
// coll.remove("bbb");
//如果必须要进行删除操作,可以使用迭代器的方法,进行删除
it.remove();
}
//一次获取两个对象,异常:NoSuchElementException
//由于next方法获取对象后指针后移一位如果不判断对象是否存在就会出现对象不存在异常
// System.out.println(it.next());
// System.out.println(it.next());
}
//想要再次遍历则需要再次获取迭代器
//集合对象获取迭代器对象
Iterator<String> it2 = coll.iterator();
//进行循环遍历
//判断当前位置是否存在对象
while (it2.hasNext()){
String next = it2.next();//获取对象并将指针下移一位
System.out.println(next);
}
}
}
迭代器小结:
增强for遍历
package Collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Collectiondemo6 {
public static void main(String[] args) {
//创建一个集合
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
//使用增强for循环
/*
集合名+for快捷生成增强for循环
*/
for (String s : coll) {
System.out.println(s);
}
//增强for循环中的数据改变不影响集合中的数据
for (String s : coll) {
s = "qqq";
}
for (String s : coll) {
System.out.println(s);
}
}
}
Lambda表达式遍历
package Collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.function.Consumer;
public class CollectionDemo7 {
public static void main(String[] args) {
//创建一个集合
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
//lambda表达式遍历
//先使用匿名内部类进行遍历
/*
forEach方法底层为for循环,将每次遍历到的对象都交给accept方法
string 就是获取的对象
*/
// coll.forEach(new Consumer<String>() {
// @Override
// public void accept(String string) {
// System.out.println(string);
// }
// });
//lambda表达式
coll.forEach( string-> System.out.println(string));
}
}
Collection小结
List集合
特点
List的特有方法
package MyArrayList;
import java.util.ArrayList;
import java.util.List;
public class ArraylistDemo1 {
public static void main(String[] args) {
//List集合
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
//根据索引在指定位置插入元素
/*
被占据位置的元素,会向后退一位
*/
list.add(1,"QQQ");
System.out.println(list);
//删除元素
/*
通过索引来删除元素,并返回被删除的元素
详细解释见下一段代码
*/
System.out.println(list.remove(0));
//根据索引修改元素,并返回被修改的元素
System.out.println(list.set(0, "qqq"));
//获取元素
System.out.println(list.get(0));
System.out.println(list);
}
}
关于删除的解释代码:
package MyArrayList;
import java.util.ArrayList;
import java.util.List;
public class Demo2 {
public static void main(String[] args) {
//删除的情况
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
System.out.println(list);
/*
由于删除方法有两个,直接输入数字,调用的是根据索引删除,
原因:重载的方法调用会根据输入的值的类型来判断使用哪个方法,
输入数字,因为数字是int 类型所以调用了根据索引删除的方法
如果想要调用根据对象删除则可以将数字装箱为一个引用类型再调用。
*/
//直接调用为根据索引删除
System.out.println(list.remove(1));
//装箱后调用为根据对象删除,因为对象时Integer类型就近调用
//可看做该方法不会自动装箱
Integer i = 1;
System.out.println(list.remove(i));
System.out.println(list);
}
}
List集合的遍历方式
package MyArrayList;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.function.Consumer;
public class ArrayListDemo3 {
public static void main(String[] args) {
//List的遍历方式
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
//迭代器遍历
// Iterator<String> it = list.iterator();
// while (it.hasNext()){
// String str = it.next();
// System.out.println(str);
// }
//增强for循环
// for (String s : list) {
// System.out.println(s);
// }
//lambda表达式
// list.forEach(new Consumer<String>() {
// @Override
// public void accept(String string) {
// System.out.println(string);
// }
// });
//化简为Lambda表达式
// list.forEach(s-> System.out.println(s));
//普通for循环
// for (int i = 0; i < list.size(); i++) {
// System.out.println(list.get(i));
// }
//列表迭代器遍历
/*
列表迭代器实现了迭代器的接口,添加了增加的方法,和指针从后向前的方法
*/
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()){
String s = listIterator.next();
System.out.println(s);
//遍历中添加元素
if ("bbb".equals(s)){
listIterator.add("QQQ");
}
}
System.out.println(list);
}
}
遍历方式的对比
数据结构
数据结构是计算机存储、组织数据的方式。
数据结构概述
常见的数据结构
栈、队列、数组、链表、二叉树、二叉查找树、平衡二叉树、红黑树。
栈
应用:栈内存。
队列
数组
链表
总结
Arraylist 的底层原理
添加数据时会有一个size指针,表示当前集合的数量又指定先一个元素的位置。
Arrayslist集合添加第一个元素时的源码解析:
Arrayslist集合添加100个元素时需要扩容的源码解析:
LinkedList集合
大多使用Conllection中的方法。