目录
1、集合概述
什么是集合,有什么用?
数组其实就是一个集合,集合实际上就是一个容器,集合可以容纳引用类型的数据
为什么集合在开发中使用较多?
集合是一个容器,一次可以容纳多个对象(集合的大小和机器的性能有关,理论无限大)
在实际开发中,假设网页内容连接的是数据库,数据库中有10条记录
假设需要把这10条记录查询出来,在java程序中会将这10条数据封装
成10个java对象,然后将10个java对象放到一个集合中,将集合传递
给前端,然后遍历集合,将一个数据一个数据展现出来
2、集合存储的数据类型
集合中存储的都是java对象的内存地址,或者说集合中存储的是引用,不能直接存储java对象
疑问?为什么list.add(100); 这个集合里面的100是什么数据类型
答案:100,是自动装箱的100,将int型自动装箱成为Integer型的包装型
底层原理:Integer x = new Integer(100); 然后 list.add(x); x 表示的是内存地址
集合之间通过内存地址的存储可以嵌套
3、不同的集合,底层都会对应不同的数据结构
什么是数据结构:
数据结构就是数据进行存储时,存储的方式,例如:数组、二叉树、链表、哈希表
使用不同的集合等同于使用了不同的数据结构
java已经将数据结构实现了,已经写好了这些常用的集合类,只需要掌握怎么使用集合,什么情况用哪种类型的集合
new ArrayList(); 创建一个集合,底层是数组
new LinkedList(); 创建一个集合,底层是链表
new TreeSet();创建一个集合对象,底层是二叉树
集合在哪个包下:
java.util.*
4、集合继承结构图(部分接口和类)
在java中集合分成两大类
第一种类型:单个方式存储元素(超级父接口:java.util.Collection)
集合的接口之间的继承结构图:
Collection接口调用父类接口Iterable的iterator()方法,拿到集合依赖的迭代器对象
Itertor itertor = "Collection 对象".iterator(); itertor 是迭代器对象
总结:
- ArrayList:底层是数组
- LinkedList:底层是双向链表
- Vector:底层是线程安全的数组,效率低
- HashSet:底层是HashMap,放到HashSet集合中的元素等同于放到HashMap集合中的key部分
- TreeSet:底层是TreeMap,放到TreeSet集合中的元素等同于放到TreeMap集合中的Key部分
可以多次看加强记忆
补充:
第二种类型:键值对方式存储元素(超级父接口:java.util.Map)
总结:
- HashMap:底层是哈希表
- Hashtable:底层是线程安全的哈希表,效率低
- Properties:线程安全的属性类,并且key和value只能存储字符串String
- TreeMap:底层是二叉树,TreeMap 集合的Key 可以按照大小顺序排序
总结:
- List集合存储元素的特点:
元素有序可重复:存进去和取出来的顺序相同,元素有下标,存进去1,还可以存1
- Set(对应的是Map)集合存储元素的特点:
元素无序不可重复:存进去和取出来的顺序不一定相同,元素无下标,存进去1,不可继续存1
- SortSet(对应的是SortedMap)集合存储元素的特点:
元素无序不可重复可排序:01同上,可排序是指可以按照大小进行排序
关键点:
Map集合的key,就是一个Set集合
往Set集合中放数据,实际上放到了Map集合的Key部分
理解点:
怎么往集合这个容器里面放东西,怎么取出来的这个过程需要理解
5、Collection接口中常用的方法
提问:Collection中能存放什么元素?
- 在没有使用“泛型”之前,Collection中可以存储Object的所有子类型
- 使用了“泛型”之后,Collection中只能存储某个具体的类型
- 集合后期我们会学习“泛型”,目前先不用管,我们只需要知道Collection中什么都能存,只要是Object的子类型就行
注意:集合中不能直接存储基本数据类型,也不能存储java对象,只能存储java对象的内存地址
Collection中常用的方法
1、boolean add(Object e) 向集合尾部中添加元素,把元素的内存地址添加进集合
代码演示:
package com.lbj.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionTest01 {
public static void main(String[] args) {
//创建一个集合对象,由于接口是抽象的,无法实例化
//多态 父类对象的引用指向子类对象
Collection collection=new ArrayList();
//测试集合中可以放置的是不是内存地址
//自动装箱,Integer x = new Integer(100); collection.add(x),x是内存地址
collection.add(100);
collection.add(3.14);
collection.add(new Object());
collection.add(new Student());
}
}
class Student{
}
2、int size( ) 获取集合中元素的个数,!注意,并不是获取集合中的容量
代码演示:
3、void clear( ) 清空集合中的元素
代码演示:
4、boolean remove(Object o) 删除集合中指定元素
代码演示:
package com.lbj.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionTest01 {
public static void main(String[] args) {
//创建一个集合对象,由于接口是抽象的,无法实例化
//多态 父类对象的引用指向子类对象
Collection collection=new ArrayList();
//测试集合中可以放置的是不是内存地址
//自动装箱,Integer x = new Integer(100); collection.add(x),x是内存地址
collection.add(100);
collection.add(3.14);
collection.add(new Object());
collection.add(new Student());
collection.remove(100);
System.out.println(collection.size());//3
}
}
class Student{
}
5、boolean contains(Object o) 判断集合中是否包含元素o
代码演示:
6、boolean isEmpty( ) 判断该集合中元素个数是否为0
代码演示:
7、Object[ ] toArray( ) 调用这个方法可以把集合转换成数组
代码演示:
package com.lbj.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionTest01 {
public static void main(String[] args) {
//创建一个集合对象,由于接口是抽象的,无法实例化
//多态 父类对象的引用指向子类对象
Collection collection=new ArrayList();
//测试集合中可以放置的是不是内存地址
//自动装箱,Integer x = new Integer(100); collection.add(x),x是内存地址
collection.add(100);
collection.add(3.14);
collection.add(new Object());
collection.add(new Student());
Object[] objects=collection.toArray();
//遍历数组
for (int i = 0; i <objects.length; i++) {
System.out.println(objects[i]);
}
//结果:
//100
//3.14
//java.lang.Object@1540e19d
//com.lbj.javase.collection.Student@677327b6
}
}
class Student{
}
6、Collection 集合迭代(遍历)
迭代:就是遍历,不要将迭代两个字想的太难,因为集合不是数组,没有固定长度,无法通过For循环遍历集合
底层:需要用到Collection继承父类Iterable接口的 iterator( ) 方法,然后再在Collection中调用 iterator( ) 方法返回一个Iterator迭代器对象。
此迭代器对象可以使用其中的两个方法,
一个方法是boolean hasNext() ,表示如果下一个元素存在,则返回true,有点类似指针;
一方法是Object next( ) 返回迭代的下一个元素,且取出来的元素类型都是Object类。
代码演示:
package com.lbj.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
/**
* @author LBJ
* @version V1.0
* @Package com.lbj.javase.collection
* @date 2021/3/28 18:40
* @Copyright 公司
*/
public class CollectionTest02 {
public static void main(String[] args) {
//创建集合对象
Collection collection=new ArrayList();
//添加集合元素
collection.add("abc");
collection.add(100);
collection.add(new Object());
//集合遍历
//第一步:获取集合对象的迭代器对象
Iterator iterator=collection.iterator();
//第二步:开始遍历
while(iterator.hasNext()){
//不管存进去的是什么,拿出来的时候一律都是Object类
Object o=iterator.next();
System.out.println(o);
}
}
}
//结果:
//abc
//100
//java.lang.Object@1540e19d
图示:
图示2:
注意:以上的遍历方式,是所有Collection通用的一种方式(除了Map集合不可以用!!!)
代码演示2:
ArrayList集合,有序可重复
HashSet集合,无序不可重复
package com.lbj.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
/**
* @author LBJ
* @ver