集合的理解和好处(出自韩顺平老师视频,变学边做的笔记)
(1)可以动态保存任意多个对象,使用比较方便!
(2)提供了一系列方便的操作对象的方法:add、remove、set、get等
(3)使用集合添加、删除新元素的示意代码
集合的框架体系 (最好背下来)
集合主要是两组(单列集合 , 双列集合)
Collection 接口有两个重要的子接口 List Set,他们的实现子类都是单列集合
Map 接口的实现子类 是双列集合,存放的 K-V(键值对)
Collection接口和常用方法
Collection 接口常用方法,以实现子类ArraryList来演示
package com.hspedu.collection_;
import java.util.ArrayList;
import java.util.List;
public class CollectionMethod {
public static void main(String[] args) {
List list = new ArrayList();
// add: 添加单个元素
list.add("jack");
list.add(10); //这里add都是对象了 list.add(new Integer(10))
list.add(true);
System.out.println("list="+list);
// remove:删除指定元素 这里的remove经过重载,可以指定下标删除 也可以指定元素删除
//list.remove(0); 删除第一个元素
list.remove(true);//指定删除某个元素
System.out.println("list=" + list);
//contains: 查找元素是否存在
System.out.println(list.contains("jack"));
//size:获取元素个数
System.out.println(list.size());
//isEmpty: 判断是否为空
System.out.println(list.isEmpty());
//clear: 清空
list.clear();
System.out.println("list="+list);
// addAll: 添加多个元素 实则就是添加一个collection的集合
List list2 = new ArrayList();
list2.add("红楼梦");
list2.add("三国演义");
list.addAll(list2);
System.out.println("list="+list);
//containsAll: 查找多个元素是否都存在
System.out.println(list.containsAll(list2));
//removeAll: 删除多个元素
list.add("聊斋");
list.removeAll(list2);
System.out.println("list=" + list);
}
}
collection接口遍历元素方式1-使用literator(迭代器)
(1)Iterator对象成为迭代器,主要用于遍历Collection集合中的元素
(2)所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象,既可以返回一个迭代器。
(3)Iterator 仅用于遍历集合,Iterator本身并不存放对象
迭代器的执行原理
Iterator iterator = coll.iterator(); //得到一个集合的迭代器
//hasNext() 判断是否还有下一个元素
while(iterator.hasNext()){
//next()作用: 1.下移 2.将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}
package com.hspedu.collection_;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionIterator {
public static void main(String args[]){
Collection col = new ArrayList();
col.add( new Book("三国演义","罗贯中",10) );
col.add( new Book("小李飞刀","古龙",5) );
col.add( new Book("红楼梦","曹雪芹",34) );
//System.out.println("col="+col);
//遍历 col集合
//1. 先得到 col 对应的 迭代器
Iterator iterator = col.iterator();
//2. 使用while循环遍历
while(iterator.hasNext()){
//返回下一个元素就是 Object 需要记得的是 编译类型是Object 但运行类型是你上面自己输入的类型 也就是Book类型
Object obj = iterator.next();
System.out.println("obj="+obj);
}
//3.当退出while循环后,这时iterator迭代器,指向最后的元素
//iterator.next(); // 这时还往下走,会抛出NoSuchElementException
//4.如果希望再次遍历,需要重置我们的迭代器
iterator = col.iterator();
System.out.println("====第二次遍历====");
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
//然后这边有个iterator遍历的快捷键 itit while => itit
//显示所有的快捷键 ctrl + j
}
}
class Book{
String name;
String author;
int year;
public Book(String name, String author, int year) {
this.name = name;
this.author = author;
this.year = year;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
@Override //该对象的输出形式
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", year=" + year +
'}';
}
}
collection接口遍历元素方式2-增强for循环
增强for循环,可以代替iterator迭代器,特点:增强for就是简化版的iterator,本质一样。只能用于遍历集合或数组
- 基本语法
for(元素类型 元素吗 : 集合名或数组名){
访问元素
}
1.使用增强 for,在Collection集合
2.增强for, 底层仍然是迭代器(可以用断点一步一步看)
3.增强for可以理解成就是简化版本的 迭代器遍历
4.快捷键方式 I
for (Object book : col){
System.out.println(“book=” + o)
}
List接口和常用方法
package com.hspedu.list_;
import java.util.ArrayList;
import java.util.List;
public class ListMethod {
public static void main(String[] args) {
List list = new ArrayList();
list.add("张三丰");
list.add("贾宝玉");
//void add(int index, Object ele):在index位置插入ele元素
//在index = 1 的位置插入一个对象
list.add(1,"韩顺平");
System.out.println("list="+list);
//boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
List list2 = new ArrayList();
list2.add("jack");
list2.add("tom");
list.addAll(1,list2);
System.out.println("list="+list);
//Object get(int index):获取指定index位置的元素 之前有讲过
//int indexOf(Object obj):返回obj在集合中首次出现的位置
System.out.println(list.indexOf("tom"));
//int lastIndexOf(Objec obj):返回obj在当前集合中末次出现的位置
//Object remove(int index): 移除指定index位置的元素,并返回此元素
System.out.println(list.remove(0));
System.out.println(list);
//Object set(int index, Object ele):设置指定index位置的元素为ele,相当于是替换
list.set(0,"陈荣哲");
System.out.println(list);
//List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
System.out.println(list.subList(0,2));
}
}
ArrayList底层结构和源码分析
(1)ArraryList中维护了一个Obejct类型的数组elementData.//存储的值是放在elementData数组的
transient Object[] elementData; //transient 表示瞬间,短暂的,表示该属性不会被序列化
(2)当创建ArraryList对象时,如果使用的时无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍
(3)如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍
让我们通过这段代码进入ArrayList的底层一起去看看吧
package com.hspedu.list_;
import java.util.ArrayList;
public class ArrayListSource {
public static void main(String[] args) {
ArrayList list = new ArrayList();
for(int i = 1; i <= 10; i++){
list.add(i);
}
for(int i=11;i<=15;i++){
list.add(i);
}
list.add(100);
list.add(200);
list.add(null);
}
}
LinkedList底层结构
(1)LinkedList底层维护了一个双向链表
(2)LinkedList中维护了两个属性first和last分别指向 首节点和尾节点
(3)每个节点(Node对象),里面又维护了prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个节点。最终实现双向链表
(4)所有LinkedList的元素的添加和删除,不是通过数组完成的,相对来说效率较高。
LinkedList的底层代码刨析(add添加值)
LinkedList的底层代码刨析(remove)
Set接口基本介绍
(1)无序 (添加和取出的顺序不一致),没有索引
(2)不允许重复元素,所以最多包含一个null
Set接口和常用方法
和List接口一样,Set接口也是Collection的子接口,因此,常用方法和Collection接口一样
同Collection的遍历方式一样
Set接口实现类-HashSet
HashSet的全面说明
(1)HashSet实现了Set接口
(2)HashSet实际上是HashMap
public HashSet(){
map = new HashMap<>();
}
(3)可以存放null值,但是只能有一个null
(4)HashSet不保证元素是有序的,取决于hash后,再确定索引的结果。
(5)不能有重复元素/对象。在前面Set 接口使用已经讲过
Map
Map接口和常用方法
put 添加
remove 根据键删除映射关系
get 根据键获取值
size 获取元素个数
isEmpty:判断个数是否为0
clear:清楚
containsKey:查找键是否存在