一. 集合和数据结构
面向对象的核心是对象,我们要操作多个对象,就需要将这多个对象存储起来。
集合就是存储多个对象的一个容器。
集合的特点:
只能存储引用类型;
长度可变;
可以存储不同数据类型的对象
数组与集合的区别
存储内容 长度 存储内容
数组: 引用类型、基本数据类型 不可变 必须存同一种数据类型
集合: 引用类型 可变 可以存不同数据类型
因为数据不同,所以我们使用的容器不一样。数据是以某种特定的结构存在的,这种结构我们就叫他数据结构。数据的组织形式称为数据结构,不同数据结构的数据必须存在不同的容器中,每一种容器都有有别于其他容器的结构。
程序=数据结构+算法
数据结构
集合结构:属于同一种类型(集合)
线性结构:一次函数关系(y=x),栈、队列、数组、链表
栈:后进先出
队列:先进先出
树形结构:元素之间存在一对多的关系,就橡树一样。二叉树、平衡二叉
树、查找树、红黑树
图形结构:元素之间存在多对多的关系
数组和链表的数据结构:
数组:存储多个同一种元素的容器
特点:元素都有编号,方便获取
优点:查询快
缺点:增删慢
链表:把一些结点链接起来的数据结构(结点:由指针域和数值域组成)
优点:增删快
缺点:查询慢
集合框架体系图
Collection体系结构简图
二. Collection接口
集合层次中的根接口
1.成员方法
(1)添加:
boolean add(E e) 添加元素
addAll(Collection c) 添加集合
(2)删除:
void clear()清除全部元素
boolean remove(object o) 移出制定元素
boolean removeAll(Collection c) 移除指定集合C中的所有元素
(3)判断:
boolean isEmpty() 判断是否为空(是否不包含元素)
boolean contains(Object o) 判断是否含有某个元素
boolean containsAll(Collection c) 判断是否含有指定集合中所有元素
(4)获取长度:
int size() 获取集合的长度
(5)遍历(获取):
Iterator<E> iterator() 遍历集合中的元素
(6)交集:
boolean retainAll(Collection c)求交集
(7)获取数组:
Object[] toArray() 集合转数组
2.代码示例
(1)基本操作代码示例
public class CollectionDemo2 {
public static void main(String[] args) {
// 创建对象
// Collection c=new Collection(); 错误 因为接口不能被实例化
// 通过实现了该接口的子类来实例化
Collection c = new ArrayList<>();
// 添加元素
c.add("hello");
c.add("world");
c.add("java");
System.out.println(c);
// 判断
// 判断是否为空(是否包含元素)
System.out.println(c.isEmpty());
//判断是否包含某个元素
System.out.println(c.contains("world"));
System.out.println(c.contains("哈哈哈"));
// 获取长度
int size = c.size();
System.out.println(size);
// 删除功能演示
System.out.println("remove:" + c.remove("world"));
//remove删除了返回true; 没找到,删除不了,返回false
System.out.println("remove:" + c.remove("hahaha"));
c.clear();// 不建议使用这个 全部清空,太暴力
System.out.println(c);
}
}
(2)带All的方法代码示例(两个集合之间的互操作)
public class CollectionDemo21 {
public static void main(String[] args) {
//创建一个集合
Collection c1=new ArrayList();
c1.add("abc1");
c1.add("abc2");
c1.add("abc3");
c1.add("abc4");
//创建另一个集合
Collection c2=new ArrayList();
c2.add("abc4");
c2.add("abc5");
c2.add("abc6");
c2.add("abc7");
//boolean addAll(Collection c)向集合中再添一个集合
System.out.println("addAll:"+c1.addAll(c2));
//boolean removeAll(Collection c) 从集合中删除一个指定的集合元素
//只要有数据被删除 就返回true
System.out.println("removeAll:"+c1.removeAll(c2));
//boolean containsAll(Collection c)判断集合中是否存在另一个集合的元素
//只有所有元素都包含才返回true
System.out.println("containsAll:"+c1.containsAll(c2));
//boolean retainAll(Collection c)获取交集
/*
* 如果有两个集合A和B
* A集合对B做交集
* A集合中保存交集元素 ,B集合不发生改变
* 返回值是A集合是否发生了改变
*/
System.out.println(c1.retainAll(c2));
}
}
(3)集合遍历的几种方式
方式1 集合转数组再遍历
// 创建一个集合对象 (多态)
Collection c = new ArrayList();
/*
* 注意事项: add(Object o)接收的是一个Object类型的对象
* 在接收的时候,已经向上转型了,也就是说存进去之后,存的已经是
* Object了 所以在转换数组的时候转换成的就是一个Object数组
* 取出来的每一个元素也就是一个Object
*/
c.add("aaa");
c.add("bbb");
c.add("ccc");
c.add("ddd");
// 转换成数组
Object[] str = c.toArray();
// 遍历
for (int i = 0; i < str.length; i++) {
Object o = str[i];
System.out.println(o.toString());// 调用子类的toString
String s = (String) o;// 向下转型
System.out.println(s.length());
}
方式2 通过get方法遍历(List独有功能)
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
for (int i = 0; i < list.size(); i++) {
String s = (String) list.get(i);
System.out.println(s);
}
方式3 通过迭代器遍历
/**
* iterator遍历
* Iterator iterator()用于获取集合中的每一个元素
* 成员方法:
* Object next()获取元素,并自动移向下一个元素的位置
* boolean hasNext()判断迭代器中是否有下一个元素
*/
// 创建一个集合对象 (多态)
Collection c = new ArrayList();
// 添加元素
c.add("aaa");
c.add("bbb");
c.add("ccc");
c.add("ddd");
// 通过集合对象获取迭代器对象
// Iterator是接口,这是接口多态,返回一个实现了接口的子类对象
Iterator iterator = c.iterator();
while (iterator.hasNext()) {
String s = (String) iterator.next();
System.out.println(s);
}
三. List接口
List特点: 有序、根据索引值进行精确操作、元素可以重复
List三个常见实现类:
ArrayList:底层数据结构是数组,查找快、增删慢、线程不同步,效率高
LinkedList:底层数组结构是链表,查找慢、增删快、线程不同步、效率高
Vector:底层数据数据结构是数组,查找快、增删慢、线程同步、效率低、安全
从JDK1.2开始,使用List替代了Vector
1.List特有方法
(1)添加功能
void add(int index,Object obj):在指定索引处添加元素
(2)删除功能
Object remove(int index):根据指定索引删除元素,并把删除的元素返回
(3)修改功能
Object set(int index,Object obj):把指定索引位置的元素修改为指定的
值,返回修改前的值
(4)获取功能
int indexOf(Object o):返回指定元素在集合中第一次出现的索引
Object get(int index):获取指定位置的元素
ListIterator listItetator():列表迭代器(list独有,可以向后遍历,
增、删、改列表)
(4)截取功能
List subList(int fromIndex,int toIndex):截取集合(含头不含尾)
(5)代码示例
public class ListDemo1 {
public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();
// 添加元素
list.add("aaa");
list.add("bbb");
list.add("ccc");
//对于以下操作索引的方法,要注意IndexOutOfBoundsException异常
// void add(int index,Object obj)在指定位置添加元素
list.add(1, "hello");
list.add(3, "world");
System.out.println("list:" + list);
// Object remove(int index)根据指定索引删除元素,并把删除的元
素返回
System.out.println("remove:" + list.remove(3));
// Object set(int index,Object obj)把指定索引位置的元素改为
指定的值,返回修改前的值
System.out.println("set:" + list.set(0, "change"));//将索
引为0处的元素的内容改为“change”
System.out.println("list:" + list);//打印修改后的数组
// Object get(int index)获取指定位置的元素
System.out.println("get:" + list.get(0));//获取索引0处的元素
// int indexOf(Object o)返回指定元素第一次出现的索引
System.out.println(list);//打印当前数组
int index=list.indexOf("ccc");//获取“ccc”第一次出现的索引
System.out.println(index);//打印索引值
//list<E> subList(int formIndex,int toIndex):截集合(含头
不含尾)
List list2=list.subList(0, 2);//截取索引0-2间的集合,有0没2
System.out.println(list);//打印原串(截取操作不影响原集合)
System.out.println(list2);//打印截取的集合
}
}
|
|