JAVA COLLECTIONS
ArrayList
参考链接 🔗
继承自
List接口,允许添加多个null元素及重复元素,并保持元素插入顺序
Example:
|
|
输出:
|
|
执行arrayList.remove(0)后,位于0的新的元素是”the”,所以执行arrayList.remove(1)删除的是”fuck”。如果要按顺序删除的话,一直执行arrayList.remove(0)即可
Method
add(Object o)
在末端添加新元素o
|
|
add(int index, Object o)
在指定位置添加元素o
|
|
除此之外,还可以添加元素的集合到ArrayList中,方法是:addAll(Collection C)和addAll(int index, Collection C)。
remove(Object o)
删除元素o
|
|
remove(int index)
删除指定位置的元素
|
|
set(int index, Object o)
替换指定位置的元素
|
|
int indexOf(Object o)
返回元素o的索引,如果元素不存在则返回-1
|
|
Object get(int index)
返回特定位置上的元素
|
|
int size()
返回
ArrayList的长度,即其中的元素个数
|
|
boolean contains(Object o)
检查是否存在元素o,返回true/false
|
|
clear()
清空所有元素
|
|
Initialization
- Method 1: Initialization with Arrays.asList()
|
|
- Method 2: Anonymous inner class method to initialize ArrayList
|
|
- Method3: Normal way of ArrayList initialization
|
|
- Method 4: Use Collections.ncopies
给所有元素赋相同的值时适用。
|
|
Iteration
- For Loop
- Foreach Loop
- While Loop
- Iterator
- Enumeration
|
|
对于ArrayList来说,随机访问比较快。for循环中的get()方法,采用的是随机访问的方法;而iterator中的next()方法,采用的是顺序访问。因此,ArrayList适合用前者,而LinkedList则适合用后者。
Conversions
ArrayList➣String Array
|
|
Array➣ArrayList
当然,最基础的就是直接添加:
|
|
但是还可以更简单一点 ☞
|
|
Or ☞
|
|
LinkedList➣ArrayList
|
|
Sort
- Collections.sort()
按照字母先后顺序或者数字从小到大的顺序排列
|
|
输出
|
|
那么问题来了 ☞ 如何按照递减的顺序排列呢?
- Collections.sort(arrayList, Collections.reverseOrder());
这样就是按照递减的方式排列了,或者也可以用以下方式代替 ☞
|
|
当然,以上两种适用于简单的数据的排序,当ArrayList的存放的数据类型变得更为复杂时呢?
Emmm……比如说这样 ☞
|
|
我们已经定义了一种新的数据类型Book,现在用ArrayList来存放数据 ☞
|
|
现在再用之前的方法肯定是行不通了,试试借助其他办法 ☞
- Comparable
通过重写Comparable接口的compareTo()方法,来比较排序。
|
|
|
|
输出
|
|
- Comparator
或者我们可以重写Comparator接口中的compare()方法来排序。
|
|
|
|
输出
|
|
Remove Duplicate Elements
HashSet
|
|
输出:
[The, not, road, taken]
删除重复元素之后,元素插入顺序会被打乱。
LinkedHashSet
LinkedHashSet不允许重复元素,并且会保持元素的顺序。
|
|
输出:
[The, road, not, taken]
Comparable & Comparator
在之前的ArrayList的排序中就已经用到了这两个接口来进行比较排序,这里主要写两者的区别。
| Comparable | Comparator | |
|---|---|---|
| Package | java.lang.Comparable | java.util.Comparator |
| Implementation | Class whose objects to be sorted must implement this interface | Class whose objects to be sorted do not need to implement this interface |
| Sorting Method | int compareTo(Object o1) This method compares this object with o1 object and returns a integer. Its value: positive ➣ this object > o1; zero ➣ this object = o1; negative ➣ this object < o1 |
int cpmpare(Object o1, Object o2) This method compares o1 with o2 and returns a integer. Its value: positive ➣ o1 > o2; zero ➣ o1 = o2; negative ➣ o1 < o2 |
| Calling Method | Collections.sort(List) |
Collections.sort(List, Comparator) |
| Sorting Logic | Sorting logic must be in same class whose objects are being sorted | Sorting logic is in seperate class |
Java 迭代器
迭代器是一个轻量级对象,可以遍历并选择序列中的对象。
将遍历序列的操作与底层序列的结构分离,统一了对容器的访问方式。
迭代器
Iterator
只能单向移动,在遍历的时候不允许在底层集合进行增删元素的操作(通过迭代器本身操作除外)。
boolean hasNext()
判断是否有更多元素
E next()
返回下一个元素
如果没有下一个元素,则抛出NoSuchElementException异常。
void remove()
删除迭代器返回的底层集合的最后一个元素,只能在每次调用
next()方法后使用一次
如果调用的不是迭代器中删除元素的方法,而是通过底层集合自带的删除元素的方法,会抛出UnsupportedOperationException异常。
如果在调用之前没有返回元素,会抛出IllegalStateException异常。
ListIterator
Iterator的子类,只能访问各种List类,但是功能更加强大,可以双向移动。
void add(E e)boolean hasNext()boolean hasPrevious()E next()int nextIndex()E previous()int previousIndex()void remove()void set(E e)
Iterator 和 Enumeration 的区别
Iterator允许在遍历的时候删除底层集合的元素
除此之外,就是方法命名更加规范,用hasNext()替代了hasMoreElements(),用next()替代了nextElement()。
迭代器接口
迭代器有Iterator和Iterable两个接口。
|
|
|
|
Iterable是Iterator接口的包装,超级接口,实现上更简洁,并且可以允许实现此接口的对象成为foreach语句的目标。除此之外,Iterable每次调用时返回一个从头开始的迭代器,多个迭代器之间互不干扰,不会出现当前迭代位置混乱的不可预知错误。
|
|
Static Import
import static com…ClassName.*(/静态方法名);
替换import com...ClassName,在使用的时候可以直接用方法名调用静态方法,而不用通过ClassName.方法名的方式。
Without Static Imports ☞
|
|
Using Static Imports ☞
|
|
Polymorphism
Explain polymorphism in one sentence ➣
Subclasses of a class can define their own unique behaviors and yet share some of the same functionality of the parents.
未完待续。。。