Collection集合
什么是集合?
集合就是一个容器,可以存储多个元素
为什么要用集合?
之前我们学习过很多的容器,比如变量,数组,StringBuilder,有这么多的容器,为什么还要使用集合呢?
因为变量只能存储一个数据,不能存储多个
因为数组有个弊端,一旦初始化长度就固定了
因为StringBuilder虽然可以存储任意的数据,但是存储进去之后都拼接成字符串了,取用不方便呀
所以咱们出现了一个非常重要而且常用的工具,就是集合!
集合的特点:
1.集合是一个容器,可以存储多个元素
如果没有加泛型,一个集合中可以存储不同类型的数据
如果加了泛型,一个集合只能存储泛型规定呢同一类型的数据,推荐加泛型
2.集合的的长度可以改变
3.集合只能存储引用数据类型的数据,不能存储基本数据类型 数据
由于我们有了自动转箱,其实如果直接存储基本数据类型也是可以的,只不过是先将基本数据类型的数据转为了引用数据类型的数据,其实最终存储的还是只能引用数据类型的数据
4.集合有些有索引,有些没有索引
面试题
数据和集合的区别?
1.数组长度固定,集合长度可变
2.数组可以存储任意类型的数据,集合只能存储引用数据类型的数据.
`集合体系的由来
集合不是一个类,而是一系列的类,集合就是我们现实世界的容器一样,现实世界的容器根据作用,特点,容量等
不用可以分为不通用的容器,Java中的集合也是类型的情况,根据集合的特点获取作用不用也分为很多的集合.不同集合
有一些不同的特点,但是还会有很多相同的特点,条相同的东西我们就可以不断向上抽去除福来(接口),最终就形成了
集合的继承体系(集合的体系.)
集合的体系
Collection(单列集合)
|-ArrayList
|-Vector
|-LinkedList
|-Set:存取无序,无索引,不能存储重复元素
|-HashSet
|-LinkedHashSet
|-TreeSet
Map(双列集合):
学习的时候从上往下
因为最上面的父类(接口)定义最共性的内容,学习了共性那么下面所有的具体实现类共性操作我们都学会了
学会了共性之后,在去针对某个具体的集合去学习它特性(非共性)的内容,那么所以的集合我们都能轻松搞定
使用的时候从小往上
使用的时候是使用具体的实现类的功能上面的共性的类(接口)都是抽象的方法
Colletion
共性的常用方法
增
boolean add(E e):添加元素,添加成功返回true,添加失败返回false
删
void clear():清空集合(删除集合中的所有元素)
bolean remove(Object o ):删除集合中的指定元素
查
int size():返回集合中的元素的个数
Iteratoriterato()
判断方法
boolean coontains(Object o ):判断集合阿忠是否包含该元素
boolean isEmpty():判断集合中是否有元素
面试题:
以下方法不属于Collection接口的是(BD)
A.remove(Object o )
B.get(int index)
C.clear()
D.remove(int index)
迭代器
一个取出集合元素(遍历)的工具
Iterator即可
boolean hasNext():判断集合中是否还有下一个元素
E next():获取集合中下一个袁姗姗
void remove():删除集合中的元素
使用迭代器去获取元素,如果没有元素就会抛出一个异常:NoSuchElementException
步骤:
1.创建集合
2.添加元素
3.迭代器遍历
a.获取到迭代器对象
b.在while循环中判断是否有下一个元素
c.在while循环红获取下一个元素.
//1.创建集合
Collection<String>c = new ArrayList<>();
//2.添加元素
c.add("hello");
c.add("world");
c.add("java");
c.add("php");
//3.迭代器遍历
//a.获取到迭代器对象
Iterato<String>it = c.iterator();
//b.在while循环中判断是否有下一个元素
while(it.hasNext()){
//c.在while循环中获取下一个元素
String str = it.next();
Systemo.out.println(Str);
}
集合的遍历方法
方法一:普通for,结合get(int index)和size()方法[只适用于List体系的集合]
//创建一个集合对像
ArrayListcoll = new ArrayList<>();
////往集合中添加元素
coll.add(“姚明”);
coll.add(“科比”);
coll.add(“麦迪”);
coll.add(“詹姆斯”);
coll.add(“艾弗森”);
for(int i = 0; i<coll.size(); i++){
System.out.println(coll.get(i));
}
方式二:迭代器(Iterator)[适用于所有的Collection集合]
//1.创建集合
Collection<String>c = new ArrayList<>();
//2.添加元素
c.add("hello");
c.add("world");
c.add("java");
c.add("php");
//3.迭代器遍历
//a.获取到迭代器对象
oIterato<String>it = c.iterator();
//b.在while循环中获取下一个元素
String str = it.next();
System.out.println(str);
}
方式三:增强for [适用于所有的Collection集合]
// (1)创建集合
Collection<String> c = new ArrayList<>();
// (2)添加元素
c.add("hello");
c.add("world");
c.add("java");
c.add("php");
for(String s:c){
// s就是其中的每一个元素
System.out.println(s);
}
增强for
JDK1.5的新特性,可以遍历数组和Collection集合
格式:
for(元素类型 元素名:数组或者Collection集合){
System.out.println(元素名);
}
增强for的底层,遍历集合使用的是迭代器
JDK1.5的新特性:
自动拆装箱、增强for、泛型
泛型
JDK1.5的新特性
格式:<类型>
泛型中的类型只能是引用数据类型
泛型可以理解成一种广泛的类型,不写固定的某种类型,你想让他是什么类型就可以是什么类型
泛型中的类型就规定了集合中存存的元素的类型
泛型使用是注意事项
泛型前后必须一致
ArrayList list = new ArrayList(); ×
ArrayList list = new ArrayList(); √
JDK1.7的新特性:菱形泛型.后面可以不加泛型
ArrayListlist = new ArrayList<>();
泛型的好处
1.省去了强转的麻烦,泛型规定了什么类型,取出元素自动就是呢个类型
2.将解决问题的时间提前了,将允许时期可能出现的异常,提前到了编译时期解决