List和Set
Collection派生出了2个子接口,一个是List另一个是Set. **List:**称为可重复集,该集合中允许存放重复的元素(重复元素是指并非是同一个元素,而是指equals方法比较为true的元素)。 **Set:**称为不可重复集,所以,该集合中是不能讲相同的元素存入几个两次,。同List,这里相同指的也是2个元素的equals比较结果为true
集合持有对象的引用
集合中存储的都是引用类型的元素,那么引用类型变量实际上存储的是对象的地址,所以实际上集合只存储了元素对象在堆中的地址。而不是将对象本身存入了集合。
contain方法
boolean contains(Object o)该方法会用于判断给定的元素是否被包含在集合中。若包含则返回true,否则返回false。这里需要注意的是,集合在判断释放被包含在集合中是使用元素的equals的比较结果。equals的比较结果。 列如:
Collection<Cell> cells = new ArrayList<Cell>();
add方法
Colleciton定义了一个add方法用于向集合中添加新元素。该方法定义为: boolean add(E e) 该方法会将给定的元素添加进集合,若添加成功则返回true,否则返回false
size,clear,isEmpty方法
size方法用于获取当前集合中的元素总数。该方法定义为:int size() clear方法用于清空集合。该方法定义为:void clear() isEmpty方法用于判断当前集合中是否不 包含元素。该方法定义为:boolean isEmpty() 例如:
Collection<String> c = new HashSet<String>();
addAll与contains方法
集合也提供了批处理操作: addAll方法用于将给定集合中的所有元素添加到当前集合中,其方法定义为:
boolean addAll(Collection c)
例如:
Collection<String> c1 = new ArrayList<String>();
containsAll方法用于判断当前集合是否包含给定集合中的所有元素,若包含则返回true。其方法定义为:
boolean containsAll(Collection c)
例如:
Collection<String> c1 = new ArrayList<String>();
Iterator迭代器
Collection提供了一个遍历集合的通用方式,迭代器(Iterator)。 获取迭代器的方式是使用Collection定义的方法:
Iterator iterator()
迭代器Iterator是一个接口,集合在覆盖Collection的iterator()方法时提供了迭代器的实现。 Iterator提供了统一的遍历集合元素的方式。
hasNext与next方法
迭代器用于遍历集合的两个主要方法:
* boolean hasNext():判断集合是否还有元素可以遍历。* E next():返回迭代的下一个元素
遍历集合应遵循“先问后取”的方式,也就是说,应当在确定hasNext()方法的返回值为true的情况下再通过next()方法取元素。 由此可以看出,使用迭代器遍历集合是通过boolean值驱动的,所以它更适合使用while循环来遍历。 例如:
Collection<String> c = new HashSet<String>();
remove方法
迭代器还提供了一个方法:void remove()。该方法用于删除迭代器当次从集合中获取的元素。若我们在迭代过程中想删除集合元素时,我们就需要通过该方法来进行。这里需要注意,在使用迭代器遍历集合时是不能通过集合自身提供的remove方法删除元素的,否则迭代器在迭代时会抛出异常。 例如:
Collection<String> c = new HashSet<String>();
增加for循环
Java5.0之后推出了一个新的特性,增强for循环,也称为新循环。该循环不通用于传统循环的工作,其只用于便利集合或数组。 语法:
for(元素类型 e : 集合或数组){
新循环并非新的语法,而是在编译过程中,编译器会将新循环转换为迭代器模式。所以新循环本质上是迭代器。 例如:
Collection<String> c = new HashSet<String>();
泛型机制
泛型是Java SE 5.0引入的特性,泛型的本质是参数化类型。在类、接口和方法的定义过程中,所操作的数据类型被传入的参数指定。 Java泛型机制广泛的应用在集合框架中。所有的集合类型都带有泛型参数,这样在创建集合时可以指定放入集合中的对象类型。Java编译器可以据此进行类型检查,这样可以减少代码在运行时出现错误的可能性。 我们来举个例子,比如ArrayList,其在定义时是这样的:
public class ArrayList<E> {
由此我们可以看出,再声明ArrayList时,类名的右侧有一个<E>。"<>"表示泛型,而其中可以使用数字字母下划线(数字不能的第一个字符)来表示泛型的名字。(通常我们使用一个大写字母来表示,当然这个不是规定。)这时,在类中声明的方法的参数,返回值类型可以被定义为泛型。这样在创建对象时可以将类型作为参数传递,此时,类定义所有的E将被替换成传入的参数。 例如:
ArrayList<String> list = new ArrayList<String>();//泛型E在这里被指定为String类型
集合操作-线性表
List
List接口是Collection的子接口,用于定义线性表数据结构;可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少。并且List是可重复集,这个我们在以前的章节已经描述。
ArrayList和LinkedList
List接口的两个常见实现类为ArrayList和LinkedList,分别用动态数组和链表的方式实现了List接口。 可以认为ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别,ArrayList更适合于随机访问而LinkedList更适合于插入和删除;在性能要求不是特别苛刻的情形下可以忽略这个差别。
get和set方法
List除了继承Collection定义的方法外,还根据其线性表的数据结构定义了一系列方法,其中最常用的就是基于下标的get和set方法。
* E get(int index):获取集合中指定下标对应的元素,下标从0开始。
例如:
List<String> list = new ArrayList<String>();
插入和删除
List根据下标的操作还支持插入与删除操作:
void add(int index,E element):
将给定的元素插入到指定位置,原位置及后续元素都顺序向后移动。
E remove(int index):
删除给定位置的元素,并将被删除的元素返回。 例如:
List<String> list = new ArrayList<String>();
subList方法
List的subList方法用于获取子List。 需要注意的是,subList获取的List与原List占有相同的存储空间,对子List的操作会影响的原List。
List<E> subList(int fromIndex, int toIndex);
fromIndex和toIndex是截取子List的首尾下标(前包括,后不包括) 。 例如:
List<Integer> list = new ArrayList<Integer>();
List转换为数组
List的toArray方法用于将集合转换为数组。但实际上该方法是在Collection中定义的,所以所有的集合都具备这个功能。 其有两个方法:
Object[] toArray()
其中第二个方法是比较常用的,我们可以传入一个指定类型的数组,该数组的元素类型应与集合的元素类型一致。返回值则是转换后的数组,该数组会保存集合中所有的元素。 例如:
List<String> list = new ArrayList<String>();
数组转换为List
Arrays类中提供了一个静态方法asList,使用该方法我们可以将一个数组转换为对应的List集合。 其方法定义为:
static <T>List<T> asList<T… a>
返回的List的集合元素类型由传入的数组的元素类型决定。 需要注意的是,返回的集合我们不能对其增删元素,否则会抛出异常。并且对集合的元素进行的修改会影响数组对应的元素。 例如:
String[] strArr = { "a", "b", "c" };
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。