首页 > 代码库 > Java 集合

Java 集合

技术分享
在Java Collections Framework中,不同类型的集合使用不同类型的数据结构以不同的方式存储它们的元素。

集合框架提供了遍历集合的以下方法:
使用迭代器
使用for-each循环
使用forEach()方法

使用迭代器

迭代器可以对集合执行以下三个操作:
检查是否有尚未访问的元素。      hasNext()
检查是否有下一个访问的元素。   next()
删除集合的最后访问元素。         remove()

例子1
使用迭代器打印列表的所有元素:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    // Create a list of strings
    List<String> names = new ArrayList<>();
    names.add("A");
    names.add("B");
    names.add("C");
    Iterator<String> nameIterator = names.iterator();
    while (nameIterator.hasNext()) {
      String name = nameIterator.next();
      System.out.println(name);
    }

  }
}

结果:
A
B
C

例2
使用迭代器遍历列表的所有元素,并使用remove()方法删除该元素:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    // Create a list of strings
    List<String> names = new ArrayList<>();
    names.add("A");
    names.add("B");
    names.add("C");

    Iterator<String> nameIterator = names.iterator();
    while (nameIterator.hasNext()) {
      String name = nameIterator.next();
      System.out.println(name);
      nameIterator.remove();
    }
    System.out.println(names);
  }
}

结果:
A
B
C
[]

使用for-each循环

使用for-each循环遍历任何实现类实现Iterable接口的集合。

import java.util.ArrayList;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    List<String> names = new ArrayList<>();
    names.add("A");
    names.add("B");
    names.add("C");

    for (String name : names) {
      System.out.println(name);
    }

  }
}

结果:
A
B
C

使用forEach()方法

Iterable接口包含一个新的 forEach(Consumer action)方法,该方法遍历所有元素并应用操作。

import java.util.ArrayList;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    // Create a list of strings
    List<String> names = new ArrayList<>();
    names.add("A");
    names.add("B");
    names.add("C");

    names.forEach(System.out::println);
  }
}

结果:
A
B
C
Java 集合遍历
技术分享
Set 表示唯一对象的集合。集合中元素的排序是不相关的。

集合框架提供三种类型的集合:

数学集
排序集
导航集

数学集

Set 接口对数学中的一组进行建模。集合是唯一元素的集合。
Java最多允许一个Set中的一个空元素。 Set 中元素的排序并不重要。
Java不保证 Set 中元素的排序。
当循环遍历 Set 的所有元素时,你得到 Set 中的每个元素一次。

HashSet

import java.util.HashSet;
import java.util.Set;

public class Main {
  public static void main(String[] args) {

    Set<String> s1 = new HashSet<>();

    // Add a few elements
    s1.add("HTML");
    s1.add("CSS");
    s1.add("XML");
    s1.add("XML"); // Duplicate

    // Create another set by copying s1
    Set<String> s2 = new HashSet<>(s1);
    // Add a few more elements 
    s2.add("Java"); 
    s2.add("SQL");
    s2.add(null); // one null is fine
    s2.add(null); // Duplicate

    System.out.println("s1: " + s1);
    System.out.println("s1.size(): " + s1.size());

    System.out.println("s2: " + s2);
    System.out.println("s2.size(): " + s2.size());
  }
}

结果:
s1: [HTML, CSS, XML]
s1.size(): 3
s2: [null, SQL, HTML, CSS, XML, Java]
s2.size(): 6

LinkedHashSet

LinkedHashSet 在插入元素时保持元素顺序

import java.util.LinkedHashSet;
import java.util.Set;

public class Main {
  public static void main(String[] args) {

    Set<String> s1 = new LinkedHashSet<>();
    s1.add("A");
    s1.add("B");
    s1.add("C");
    s1.add("D");
    System.out.println("LinkedHashSet: " + s1);

  }
}

结果:
LinkedHashSet: [A, B, C, D]

集合操作

我们可以对集合执行并集,交集和差分运算。

import java.util.HashSet;
import java.util.Set;

public class Main {
  public static void main(String[] args) {
    Set<String> s1 = new HashSet<>();
    s1.add("HTML");
    s1.add("CSS");
    s1.add("XML");

    Set<String> s2 = new HashSet<>();
    s2.add("Java");
    s2.add("Javascript");
    s2.add("CSS");

    System.out.println("s1: " + s1);
    System.out.println("s2: " + s2);

    performUnion(s1, s2);
    performIntersection(s1, s2);
    performDifference(s1, s2);
 
  }

  public static void performUnion(Set<String> s1, Set<String> s2) {
    Set<String> s1Unions2 = new HashSet<>(s1);
    s1Unions2.addAll(s2);
    System.out.println("s1 union  s2: " + s1Unions2);
  }

  public static void performIntersection(Set<String> s1, Set<String> s2) {
    Set<String> s1Intersections2 = new HashSet<>(s1);
    s1Intersections2.retainAll(s2);
    System.out.println("s1 intersection  s2: " + s1Intersections2);
  }

  public static void performDifference(Set<String> s1, Set<String> s2) {
    Set<String> s1Differences2 = new HashSet<>(s1);
    s1Differences2.removeAll(s2);

    Set<String> s2Differences1 = new HashSet<>(s2);
    s2Differences1.removeAll(s1);

    System.out.println("s1 difference s2: " + s1Differences2);
    System.out.println("s2 difference s1: " + s2Differences1);
  }

}

结果:
s1: [HTML, CSS, XML]
s2: [Javascript, CSS, Java]
s1 union  s2: [Javascript, HTML, CSS, XML, Java]
s1 intersection  s2: [CSS]
s1 difference s2: [HTML, XML]
s2 difference s1: [Javascript, Java]
Java Set集合

 

Java 集合