------Java培训、Android培训、iOS培训、.Net培训、期待与您交流------
1.集合的概述
集合的由来:
我们学习的java语言是面向对象的语言, 而面向对象的语言对事物的描述都是通过对象体现的,那么为了方便的操作多个对象
我们应该将多个对象存储起来! 那么既然要存储多个对象,我们就需要使用一个容器类型的变量进行存储!
那么到目前为止我们都学过那些容器呢?
数组 : 不能满足我们变化的需求
字符串缓冲区 : 字符串缓冲区返回的都是字符串
数组 ,字符串缓冲区都不能满足我们的需求那么怎么办呢? 这个时候java就给我们提供集合!
集合和数组的区别:
a: 长度的区别
数组的长度是固定的
集合的长度是可变的
b: 存储数据类型的区别
数组可以存储基本数据类型,也可以存储引用数据类型(对象数组)
集合只能存储引用数据类型
c: 内容区别
数组只能存储同一种数据类型的元素
集合可以存储不同种 数据类型的元素
我们都知道,集合是用来存储多个元素的,那么即使是存储多个元素,有的时候我们的需求也是不同的,比如: 排序 . 针对不同的需求
java就给我们提供了不同的集合,而这些集合的数据结构不同.而数据结构不同不重要,重要的是你都可以帮我们存储数据,而且我们
还可以使用这些数据,由此可见这些集合类之间就存在共性的内容,有共性的内容的内容我们因该将其向上抽取,就形成了集合的继承体系
数据结构: 存储数据的方式
Collection: Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。
一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。
Collection的功能概述:
a: 添加功能
boolean add(Object obj) : 添加一个元素
boolean addAll(Collection c): 添加一个集合的元素
b: 删除功能
void clear(): 移除此 collection 中的所有元素(可选操作)。
boolean remove(Object o): 删除一个元素
boolean removeAll(Collection c): 删除一个集合的元素,删除一个以上算是删除还是删除所有的算是删除?
c: 获取功能
Iterator iterator(): 迭代器(重点)
d: 判断功能
boolean contains(Object o): 判断是否包含指定的元素
boolean containsAll(Collection c): 判断是否包含一个集合的元素,包含一个以上算是包含,还是包含所有的算是包含呢?
boolean isEmpty(): 判断集合是否为空
e: 长度功能
int size(): 获取集合的长度
f: 获取交集的功能
boolean retainAll(Collection c): 获取交集,获取到的交集元素去哪里了,返回的boolean类型的值表示神马意思?
g: 集合转数组的功能
Object[] toArray():
注意 : 集合转数组的功能
import java.util.ArrayList;
import java.util.Collection;
//集合转数组的功能 : Object[] toArray():
Collection举例练习
public class CollectionTest {
public static void main(String[] args) {
// 创建集合对象
Collection c = new ArrayList() ;
// 添加元素
c.add("hello");
c.add("world");
c.add("java");
// 首先将集合转换成数组,调用toArray方法
Object[] objs = c.toArray() ;
// 遍历数组
for(int x = 0 ; x < objs.length ; x++){
// 因为在Object中没有length()所以就报错了
// System.out.println(objs[x].length());
// 向下转型:多态的形式
String s = (String)objs[x] ;
// 输出
System.out.println(s + "----" + s.length());
}
}
}
2迭代器:
迭代器: Iterator iterator()
Iterator遍历使用的两个方法:
boolean hasNext(): 判断是否存在元素
Object next(): 获取元素,并将指针向后移动一位
使用集合存储自定义对象,使用迭代器进行遍历
分析:
a: 定义一个类 (Person)
b: 创建集合对象
c: 创建自定义对象
d: 向集合中添加自定义对象(元素)
e: 遍历
(1): 获取迭代器对象
(2): 使用迭代器遍历
练习:
(1)使用集合存储字符串并使用迭代器进行遍历
(1)使用集合存储字符串并使用迭代器进行遍历
class CollectionTest01{
public static void main(String[] args){
//创建集合对象
Collection c = new ArrayList();
//向集合中添加元素
c.add("hello");
c.add("world");
c.add("java");
//创建迭代器对象
Iterator it = c.iterator();
//遍历
while(it.hasNext()){
//向下转型
String str = (String)it.next();
//输出
System.out.println(str);
}
}
}
(2)使用集合存储自定义学生类并使用迭代器进行遍历
//创建学生类
public class Student {
private String name ;
private int age ;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//测试类
public class CollectionTest02 {
public static void main(String[] args){
//创建集合对象
Collection c = new ArrayList();
//创建学生对象
Student s1 = new Student("小强" , 24);
Student s2 = new Student("小迪" , 21);
//添加元素
c.add(s1);
c.add(s2);
//创建迭代器对象
Iterator it = c.iterator();
//使用循环
while(it.hasNext()){
//向下转型
Student s = (Student)it.next();
//输出
System.out.println(s.getName() + "----" + s.getAge());
}
}
}
3 List集合的特点以及遍历方式:
List是Collection的一个子接口, 在该接口中元素是有序(存储和取出的顺序)的,并且元素可以重复 .
List集合遍历方式
(1)使用List存储自定义对象,然后使用迭代器进行遍历
分析:
(1): 自定义一个类
(2): 创建集合对象
(3): 创建自定义对象
(4): 把自定义对象添加到集合中
(5): 使用 迭代器进行遍历
a: 获取迭代器
b: 遍历
//遍历举例同上,只是创建集合对象将Collection改为List
(2)List集合特有的遍历方式: 使用get方法以及size方法来完成
代码实现为:
class ListTest{
public static void main(String[] args){
//创建List集合对象
List list = new ArrayList();
//添加元素
list.add("hello");
list.add("world");
list.add("java");
//遍历
for(int i = 0 ; i < list.size() ; i++){
//向下转型
String result = (String)list.get(i);
//输出
System.out.println(result);
}
//使用List特有的迭代器遍历 :ListIterator
// ListIterator
listIterator()
ListIterator it = list.listIterator() ;
// 遍历
while(it.hasNext()){
System.out.println(it.next());
}
}
}
4 集合中元素的修改方法
集合中元素的修改:
迭代器是依赖于集合存在的. 在获取迭代器的时候之前已经添加过元素了,而在遍历的时候,使用的迭代器进行遍历.
而往集合中添加元素的时候,使用的集合在添加元素,这时候迭代器不知道其修改了集合.
一句话: 迭代器在遍历集合的时候使用集合来修改元素
处理方案:
a: 迭代器在遍历的时候使用 迭代器修改元素
b: 集合自身遍历的时候,只能使用集合修改元素
5 list集合3个子类的特点
list集合3个子类的特点:
ArrayList
底层是靠数组实现的: 查询快, 增删慢
线程不安全 , 效率高
Vector
底层是靠数组实现的: 查询快, 增删慢
线程安全 ,效率低
LinkedList
底层是靠链表实现的: 查询慢, 增删快
线程不安全 , 效率高
在以后的开发中到底使用哪个集合呢?
看需求
要安全吗?
要: Vector
不要: LinkedList 或者 ArrayList
查询多还是增删多呢?
查询多: ArrayList
增删多: LinkedList
如果不明白,就使用ArrayList