一、为什么使用集合框架
结论:
我们在Java基础内容中学习了变量,学习了数组。这些都是可以存储数据的,变量而言,一次只能存储1个数据,而数组虽然能够存储多个数据,但是只能是同种类型的并且数组一旦定义了,长度不可变,这就是数组的缺点。然而我们实际开发中,经常需要保存一些边长的数据集合,于是,我们需要一些能够动态增长长度的容器来保存我们的数据。而我们需要对数据的保存的逻辑可能各种各样,于是就有了各种各样的数据结构。我们将数据结构在Java中实现,于是就有了我们的集合框架。
二、集合框架体系结构图
Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。
三、List集合接口
3.1 List接口概述
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素
3.2 特点
- 有序(存在下标)
- 元素可重复
3.3 List接口下的实现类
- ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
- LinkedList采用链表存储方式。插入、删除元素时效率比较高
四、Set集合接口
4.1 Set接口概述
一个不包含重复元素的 collection。更确切地讲,set 不包含满足
e1.equals(e2)
的元素对e1
和e2
,并且最多包含一个 null 元素。
4.2 特点
- 无序
- 元素不可重复,唯一性
4.3 List接口下的实现类
HashSet由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
TreeSet基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
五、List和Set接口常用的方法
方法名 | 说 明 |
boolean add(Object o) | 在列表的末尾顺序添加元素,起始索引位置从0开始 |
void add(int index,Object o) | 在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间 |
int size() | 返回列表中的元素个数 |
Object get(int index) | 返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换 |
boolean contains(Object o) | 判断列表中是否存在指定元素 |
boolean remove(Object o) | 从列表中删除元素 |
Object remove(int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
六、实例
package com.zking.test;
public class Student {
private String name;
private String sex;
public Student() {
// TODO Auto-generated constructor stub
}
public Student(String name, String sex) {
super();
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student [name=" + name + ", sex=" + sex + "]";
}
@Override
public boolean equals(Object obj) {
boolean flag = false;
if(obj instanceof Student) {
Student stu = (Student) obj;
if(stu.getName().equals(this.getName())) {
flag = true;
}
}
return flag;
}
}
package com.zking.test;
import java.util.ArrayList;
import java.util.Iterator;
public class Test2 {
public static void main(String[] args) {
//利用ArrayList集合类创建一个容器存储数据
ArrayList list = new ArrayList();
//常用的方法
//1.获取集合长度
System.out.println(list.size());
//2.添加数据
list.add(1);//转成Integer类型
list.add(true);
list.add(true);
list.add("刘凯峰");
//创建一个学生
Student stu = new Student("谢文建","女");
list.add(stu);
System.out.println(list.size());
//包罗万象 杂乱无章
//注意事项:存放的永远都是引用类型的数据。
//因为如果存储的是基本类型,在添加进去之前会自动将基本类型的数据自动转成其所对应的封装类的类型
//查看数据:get 根据下标获取值 从0开始
System.out.println(list.get(1));
//删除|移除remove
list.remove(stu);//根据元素值删除
System.out.println(list.size());
list.remove(0);//根据下标删除
System.out.println(list.size());
// clear 清空集合中所有的数据
list.clear();
System.out.println(list.size());
list.add("sb");
//判断集合是否为空 isEmpty
System.out.println(list.isEmpty());
//contians
System.out.println(list.contains("sb"));
ArrayList list2 = new ArrayList();
list2.add(new Student("张三1", "男"));
list2.add(new Student("张三2", "男"));
list2.add(new Student("张三3", "男"));
list2.add(new Student("张三4", "男"));
Student student = new Student("张三4", "男");
System.out.println(list2.contains(student));
}
}
七、集合框架遍历方式
package com.zz.bookManager.test;
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
// 集合的遍历方式
ArrayList list = new ArrayList();
list.add(1);// 转成Integer类型
list.add(true);
list.add(true);
list.add("刘凯峰");
// 1.for
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("-----");
// foreach
for (Object obj : list) {
System.out.println(obj);
}
// 迭代器----集合框架中遍历元素的最常用的一种方式。
// 调用方法将集合中的数据存放到迭代器容器中,通过迭代器容器提供特有的遍历方式。
Iterator its = list.iterator();
while (its.hasNext()) {// its.hasNext() 如果迭代器容器中存在下一条数据
// 直接输出这条数据
// 获取当前的下一条数据 next();
System.out.println(its.next());
}
}
}
八、泛型
JDK 5 中引入的特性,提供了编译时类型俺去那检测机制,该机制允许在编译时检测到非法的类型。
package com.zking.test;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Test3 {
public static void main(String[] args) {
/**
* 集合框架的泛型使用
* 1.集合存储数据任何类型都可以(Object)
* 2.泛型目的:约束集合只能存储一种类型的数据
* 3.定义泛型在创建集合框架时进行定义
* 比如规定ArrayList存储数据时只能存储字符串
* ArrayList<String> list = new ArrayList<String>();
* ArrayList<Student> list = new ArrayList<Student>();
*/
// 1.通过泛型定义集合 并且实现多态
List<String> list = new ArrayList<String>();
// list.add(1);//错误的 只能存储字符串类型的数据
list.add("中国");
list.add("-_-");
// 拓展:自定义泛型
// 创建一个学生类(某种情况下 学号:int)(某种情况下 学号:String)
// Stu<String> stu = new Stu<String>();
// stu.sid = "111";
// Set 无序 唯一
Set set = new HashSet();
set.add("123");
set.add("123");
set.add("sb");
set.add("sb2");
set.add("nb");
set.add("123");
set.add("123");
System.out.println(set.size());
for (Object object : set) {
System.out.println(object);
}
}
}