目录
1、集合的定义
1)集合实际上是一个容器,可以容纳其他类型的数据。集合不能直接存放基本数据类型,另外集合也不能直接存储java对象,而存储的是java对象的内存地址(引用)
2)为什么集合在开发中使用较多?
集合是一个容器,是一个载体,可以一次容纳多个对象,实际开发中,假设连接数据库,数据库当中有10条记录,那么假设把这10条记录查询将10个数据封装成10个java对象,然后将10个java对象放到某一个集合当中,将集合传到前端,然后遍历集合,将一个数据一个数据展现出来
list.add(100);//自动装箱
注意:
集合再java中本身就是一个容器,是一个对象,集合在任何时候存储的但是"引用"
3)java中每一个不同的集合,底层对应不同的数据结构,往不同的集合中存储元素,等于将数据放到了不同的数据结构(数据存储结构)当中。其中:数组、二叉树、链表、哈希表都是常见的数据结构
4)new ArrayList(); 创建一个集合,底层是数组
new LinkedList();创建一个集合对,底层是链表
new TreeSet(); 创建一个集合对象,底层是二叉树
5)集合类和集合接口都在在java.utill包下
2、集合的继承结构
在java中集合分为两大类:
一类是单个方式存储元素,这一类集合中超级父接口:java.utill.Collection;
一类是以键值对的方式存储元素,这一类元素中超级父类接口是:java.utill.Map;
2.1 超级父接口Collection
L i s t
2.2 超级父接口Map
2.3 总结
ArrayList:底层是数组
LinkedList:底层是双向链表
Vector:底层是数组,线程安全的,效率较低,使用较少
HashSet:底层是HashMap,放到HashSet集合中的元素等同于放到HashMap集合key部分了
TreeSet:底层是TreeMap,放到TreeSet集合中的元素等同于放到HashMap集合key部分了
HashMap:底层是哈希表
Hashtable:底层也是哈希表,只不过线程安全的,效率较低,使用较少
Properties:是线程安全的,并且key和value只能存储字符串String
TreeMap:底层是二叉树,可以自动按照大小顺序排序
List集合存储元素的特点:
有序:存进去和取出来的顺序相同,每一个元素都有下标
可重复:存进去1,还可以存储1
Set集合存储元素的特点:
无序:存进去和取出来的顺序不一定相同,元素没有下标
不可重复:存进去1,不可以再存储1
SortedSet集合存储元素特点: 无序不可重复的,
元素可排序:可以按照大小顺序排列
Map集合的特点
Map集合的key,就是一个Set集合
往Set集合中放数据,实际上放到了Map集合的key部分
3、Collection接口
3.1 Collection存放的元素类型
没有使用“泛型”之前Collection可以存储Object的所有子类型
使用“泛型”之后,Collection只能存储某个具体的类型
(集合中不能直接存储基本数据类型,也不能存储java对象,存储的是java对象的内存地址)
3.2 Collection的常用方法
1)boolean add(Object e)向集合中添加元素
//多态机制,接口是抽象的,无法实例化
Collection c = new ArrayList();
//测试Collection接口中的常用方法
c.add(1200);//自动装箱,实际上是放进去一个对象的内存地址。Integer c = new Integer(1200);
c.add(3.14);//自动装箱
c.add(new Object());
c.add(new Student());
c.dd(true);//自动装箱
System.out.println("集合中的元素个数是:" + c.size());//5
2)int size()获取集合中的元素的个数
3)void clear()清理集合
4)boolean contains(Object o)判断当前集合中是否包含元素o,包含返回ture,不包含返回false;
c.add("绿巨人");
System.out.println(c.contains("绿巨人"));
5)boolean remove(Object o)删除集合中的某个元素
c.remove("绿巨人");
6)boolean isEmpty()判断该集合中元素中的个数是否为0
c.clear();
System.out.println(c.isEmpty());//true
7)*Object[ ] toArray()集合转换成数组
c.add(1200);
c.add(3.14);
c.add("12345");
//转换成数组
Object[] objs = c.toArray();
for(int i = 0 ; i<objs.length ; i++){
//遍历数组
object o = objs[i];
System.out.println(o);//调用toString方法
}
4、集合遍历/迭代
4.1 如何遍历集合
迭代方法是Collection通用的一种方法,在Map集合中不能用。在所有的Collection以及子类当中使用
//创建集合对象
Collection c = new ArrayList();
//添加元素
c.add("abc");
c.add("def");
c.add(100);
c.add(new Object());
//对集合Collection进行遍历/迭代
//第一步:获取集合对象的迭代器对象Iterator
Iterator it = c.iterator();//、、、、、、、、、、、、、、c调用iterator()拿到迭代器,迭代器是个对象,其中对象有两个方法
//第二步:通过以上获取的迭代器对象开始迭代/遍历集合
/*
以下两个方法是迭代器对象Iterator中的方法:
boolean hasNext()如果仍有元素可以迭代,则返回ture。
Object next() 返回迭代的下一个元素。
*/
while(it.hasNext()){
Object obj = it.next();
System.out.println(obj);
}
Collection c = new ArrayList();
//添加元素
c.add(1);//自动装箱成Integer类型
c.add(2);
c.add(3);
c.add(4);
//迭代集合
Iterator it = c.Iterator();
while(it.hasNext()){
//存进去什么类型,取出来还是什么类型
Object obj = it.next();
if(obj instanceof Integer){
System.out.println("Integer类型");//这里调用toString方法转换成了字符串
}
}
4.2 迭代器是通用的
HashSet集合:无序不可重复
无序:存进去和取出的顺序不一定相同;
不可重复:存了100不可能再存100;
Collection c2 = new HashSet();
//添加元素
c2.add(100);//自动装箱成Integer类型
c2.add(2);
c2.add(33);
c2.add(43245);
c2.add(100);
//迭代集合
Iterator it2 = c2.Iterator();
while(it2.hasNext()){
System.out.println(it2.next());//这里调用toString方法转换成了字符串
}
5、深入Collection的contains方法
contains方法是判断集合中是否包含某个元素的方法
底层调用了equals方法进行比较,并且String重写了equals方法,如果不重写equals方法则会比较内存地址
放在集合中类型一定要重写equals方法,八大基本类型的包装类都重写了equals方法
public class asdf{
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
//向集合中存储元素
String s1 = new String("abc");
((ArrayList) c).add(s1);
String s2 = new String("def");
((ArrayList) c).add(s2);
//新建的对象String
//集合中是否包含x?包含返回ture
String x =new String("abc");
System.out.println(c.contains(x));//true
}
}
import java.util.ArrayList;
import java.util.Collection;
public class asdf{
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
//向集合中存储元素
String s1 = new String("abc");
((ArrayList) c).add(s1);
String s2 = new String("abc");
//((ArrayList) c).add(s2);
c.remove(s2);//这里s2和s1是相同的,所以删s2就是删s1
//如果s2也创建出来了,那么删s2就是删s2
System.out.println(c.size());
}
}