这里写目录标题
集合
- 集合与数组一样,用来保存一组元素,但是集合有多种不同的数据结构有各自的特点。
- Collection下面有不同种类的集合,常见的两大类
— java.util.List:线程表,是可重复的集合,并有序
— java.util.Set:不可重复性的集合
这里指定的重复是集合是否可以保存重复元素,而重复元素的
判定标准是元素equals比较是否为true - boolean add(E e)
该方法将给定的元素添加进集合,若添加成功则返回true,否则返回false - boolean addAll(Collection<?extends E> c)
将一个集合中的所有元素添加到当前集合中 - boolean contains(Object o)
判断给定的元素是否是被包含在集合中,若包含则返回true,否则返回false - boolean containsAll(Collection<?> c)
判断当前集合是否包含给定元素集合中的所有元素 - int size()
返回当前集合中元素的总数 - void clear()
清空集合 - boolean isEmpty()
判断当前集合是否不包含任何元素
Interator迭代器
- hasNext next方法
案例
remove方法
- 在使用迭代器遍历时,不能通过集合的remove方法删除集合元素,否则会抛出并发异常,我们可以通过迭代器自身提供的remove()方法来删除通过next()迭代出的元素
- 迭代器的删除方法是在原集合中删除元素
- 这里需要注意的是,在调用remove
- 方法前必须通过迭代器的next()方法迭代元素,那么删除的就是这个元素,并且不能再次调用remove方法,除非再次调用next()会后方可再次调用
案例
增强for循环
- java5.0之后推出了一个新的特性,增强for循环,也称为新循环.该循环不同于传统循环工作,其只用于遍历集合或数组
- 语法
for(元素 e:集合或数组){
循环体
}
案例
泛型机制
- 泛型是java SE 5.0引入的特性,泛型的本质是参数化类型,在类.接口和方法的定义过程中,所操作的数据类型被传入的参数指定
- 泛型机制广泛的应用在集合框架中,左右的集合类型都带有泛型,这样在创建集合时可以指定放入集合元素的类型,java编译器可以据此进行类型检查,这样可以减少代码在运行时出现错误的可能性
案例
集合操作线性表
List
ArrayList和LinkedList
- List接口是Collection的子接口,用于定义线性表数据结构,可以将Listt来理解为存放对象的数组,只不过其元素个数可以动态(无序)的增加或减少
- List接口的两个常见实现类为ArrayList和LinkedList,分别用动态数组和链表(有序)的方式实现了List接口
- 可以认为 ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别.ArrayList更适合于随机访问而LinkedList更适合于插入删除,在性能要求不是特别苛刻的情形下可以忽略这个差别
案例
get和set
- List除了继承Collection定义的方法外,还根局其线程表的数据构造定义了一系列方法,其中最常用的就是基于下标get和set方法
– E get(int index)
获取集合中指定下标对应的元素,下标从0开始
– E set(int index,E elment)
将给定的元素存入给定位置,并将原位置的元素返回
案例
插入和删除
- List根局下标的操作还支持插入与删除操作
– void add(int index,E element);
将给定的元素插入到指定位置,原位置及后续元素都顺序向后移动
– E remove(int index);
删除给定位置的元素,并将被删除的元素返回
案例
List转换为数组
- List的toArray方法用于将集合转换为数组,但实际上该方法是在Collection中定义的,所以所有的集合都具备这个功能
- 其中有两个方法
– Object[ ] toArray()
– T[ ] toArray(T[ ] a)
其中第二个方法是比较常用的,我们可以传入一个指定类型的数组,该数组的元素类型应与集合的元素类型一致,返回值则是转换后的数组,该数组会保存集合中所有的元素
案例
数组转换为List
- Arrays类提供了一个静态方法asList,使用该方法我们可以将一个数组转换为对应的List集合
- 其方法定义为:
– static List asList<T…a> - 返回的List的集合元素类型由传入的数组的元素类型决定.
- 并且要注意的是,返回的集合我们不能对其增删元素,否则会抛出异常,并且对集合的元素进行修改会影响数组对应的元素
案例
List排序
Colletions.sort方法实现排序
- Collection是集合的工具类,他提供了很多便于我们操作集合的方法,其中就有用于集合排序的sort方法
- 该方法定义为:
– void sort(Listt list)
该方法的作用是对给定的集合元素进行自然排序
案例
Comparable
- Collections的sort方法是对集合元素进行自然排序,那么两个元素对象之间就一定要有大小之分。这个大小之分是如何界定的?实际上,在使用Collections的sort排序的集合元素都必须是Comparable接口的实现类,该接口表示其子类是可比较的,因为实现该接口口必须重写抽象方法:
– int compareTo(T t)
该方法用于是当前对象与给定对象进行比较
– 若当前对象大于给定对象,那么返回值为>0的整数
– 若当前对象小于给定对象,那么返回值为<0的整数
– 若两个对象相等,则应返回0;
案例
Comparator
- 一旦Java类实现了Comparable接口, 其比较逻辑就已经确定;如果希望在排序的操作中临时指定比较规则,可以采用Comparator接口回调的方式。
- Comparator接口要求实现类必须重写其定义的方法:
– int compare(T o1,T o2) - 该方法的返回值要求:
– 若o1> o2则返回值应>0
– 若o1 < o2则返回值应<0
– 若o1= = o2则返回值应为0
案例
队列和栈
Queue
- 队列( Queue )是常用的数据结构,可以将队列看成特殊的线性表,队列限制了对线性表的访问方式:只能从线性表的一端添加(offer)元素,从另-端取出(poll)元素。
- 队列遵循先进先出( FIFO First Input First Output )的原则。
- JDK中提供了Queue接口,同时使得LinkedList实现了该接口(选择LinkedList实现Queue的原因在于Queue经常要进行添加和删除的操作,而LinkedList在这方面效率较高)。
- boolean offer(E e);
将一个对象添加至队尾,如果返回true则添加成功 - E poll();
从队首删除并返回一个元素 - E peek();
返回队首的元素(但并不删除)
案例
Deque
- Deque是Queue的子接口,定义了所谓"双端队列”即从队列的两端分别可以入队( offer )和出队( poll ) ,LinkedList实现了该接口。
- 如果将Deque限制为只能从一端入队和出队,则可实现"栈”(Stack)的数据结构,对于栈而言,入栈称之为push,出栈称之为pop.
- 栈遵循先进后出( FILO First Input Last Output )的原则。