在Java里,
Obejct a; //只是一个引用,并没有创建对象,此时a指向null
Objetc a = new Object(); //将a引用指向new Object()这个对象,即将右边的对象的地址传给了左边的引用
而在编程过程中,需要在任意时刻和任意位置创建任意数量的对象,所以不能依靠创建命名的引用来持有每一个对象。
于是,我们需要用某种方式来保存多个对象。
Java提供了许多容器类来解决这个问题。
基本类型:
- List (collection)
- Set(collection)
- Queue(collection)
- Map
他们都可以自动调整尺寸(原理?)
前三者都继承自Collections接口,表示独立元素的序列。Map仅仅是继承了Object,表示成对的键值对对象。
Java.util 里的Array,Collections类里的用于在Collection里添加一组元素:
Arrays.asList() 接收一个数组或者是用逗号分隔的元素列表, 将其转化为List对象。e.g:
import java.util.*;
public class AddingGroups {
public static void main(String args[]) {
List<String> str = Arrays.asList("h", "e","l","l", "o");
for(String i: str)
System.out.print(i);
System.out.print('\n');
}
}
//Result
hello
Collections.addAll() 接收一个Collection对象以及一个数组或者一个用逗号分割的列表,将其添加到Collection中。
List
ArrayList 相当于数组
LinkedList 相当于链表
List 允许在被创建后添加元素,移除元素或者自我调整尺寸。
contains(): 一个对象是否在列表里
remove(引用): 移除一个对象
indexOf(引用): 该对象在List中所处的位置的索引编号
equals()
subList(): 从较大的列表里创建出一个片断
retainAll(): 交集
toArray(): 会将任意Collection转化为一个数组。无参数: Object数组 参数:指定类型
迭代器
为了能不关心容器类型,应用于不同容器,使用迭代器。
Iterator只能单向移动:
- 使用方法iterator要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
- 使用next()获得列表中下一个元素。
- 使用hasNext()检查序列中是否还有元素。
- 使用remove()将迭代器新返回的元素删除。
- 如果不打算修改List本身,用forEach
- Iterator还可以移除由next()产生的最后一个元素,意味着在调用remove()之前必须先调用next()。
ListIterator 只用于List类,能双向移动。(相当于是个双向链表?)
List<Pet> pets = Pets.arrayList(8);
ListIterator<Pet> it = pets.listIterator();
while(it.hasNext())
System.out.print(it.next() + ", " + it.nextIndex() + ", " + it.previousIndex() + "; ");
Stack可以由LinkedList实现。
Foreach & Iterator
foreach 主要用于数组,但也可以用于任何Collection对象。
Java SE5 引入了一个Iterable的接口,里面包含一个能产生Iterator的iterator()方法,并且Iterable接口被foreach用来在序列中移动。
public class CustomIterable implements Iterables<String> {
public Iterator<String> iterator(){
return new Iterator<String> () {
blablabla//实现hasNext next remove
}
};
}
public static void main(String[] args) {
for(String s: new CustomIterable()){
//do something
}
}
foreach 语句可以用于数组或其他任何Iterable,但这并不意味着数组一定是一个Iterable。
例如,Arrays.asList(1,2,3); 可以for(T t: array) 但不是一个Iterable
不存在任何从数组到Iterable自动转换,必须手动转换。