Java——集合框架(Collection、List)

简介: Java——集合框架(Collection、List)

3 Collection


1、 接口特点


Collection 接口的特点是元素是 Object。遇到基本类型数据,需要转换为包装类对象。


2、 基本操作


Collection 接口中常用的基本操作罗列如下:


 boolean add(Object o)     这个操作表示把元素加入到集合中。add 方法的返回值为 boolean 类型。如果元素加入集合成功,则返回 true,否则返回 false。


 boolean contains(Object o)          这个方法判断集合中是否包含了 o 元素。


 boolean isEmpty()            这个方法判断集合是否为空。


 Iterator iterator()         这个方法很重要,可以用来完成集合的迭代遍历操作。具体的介绍会在介绍 List接口如何遍历时再强调


 boolean remove(Object o)            remove 方法表示从集合中删除 o 元素。返回值表示删除是否成功。


 void clear()           clear 方法清空集合。


 int size()                获得集合中元素的个数。


3、 Collection 如何遍历\Collection 的实现类


Collection 没有直接的实现类。也就是说,某些实现类实现了 Collection 接口的子接口,


例如 List、Set,这样能够间接的实现 Collection 接口。但是没有一个实现类直接实现了Collection 接口却没有实现其子接口。




4 List


4.1 List 特点和基本操作


List 接口的特点:元素是对象,并且元素有顺序,可以重复。


对于 List 而言,元素的所谓“顺序”,指的是每个元素都有下标。因此,List 的基本操作,除了从 Collection 接口中继承来的之外,还有很多跟下标相关的操作。



基本操作罗列如下:


 boolean add(Object o) / void add(int index, Object element)


在 List 接口中有两个重载的 add 方法。第一个 add 方法是从 Collection 接口中继承而来的,表示的是把 o 元素加入到 List 的


末尾;第二个 add 方法是 List 接口特有的方法,表示的是把元素 element 插入到集合中 index 下标处。


 Object get(int index) / Object set(int index, Object element)


get 方法获得 List 中下标为 index 的元素,set方法把 List 中下标为index 的元素设置为 element。利用这两个方法,可以对 List 根据相应下标进行读写。


 int indexOf(Object o)


这个方法表示在 List 中进行查找。如果 List 中存在 o 元素,则返回相应的下标。如果 List 中不存在 o 元素,则返回-1。


这个方法可以用来查找某些元素的下标。


除此之外,List 接口中还有一些诸如 size、clear、isEmpty 等方法,这些方法与介绍Collection 接口中的相应方法含义相同,在此不再赘述。



4.2 遍历


首先,为了能使用 List 接口,必须先简单介绍一个 List 接口的实现类:ArrayList。这个类使用数组作为底层数据结构,实现了 List 接口,我们使用这个类来演示应该如何对 List进行遍历。

public class TestArrayList {
     public static void main(String args[]){
         List list = new ArrayList();
         list.add("hello");
         list.add("world");
         list.add("java");
         list.add("study");
         for(int i = 0; i<list.size(); i++){
                 System.out.println(list.get(i));
         }
    }
}

4.2.1 迭代遍历


迭代遍历是 Java 集合中的一个比较有特色的遍历方式。这种方法被用来遍历 Collection接口,也就是说,既可以用来遍历 List,也可以用来遍历 Set。



使用迭代遍历时,需要调用集合的 iterator 方法。这个方法在 Collection 接口中定义,也就是说,List 接口也具有 iterator 方法。


这个方法的返回值类型是一个 Iterator 类型的对象。Iterator 是一个接口类型,接口类型没有对象,由此可知,调用 iterator 方法,返回的一定是 Iterator 接口的某个实现类的对象。这是非常典型的把多态、接口用在方法的返回值上面。Iterator 接口表示的是“迭代器”类型。利用迭代器,我们可以对集合进行遍历,这种遍历方式即称之为迭代遍历。

public class TestArrayList {
     public static void main(String args[]){
         List list = new ArrayList();
         list.add("hello");
         list.add("world");
         list.add("java");
         list.add("study");
         Iterator iter = list.iterator();
     }
}


image.png


在调用 list 的 iterator 方法之后,返回一个 Iterator 类型的对象。这个对象就好像一个指针,指向第一个元素之前。如下图:


image.png



在迭代器中定义了两个方法:



boolean hasNext()



这个方法返回一个 boolean 类型,表示判断迭代器右方还有没有元素。对于上面这种情况,对迭代器调用 hasNext()方法,返回值为 true。



Object next()


这个方法,会把迭代器向右移动一格。同时,这个方法返回一个对象,这个对象就是迭代器向右移动时,跳过的那个对象。如下图:


image.png



调用一次 next 方法之后,迭代器向右移动一位。在向右移动的同时,跳过了“hello”这个元素,于是这个元素就作为返回值返回。


我们可以再持续的调用 next()方法,依次返回“world”,“java”,“study”对象,直至hasNext()方法返回 false,意味着迭代器已经指向了集合的末尾,遍历过程即结束。



利用 Iterator 接口以及 List 中的 iterator 方法,可以对整个 List 进行遍历。

public class TestArrayList {
     public static void main(String args[]){
         List list = new ArrayList();
         list.add("hello");
         list.add("world");
         list.add("java");
         list.add("study");
         Iterator iter = list.iterator();
         while(iter.hasNext()){
             Object value = iter.next();
             System.out.println(value);
         }
     }
}


迭代遍历往往是用 while 循环来实现的。利用 hasNext 方法返回值作为循环条件,判断List 后面是否还有其他元素。在循环体中,调用 next 方法,一方面把迭代器向后移动,另外一方面一一返回 List 中元素的值。



4.3 实现类


List 接口有以下几个实现类。要注意的是,这几个类都实现了 List 接口,也就是说,如果我们针对 List 接口编程的话,使用不同的实现类,编程的方式是一样的。例如,ArrayList和 LinkedList 都实现了 List 接口,如果我们要把上一小节的程序里的实现由 ArrayList 替换成 LinkedList,只需要把这一句代码:



List list = new ArrayList();


改为


List list = new LinkedList();



其余代码由于都是针对 List 接口的,因此完全不需要修改。也就是说,不管实现类是什么样子,对 List 接口的操作是一样的。这也从一个侧面反映了接口的作用:解耦合。



4.3.1 ArrayList 和 LinkedList


1,ArrayList 的特点是采用数组实现。


用数组这样一种结构来实现 List 接口,具有以下特点:


用数组实现 List 接口,如果要查询 List 中给定下标的元素,只需要使用数组下标就可以直接查到,实现起来非常方便,而且由于数组中,元素的存储空间是连续的,因此通过下标很容易快速对元素进行定位,因此查询效率也很高。


2,LinkedList 实现 List 接口时,采用的是链表的实现方式。


最基本的链表结构是这样的:链表由多个节点组成。每个节点分为两个部分:第一个部分用来储存链表的数据,另一个部分用来储存下一个节点的地址。

List list = new LinkedList();
list.add("hello");
list.add("world");
list.add("java");
list.add("study");

image.png


在查询方面,相对于数组直接使用下标,链表实现的 LinkedList,在查询方面效率较低。


相对使用数组实现 List,使用链表实现 List 中的插入和删除功能,由于没有数组扩容以及移动数据等问题,因此效率要远远高于使用数组实现。


image.png


4.3.2 Vector


Vector 同样实现了 List 接口,而且也是使用数组实现。


image.png


这两个类实现的方式都采用数组实现,所不同的是,Vector 为了保证线程安全,采用了重量级的实现方式。在 Vector 中,所有的方法都被设计为了同步方法。这样,当多线程共同访问同一个 Vector 对象时,不会产生同步问题,但却牺牲了访问的效率。而 ArrayList 中所有方法并没有被作成同步方法,因此访问效率较快。当然,当多线程同时访问同一个 ArrayList 对象时,可能会造成线程的同步问题。


相关文章
|
10天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
27 3
|
10天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
20 2
|
6天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
34 5
|
5天前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
14 3
|
5天前
|
Java 程序员
Java|List.subList 踩坑小记
不应该仅凭印象和猜测,就开始使用一个方法,至少花一分钟认真读完它的官方注释文档。
9 1
|
8天前
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
27 3
|
10天前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
22 2
|
6月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
存储 缓存 安全
Java集合框架(Map篇)
在这个示例代码中,首先定义了一个数组和一个集合,并使用Arrays.asList()方法将数组转换成集合。接着对数组和集合分别进行排序,使用binarySearch()方法查找元素位置,使用copyOf()和copy()方法复制数组和集合,最后输出结果。可以看到,Arrays和Collections提供的方法可以方便地对数组和集合进行操作,节省开发者的时间和精力。
|
6月前
|
Java 程序员
Java集合框架:List、Set、Map类型及泛型详解
Java集合框架:List、Set、Map类型及泛型详解