集合:
-
按照存储结构:单列集合(Collection)和双列集合(Map)
集合相较于数组两者的区别:
1.集合的长度一般是可变的,数组一旦创建长度是固定的
2.数组存储的数据比较单一,并且可以存储基本数据类型,集合一般存储的是对象数据,只能存储引用数据类型,当集合当中想要存储基本数据类型需要使用基本数据类型对应的包装类型
3.数组对数据的功能操作比较单一,集合当中提供了大量的API方法
4.数组数据的存储特点比较单一(有索引、有序、元素可重复),对于集合来说,不同集合类型特点具有多样性 -
集合的框架体系:
1.Collection父接口两个重大的子接口:List接口和Vector接口
2.List接口有三个重大的实现类:ArrayList类和LinkedList接口和Vector类
3.Set接口有两个重大的实现类:HashSet类和TreeSet类
4.HashSet类有一个重大的实现类:LinkedHashSet类
-
API
- boolean add(E e) 确保此集合包含指定的元素(可选操作)。
- boolean addAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合(可选操作)。
- void clear() 从此集合中删除所有元素(可选操作)。
- boolean contains(Object o) 如果此集合包含指定的元素,则返回 true 。
- boolean isEmpty() 如果此集合不包含元素,则返回 true 。
- boolean remove(Object o) 从该集合中删除指定元素的单个实例(如果存在)(可选操作)。
- boolean removeAll(Collection<?> c) 删除指定集合中包含的所有此集合的元素(可选操作)。
- boolean retainAll(Collection<?> c) 仅保留此集合中包含在指定集合中的元素(可选操作)。
- int size() 返回此集合中的元素数。
- Object[] toArray() 返回一个包含此集合中所有元素的数组。
迭代器
在遍历容器的时候,如果该容器不能通过常规方法(索引)来进行遍历,那么我们就需要通过迭代器的方式进行遍历
- Iterator
它也是集合当中的一员,与List和Map不同的是,List和Map主要是用来存储数据,而Iterator它主要来遍历集合当中的元素值因此,我们把称之为Java当中的迭代器
单列集合当中的顶级父类接口Collection继承了Iterator,在Iterator接口当中定义了一个抽象方法iterator()
Collection接口也继承了iterator()方法
获取Collection集合当中的迭代器需要通过iterator()方法来得到Iterator对象 - 迭代的概念:
1.第一通过调用iterator()方法来获取迭代器对象,该迭代器对象中包含了集合当中存储的元素,迭代器内部有一个指针,用来指向元素在迭代器当中的位置,当程序获取迭代器对象的时候,指针第一指向-1的位置
2.其次调用hasNext()方法是用来判断该迭代器是否还有下一个元素,如果有下一个元素,就返回true,此时指针的位置并不发生移动
3.如果有下一个元素,程序最后调用next()方法,就会把下一个元素进行返回,这样我们就拿到集合当中的第一个元素,接下来再次调用hasNext()方法,如果还有下一个元素,那么再次调用next()方法把下一个元素进行返回,以此类推,hasNext()方法返回false就代表迭代器迭代到容器末尾位置,程序结束 - 增强for循环jdk1.5后来出现的,对迭代器遍历进行优化,可以使用for each语法来进行对容器(数组和集合)进行遍历
语法结构:
for(容器元素的数据类型 元素名称:容器对象【collection单列集合或数组】){
//....
}
泛型:
当定义或者声明的时候,如果不确定用什么数据类型的时候,可以采用未定义的类型来指定
- 泛型的作用:
1.可以在程序运行过程中规避掉一些可能发生的异常(ClassCastException),从而从运行期可能发生的异常提升到编译期(代码编写过程中)
2.省略到一些不必要的强转 - 使用泛型:
泛型类、泛型方法、泛型接口 - 定义泛型类:
语法格式:修饰符 class 类名<代表泛型的单词变量>{}
使用泛型类的时候,直接给类的上面指定一种具体的数据类型 - 备注:如果在创建泛型类对象时,不指定泛型的具体数据类型,系统会把泛型指定为Object类型。
泛型方法:
语法格式:修饰符<代表泛型的单词变量> 返回值类型 方法名(参数列表含有泛型)
- 备注:如果在方法上面的泛型和类上面的泛型没有关联性,一般传入什么样的数据那么该方法的泛型就自动匹配什么样的数据类型
- 泛型接口:
语法格式:修饰符 interface 接口名称<代表泛型的单词变量>{}
- 实现类:两种方式
1.它的实现类的泛型不指定跟着泛型接口走
2.指定实现类的泛型 - 备注:
1.如果只指定父接口当中的类型不指定实现类的类型,在使用它的实现类时候,也不指定具体的类型,程序默认识别为父接口当中的类型
如果使用其他数据类型值,程序会抛出java.lang.ClassCastException 类型转换异常
2.如果父接口和实现类都指定了一样类型,那么相当于没有指定数据类型,使用的还是未知的数据类型。 - 泛型的通配符?
当在程序当中使用泛型的时候,如果不确定使用什么样的数据类型,可以使用泛型通配符?来表明 ?—>Object - 备注:当集合当中使用泛型通配符?代表只能对集合元素检索和删除,不能进行添加和修改操作
- 泛型的上下限:
有时候我们在使用泛型的时候不能随意指定泛型的具体数据类型,
<? extends E>泛型上限 只能使用E类型或者E类型的子类型
<? super E>泛型下限 只能使用E类型或者E类型的父类型
list接口:
它是Collection接口的子接口,保留了Collection接口当中的所有API方法和特点
- 特点:
1.元素有序
2.元素可重复
3.List接口当中提供的带有索引的方法,List接口存储的元素是有索引的
List接口有两个重大的实现类:ArrayList实现类和LinkedList实现类 - List接口当中常见的API方法
- void add(int index, E element) 将指定的元素插入此列表中的指定位置(可选操作)。
- boolean addAll(int index, Collection<? extends E> c) 将指定集合中的所有元素插入到此列表中的指定位置(可选操作)。
- E get(int index) 返回此列表中指定位置的元素。
- int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
- ListIterator<E> listIterator(int index) 从列表中的指定位置开始,返回列表中的元素(按正确顺序)的列表迭代器。
- E remove(int index) 删除该列表中指定位置的元素(可选操作)。
- E set(int index, E element) 用指定的元素(可选操作)替换此列表中指定位置的元素。
- 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对象 代表降序 大—>小
如果是引用数据类型,不是数值型,可以使用对象当中某个属性或者某些属性作为大小比较的依据,如可以用Man对象当中的id属性
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
