Java集合之List集合

Java中通常用数组来存储多个值,但是数组的长度是固定的,一旦需要存储的元素大于数组长度就需要重新声明数组。因此在不确定存储元素的个数时应该使用集合。

首先给出Java中重要集合的继承体系:

这些接口和实现类是日常中经常使用的,其中List和Set继承了Collection接口,而ArrayList、LinkedList、Vector是List接口的实现类,HashSet和TreeSet是Set接口的实现类。

(一)Collection接口

Collection是一个接口,里面定义了一些集合共有的方法。

boolean add(E e) 添加元素
boolean remove(Object o) 删除元素
void clear() 清除元素
boolean contains(Object o) 包含某一个元素
boolean isEmpty() 判断集合是否为空
int size() 获取集合的大小

boolean addAll(Collection c) 把集合2添加到集合1
boolean removeAll(Collection c) 把集合2中所有元素从集合1中删除
boolean containsAll(Collection c) 判断集合2中所有的元素在集合1中是否都有
boolean retainAll(Collection c) 取两个集合的交集
Object[] toArray() 将集合转为Object数组
Iterator<E> iterator() 迭代器

遍历Collection集合:

     Collection<String> collection = new ArrayList<String>(); //由于Collection为接口,所以用ArrayList来声明
       collection.add("java");
        collection.add("php");
        collection.add("python");
        collection.add("scala");
        collection.add("swift");
        collection.add("c++");

        //第一种:利用Collection的toArray()方法转为Object[]数组
        Object[] strArr = collection.toArray();
        System.out.println(Arrays.toString(strArr));

        //第二种:利用Collection的iterator()方法来迭代遍历,通过hasNext()和next()
        Iterator<String> iterator = collection.iterator();
        while(iterator.hasNext()){
            String lang = iterator.next();
            System.out.println(lang);
        }

        //第三种:利用增强for循环
        for(String lang: collection){
            System.out.println(lang);
        }    

(二)List接口

List是Collection的子接口,除了继承的一些方法,自己还声明了一些新方法,相比于Collection接口,它提供了在指定位置上进行增删改查的操作,这是因为List是一个有序的集合,这里的有序是指元素是会按照插入的顺序排列。

void add(int index, E element) 在指定位置添加元素
E get(int index) 获取指定位置的元素
ListIterator<E> listIterator()  迭代器
E remove(int index) 从集合中移除某个位置的元素
E set(int index, E element) 修改某个位置的元素
List list = new ArrayList();
list.add("java");
list.add("php");
list.add("python");
System.out.println(list); //[java, php, python]

list.add(0,"h5");
System.out.println(list);//[h5, java, php, python]

list.remove(0);
System.out.println(list);//[java, php, python]

System.out.println(list.get(0));//java 

由于List提供了get()方法来获取到指定位置元素,故可以通过for循环来遍历:

List list = new ArrayList();
list.add("java");
list.add("python");
list.add("php");
list.add("scala");

for (int i=0;i<list.size();i++){
      System.out.println(list.get(i));
}

注意:如果利用iterator方法来遍历List,并且在遍历的时候还在向集合中插入元素,则会报ConcurrentModificationException异常。

        List<String> list = new ArrayList<String>();
        list.add("java");
        list.add("php");
        list.add("python");

        System.out.println(list);
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            String lang = iterator.next();
            if (lang.equals("php")){
                list.add("go"); //ConcurrentModificationException
            }
        }

        System.out.println(list);     

这个问题可以通过List接口的listIterator()方法解决。

List<String> list = new ArrayList<String>();
list.add("java");
list.add("php");
list.add("python");
ListIterator<String> it = list.listIterator();
while(it.hasNext()){    
  String lang = it.next();   
  if (lang.equals("php")){    
   it.add("go");  
  }  
}
System.out.println(list);

另外,如果想从后往前遍历,可以使用hasPrevious和previous方法。(只在ListIterator接口中有)

接下来介绍一些特殊的集合类以及方法:

(1)Vector集合(很少使用)

常用方法:

void addElement(E obj) 添加一个元素
int capacity() 当前集合的容量
E elementAt(int index) 获取指定索引的元素
Enumeration<E> elements() 

例:利用Enumeration来遍历Vector:

Enumeration enumeration = vector.elements();
while(enumeration.hasMoreElements()){
    System.out.println(enumeration.nextElement());
}

(2)LinkedList集合。

除了List接口的一些共有方法外,LinkedList也有一些特有的方法。

void addFirst(E e) 在第一个位置上添加元素
void addLast(E e) 在最后一个位置上添加元素
E getFirst() 获取第一个元素
E getLast() 获取最后一个元素
E removeFirst() 移除第一个元素
E removeLast() 移除最后一个元素
E pop() 从最后一个位置移除元素
void push(E e) 在最后一个位置添加元素

通过上面的方法可以自定义一个栈:

public class Demo01 {
    public static void main(String[] args) {
        Stack stack = new Stack();
        stack.push("a");
        stack.push("b");
        stack.push("c");
        stack.push("d");
        System.out.println(stack);
        Object e = stack.pop();
        System.out.println(e);
        System.out.println(stack);
        System.out.println(stack.length());
    }
}

class Stack {
    private LinkedList list = new LinkedList();

    public void push(Object e){ //入栈
        list.addLast(e);
    }

    public Object pop(){ //出栈
        Object e = list.getLast();
        list.removeLast();
        return e;
    }

    public int length(){
        return list.size();
    }

    @Override
    public String toString() {
        return list.toString();
    }
}

当然,也可以直接使用LinkedList定义的push和pop方法来进行入栈和出栈操作。

【注】关于ArrayList和LinkedList的比较:ArrayList的添加元素和删除元素慢(增加或者删除元素需要移动其他元素的位置),时间复杂度是O(n),但是查询和修改的速度快(根据索引),时间复杂度是O(1);而LinkedList的增加和删除较快(直接修改指针),查询和修改较慢(因为要遍历整个序列)。

原文地址:https://www.cnblogs.com/liualex1109/p/12155396.html

时间: 2024-10-10 20:44:33

Java集合之List集合的相关文章

Java笔记(15):集合框架(01)

1.对象数组的概述和使用 1 package cn.itcast_01; 2 3 public class Student { 4 // 成员变量 5 private String name; 6 private int age; 7 8 // 构造方法 9 public Student() { 10 super(); 11 } 12 13 public Student(String name, int age) { 14 super(); 15 this.name = name; 16 thi

java高级特性之集合概述

java中的集合概述 map 接口 总结 java集合学习 1 java中存储数据的方式 1 数组 (基本数据类型+引用数据类型).2 集合(对象) 数组存储数据的缺点1:数组一旦创建,长度固定 2:数组不能直接确定有效元素的个数 java中的集合概述: java集合接口:Collection 接口 和Map 接口 (Collection接口 表示不按照添加顺序存放对象的集合,而且集合内的元素可以重复即 无序可重复 集合,它是List,Set,Queue..接口的父接口) Collection

Java中泛型在集合框架中的应用

泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通过代码也可以看出来,我们放入其他类型时,如字符串,编译器不会报错,但是运行程序时会抛出类型错误异常,这样给开发带来很多不方便,用泛型就解决了这个麻烦 泛型规定了某个集合只能存放特定类型的属性,当添加类型与规定不一致时,编译器会直接报错,可以清楚的看到错误 当我们从List中取出元素时直接取出即可,不

java求两个集合的差集

public static void main(String[] args) {Set set = new HashSet();Set set1 = new HashSet();set.add("sanny");set.add("mary");set.add("bill");set.add("tom");set.add("tony");set.add("mark");set.add(&q

java中 列表,集合,数组之间的转换

List和Set都是接口,它们继承Collection(集合),集合里面任何数据类型都可以添加 List是有序的队列,可以用重复的元素:而Set是数学概念中的集合,不能有重复的元素. 数组 长度固定  可存储任何数据类型       集合 长度可变(包括:list,set)可存储任何数据类型 列表 list   有序   长度可变   元素可重复     集set  无序   长度可变   元素不可重复 将数组转化为一个列表时,程序员们经常这样做: String[] arr = {"a"

java set集合与List集合练习

题目:分别向Set集合一级List集合中添加"A","a","C","c","a",五个元素,观察重复值"a"能否在List集合一级Set集合中成功添加 package com.hanqi.jihe; import java.util.*; public class Listjihe { public static void main(String[] args) { ArrayList

java集合 之 set 集合

set集合可以存储多个对象,但并不会记住元素的存储顺序,也不允许集合中有重复元素(不同的set集合有不同的判断方法). 1.HashSet类 HashSet按照Hash算法存储集合中的元素,具有很好的存取和查找性能.当向HashSet中添加一些元素时,HashSet会根据该对象的HashCode()方法来得到该对象的HashCode值,然后根据这些HashCode的值来决定元素的位置. HashSet的特点:1.存储顺序和添加的顺序不同 2.HashSet不是同步的,如果多个线程同时访问一个Ha

java中的set集合

import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class SetTest01 { /* Set集合:HashSet 1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构. 2.哈希表又叫做散列表,哈希表底层是一个数组,这个数组中每一个元素 是一个单向链表.每个单向链表都有一个独一无二的hash值,代表数组的 下标.在某个单向链表中的每一个节点上

黑马程序员——JAVA学习笔记八(集合)

1,    JAVA最初版本只为最常用的数据结构提供了很少的一组类:Vector.Stack.Hashtable.BitSet与Enumeration接口,从JAVA1.2版本开始推出了一组功能完善的的数据结构. 集合类的由来:  对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定.  就使用集合容器进行存储. 集合特点: 1,用于存储对象的容器. 2,集合的长度是可变的. 3,集合中不可以存储基本数据类型值. 4,接口与实现相互分离. 集合框架是为表示和操作集合而规定的一种统一的标准

java复习整理之集合

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.ios培训..Net培训</a>.期待与您交流!------ java复习整理之集合: Collection:集合中的最顶层接口,提供了一些操作集合的共性方法添加:boolean add(E e)boolean addAll(Collection<? extends E> c)删除:void