Java集合框架

Java提供了一个可以存数一组数据的数据结构,其提供了丰富的方法,在实际开发中往往比数组使用的更广泛。这种数据机构成为集合:Collection.

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 国际许可协议进行许可。

相关推荐