1、集合和数组
1、集合概述
由于我们使用的是面向对象语言,所以,我们要经常使用对象。而很多时候,我们可能需要使用很的对象,这个时候,我们就只能使用以前讲过的数组进行存储了,而数组的特点是长度固定。这样的话就不适合变化的数据。所以,java重新提供了一种容器,用于存储对象,这种容器叫集合
2、集合和数组的区别
数组:
数组长度固定。数组可以存储基本数据类型,也可以存储引用类型。数组存储的数据类型是一致的。集合:
集合长度可变。集合只能存储引用类型。集合可以存储不同类型的对象
总结:集合比数组强大,类似于包装类和基本类型的关系
Collection (接口)
|——List (接口)
|——ArrayList (类)
|——Vector (类)
|——LinkedList (类)
|——Set (接口)
|——HashSet (类)
|——TreeSet (类)
Collection接口中成员方法
添加
boolean add(Object obj)
向集合中添加一个元素(常用)
boolean addAll(Collection c)
向集合中添加一个集合的元素
删除
void clear()
删除集合中的所有元素
boolean remove(Object obj)
从集合中删除指定的元素(常用)
boolean removeAll(Collection c)
从集合中删除一个指定的集合元素
判断
boolean isEmpty()
判断集合是否为空
boolean contains(Object obj)
判断集合中是否存在指定的元素(常用)
boolean containsAll(Collection c)
判断集合中是否存在指定的一个集合中的元素
遍历
Iterator iterator()
就是用来获取集合中每一个元素(常用)
长度
int size()
获取集合中的元素个数(常用)
交集
boolean retainAll(Collection c)
判断两个集合中是否有相同的元素
把集合转换成数组
Object[] toArray()
把集合转换成数组(常用)
List接口
1、特点
元素有序可重复,可以通过索引值操作对应位置的元素, 而Set中的元素是无序唯一的
2、成员方法
添加
void add(int index, Object obj)
在指定位置添加元素(常用)
删除
Object remove(int index)
根据指定索引删除元素,并把删除的元素返回(常用)
修改
Object set(int index, Object obj)
把指定索引位置的元素修改为指定的值,返回修改前的值(常用)
获取
int indexOf(Object o)
返回指定元素在集合中第一次出现的索引(常用)
Object get(int index)
返回指定索引位置对应的元素(常用)
ListIterator listIterator()
列表迭代器
截取
List subList(int fromIndex, ints toIndex)
截取集合
迭代器
1、迭代的概念
按照某种方式重复的做事情
2、迭代器Iterator
主要遍历Collection集合中的元素,迭代是取出集合中元素的一种方式
3、原理
由于多种集合的数据结构不同,所以存储方式不同,所以,取出方式也不同。这个时候,我们就把判断和获取功能定义在了一个接口中,将来,遍历哪种集合的时候,只要该集合内部实现这个接口即可。
迭代器是一个内部类,在集合的内部定义了一个类,这个类实现了Iterator接口
4、使用
List list = new ArrayList();
list.add(1);
list.add(3);
Iterator iterator = list.iterator();
while(iterator.hasNext()){
Integer next = (Integer)iterator.next();
System.out.println(next);
}
5、常见问题
ConcurrentModificationException:在迭代的时候给集合增加元素,删除元素(注意:不是通过索引删除)造成的
并发修改异常:在next()方法第一行进行判断,如果预期的修改次数(expectedModCount)和实际的修改次数(modCount)不同就会发生此异常
6、Iterator 和 ListIterator的区别
1、Iterator是ListIterator的父接口
2、Iterator是Collection集合的公共的取出容器中元素的方式,对于List,Set都通用。而ListIterator是List集合的特有的取出元素的方式
3、Iterator中只具备hasNext(),next(),remove()方法,可以删除被遍历到的元素
ListIterator中具备对遍历到的元素进行增(add)删(remove)改(set)查(next)的方法,可以对元素逆向遍历previouse相对于next,hasPreviouse相对于hasNext(用的很少)
7、成员方法
Iterator
boolean hasNext()
若被迭代的集合元素还没有被遍历,返回 true
Object next()
返回集合的下一个元素
void remove()
删除集合上一次 next()方法返回的元素。 (若集合中有多个相同的元素, 都可以删掉)
ListIterator 继承自Iterator
void add(Object obj)
将指定元素插入next()方法返回的元素后面
void set(Object obj)
用指定元素替换next()或previouse()方法返回的元素
boolean hasPrevious()
若被迭代的集合元素还没有被遍历,返回 true
Object previous()
返回集合的上一个元素
List接口的三个子类的特点
1、ArrayList
底层数据结构是数组,查询快,增删慢
线程不安全,效率高。
2、Vector
底层数据结构是数组,查询快,增删慢
线程安全,效率低。
3、LinkedList
底层数据结构是链表,查询慢,增删快
线程不安全,效率高。
4、什么时候使用?
查询多用ArrayList,增删多用LinkedList
LinkedList类
LinkedList 特有的成员方法
添加
void addFirst(Object o)
void addLast(Object o)
获取
Objcet getFirst()
Object getLast()
删除
Object removeFirst()
Object removeLast()
泛型
1、概述
泛型是一种把明确类型的工作放在了创建对象或者调用方法时候才去明确的特殊的类型
泛型就相当于一个预定义类型
2、好处
A、解决了黄色警告线问题
B、把系统运行期间的异常提前到了编译期间
C、优化了程序设计,不需要做强制转换了
3、不足
泛型传入的只能是引用类型
泛型的定义
A、在类上定义
//在类上定义一个泛型
public class MyArrayList<T> {
}
//在类上定义两个泛型
public class MyArrayList<T, S> {
}
//在类上定义两个泛型,且第二个类型必须是第一个类型的子类
public class MyArrayList<T, S extends T> {
}
泛型的使用
可以在继承关系,实现关系,创建对象时使用
在使用过程中,父类或父接口如果没有明确给定类型,那么子类必须定义泛型而且需要和父类或父接口的泛型名字一样
增强for循环
1、格式
for(数组 或 Collection子类 的元素类型 变量名 :数组 或 Collection子类)
{
//使用变量
}
2 方便数组和集合的遍历
3、注意事项
增强for是用来代替Iterator的
不要再遍历的时候用集合对集合本身进行修改
4、集合遍历的四种方式
1、迭代
2、将集合转换为数组(忘记吧)
3、获取集合的长度,通过get()+for遍历
4、使用for高级循环(常用)
for(Object obj : list){
System.out.println(obj);
}
本文详细介绍了Java集合与数组的区别,包括集合和数组的特点、成员方法等,并阐述了如何选择合适的数据结构来实现高效的数据操作。文章还讨论了Java集合的几种实现方式,如ArrayList、Vector、LinkedList等,并提供了实例代码演示。此外,文章还深入探讨了Java集合的迭代器、泛型、列表迭代器等高级特性,以及如何在不同的场景下灵活运用这些特性。
1782

被折叠的 条评论
为什么被折叠?



