集合:
集合分为单列集合和双列集合,一个是存储单个数据,一个是存储数据和对应的key值
集合和数组的相异点:
1.集合相较于数组更加灵活,数组的长度一旦创建就是固定的而集合的长度是可变的.
2.数组存储数据单一,并且可以存储基本数据类型,集合一般存储的是对象数据,只能存储引用数据类型,当集合想要存储基本数据类型的时候需要使用对应的包装类.
3.数组对数据的功能操作比较单一,而集合当中提供了大量的API方法
4.数组的数据存储特点比较单一(有序有索引元素可重复),对于集合来说,不同集合类型特点具有多样性。
集合框架体系:
Collection父接口有两个重要的子接口,List接口和Set接口
List接口有三个重要的实现类,ArrayList类,LinkedList类,Vector类
Set接口有两个重要的实现类,HashSet类和TreeSet类
HashSet类和一个重要的子类,LinkedHashSet类
Collection单列集合常用的API方法:
1. boolean add(E e),确保此集合包含指定的元素(可选操作)。
2. boolean addAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合(可选操作)。
3. void clear() 从此集合中删除所有元素(可选操作)。
4.boolean contains(Object o) 如果此集合包含指定集合中的所有元素,则返回true。
5.boolean ifEmpty() 如果此集合不包含元素,则返回true。
6.boolean remove(E e) 从该集合中删除指定元素的单个实例(可选操作)
7.boolean removeAll(Collection<?> c) 此集合中元素若在指定集合中则删除(可选操作)
8.boolean retainAll(Collection<?> c) 此集合中元素若在指定集合中则保留(可选操作)
9.int size() 返回此集合中的长度。
10.Object[] toArray() 把此集合中的元素转化为数组。
迭代器:
在遍历容器的时候,如果该容器没有索引,那么我们就需要通过迭代器的方式进行遍历
Iterator:
1.它也是集合当中的一员,与List和Map不同的是,List和Map主要是用来进行数据的存储,而Iterator它主要是用来遍历集合当中的元素值的
因此,我们一般把Iterator称之为Java当中的迭代器
2.单列集合当中的顶级父接口Collection继承了Iterable接口当中定义了一个抽象方法iterator()
3.Collection接口也含有iterator()方法
4.获取Collection集合当中的迭代器需要通过iterator()方法来得到Iterator类对象
迭代的概念:
1.首先需要通过调用iterator()方法来获取迭代器对象,该迭代器对象中包含了集合当中存储的元素,迭代器内容有一个叫指针的东西,用来指向元素在迭代器当中的位置
当程序获取迭代器的时候,指针首先指向了-1的位置。
2.其次调用hasNext()方法,是用来判断该迭代器当中是否还有下一个元素,如果有下一个元素,就返回true,此时指针的位置并不发生移动
3.如果有下一个元素,程序最后调用next()方法,就会把下一个元素对象进行返回,这样我们就拿到了集合当中的第一个元素值,接下来再次调用hasNext()方法
如果还有下一个元素,那就再次调用next()方法把下一个元素值返回,以此类推,hasNext()方法的返回为false,就代表迭代器迭代到了容器的末尾位置
程序结束
简而言之:判断是否有下一个元素,如果有,就取出下一个元素,知道取到集合当中的最后一个元素,程序结束,这种方式我们称之为迭代
Iterator迭代器中常用的方法:
1.public boolean hasNext() 判断是否有下一个元素
2.public E next() 获取下一个元素值
增强for循环:
是在JDK1.5之后出现的,对迭代器遍历进行优化,可以使用for each语法来对容器进行遍历
语法结构:
for(容器元素的数据类型 元素变量名:容器对象[Collection单列集合或者数组]){
//....
}
泛型:
当定义或者声明的时候,如果不确定使用什么数据类型的时候,可以使用未定义的类型来指定 E K V M N....
泛型的作用:
1.可以在程序运行过程中规避掉一些可能发生的异常(ClassCastException),从而从运行期可能发生的异常提升到编译期(代码编写过程中)
2.省略掉一些不必要的强转操作。
使用泛型:
泛型类、泛型方法、泛型接口
泛型类:
语法格式: 修饰符 class 类名<代表泛型的单词变量> {}
使用泛型类的时候,直接给类的上面指定一种具体的数据类型
定义泛型接口类的实现类有两种定义方式:
1.实现类的泛型跟着泛型接口走
2.实现类的泛型自定义
备注:如果在创建泛型类对象时,不指定泛型的具体数据类型,系统会把泛型指定为Object(顶级父类)类型。
泛型方法:
语法格式: 修饰符 <代表泛型的但此变量> 返回值类型 方法名称(参数列表(含有泛型));
备注: 如果方法上面的泛型和所在的类没有关联性,一般我们传入什么样的数据,该方法的泛型就自动匹配为什么样的数据类型。
泛型接口:
语法格式: 修饰符 interface 接口名称<代表泛型的但此变量> {}
实现类:
1. 实现类不指定泛型跟着父接口走
2. 指定实现类的泛型
备注:
1.如果只指定父接口当中的类型,不明确指定实现类的的类型,在使用它的实现类时候,也不指定具体的类型,程序默认识别为父接口当中的类型
如果使用其他数据类型值,程序会抛出java.lang.ClassCastException 类型转换异常
2.如果父接口和实现类都指定了类型,那么相当于没有指定数据类型,使用的还是未知的数据类型。
泛型的通配符?
当在程序中使用泛型的时候,如果不确定使用什么样的数据类型,可以使用泛型通配符?来表示,?--->Object
备注:
当集合当中使用到了泛型通配符?代表只能对集合元素检索和删除操作,不能进行添加和修改操作。
泛型的上下限:
有时候我们在使用泛型的时候,不能随意的指定泛型的具体数据类型
<? extend E> 泛型的上限 意思是只能使用E类型或者E类型的子类型
<? super E> 泛型的下限 意思是只能使用E类型或者E类型的父类型
List接口类:
它是Collection接口的子接口,保留了Collection接口当中的所有API方法和特点
特点:
1.元素可重复
2.元素是有序的(存储的顺序和取出的顺序是一样的)
3.List接口当中提供的带有索引的方法,List接口存储的元素是有索引的
List接口有两个重要的实现类:
ArrayList实现类和LinkedList实现类
List接口当中常用的API方法:
1.void add(int index,E element) 将指定的元素插入此列表中的指定位置(可选操作).
2.boolean addAll(int index,Collection<? extend E> c) 将指定集合中的所有元素插入到此列表中的指定位置(可选操作).
3.E get(int index) 返回此列表中指定位置的元素
4.int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1
5. ListIterator<E> listIterator(int index) 从列表中的指定位置开始,返回列表中的元素(按正确顺序)的列表迭代器。
6. E remove(int index) 删除该列表中指定位置的元素(可选操作)。
7. E set(int index, E element) 用指定的元素(可选操作)替换此列表中指定位置的元素。
8. default void sort(Comparator<? super E> c) 使用随附的 Comparator排序此列表来比较元素。
说明:
sort(Comparator<? super E> c) 按照指定的排序规则对List集合进行排序
Comparator 它是一个接口
有一个重要的方法: int compare(Object o1,Object o2)
如果o1对象 - o2对象 代表升序 小--->大
如果o2对象 - o1对象 代表降序 大--->小
如果是引用数据类型,不是数值型
搜索
复制
标签:迭代,元素,指定,接口,集合,CollectionAndGeneric,泛型 From: https://www.cnblogs.com/grix/p/16589410.html