> 文章列表 > 【java】集合类

【java】集合类

【java】集合类

文章目录

    • 集合根接口
    • LIST列表
    • 迭代器
    • Queue|Deque|PriorityQueue
    • Set集合
      • HashSet
      • LinkedHashSet
      • TreeSet
    • 键盘读入
    • Map
      • HashMap
      • LinkedHashMap
    • Stream流
      • stream()
      • ints()
    • Collections工具类

集合根接口

所有的集合类最终都是实现自集合根接口的,比如ArrayList类,它的祖先就是Collection接口

【java】集合类

LIST列表

import java.util.ArrayList;   //集合类基本都是在java.util包下定义的
public class Main {public static void main(String[] args) {//List<String> list = new ArrayList<>();ArrayList<String> list = new ArrayList<>();list.add("中文");list.add(0,"coleak");list.add("9");list.add("cc");list.add("ay");list.sort(String::compareTo);System.out.println(list);System.out.println(list.contains("coleak"));System.out.println(list.get(2));System.out.println(list.remove("colea"));System.out.println(list.remove("coleak"));System.out.println(list.remove(1));System.out.println(list);System.out.println(list.indexOf("中文"));}
}

[9, ay, cc, coleak, 中文]
true
cc
false
true
ay
[9, cc, 中文]
2

import java.util.ArrayList;
import java.util.Arrays;
public class Main {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>(Arrays.asList("aaa","bb","c"));list.add("aaa");list.add("aab");list.add("aaaa");list.removeIf(s ->s.length()!=3);System.out.println(list);}
}

[aaa, aaa, aab]

迭代器

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Main {public static void main(String[] args) {List<String> list = Arrays.asList("A", "B", "C");Iterator<String> var = list.iterator();while(var.hasNext()) {String s = (String)var.next();System.out.println(s);}}}

迭代器的使用是一次性的,用了之后就不能用了,如果需要再次进行遍历操作,那么需要重新生成一个迭代器对象

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Main {public static void main(String[] args) {List<String> list = Arrays.asList("A", "B", "C");list.forEach(System.out::println);}}
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Main {public static void main(String[] args) {Test test=new Test();test.forEach(System.out::println);}public static class Test implements Iterable<String>{   //这里我们随便写一个类,让其实现Iterable接口@Overridepublic Iterator<String> iterator() {return new Iterator<String>() {   //生成一个匿名的Iterator对象@Overridepublic boolean hasNext() {   //这里随便写的,直接返回true,这将会导致无限循环return true;}@Overridepublic String next() {   //每次就直接返回一个字符串吧return "coleak";}};}}}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;public class Main {public static void main(String[] args) {List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));ListIterator<String> iterator = list.listIterator();iterator.next();   //此时得到Aiterator.set("X");  //将A原本位置的上的元素设定为成新的System.out.println(list);iterator.remove();iterator.forEachRemaining(System.out::println);}}

[X, B, C]
B
C

Queue|Deque|PriorityQueue

public interface Queue<E> extends Collection<E> {//队列的添加操作,是在队尾进行插入(只不过List也是一样的,默认都是尾插)//如果插入失败,会直接抛出异常boolean add(E e);//同样是添加操作,但是插入失败不会抛出异常boolean offer(E e);//移除队首元素,但是如果队列已经为空,那么会抛出异常E remove();//同样是移除队首元素,但是如果队列为空,会返回nullE poll();//仅获取队首元素,不进行出队操作,但是如果队列已经为空,那么会抛出异常E element();//同样是仅获取队首元素,但是如果队列为空,会返回nullE peek();
}import java.util.LinkedList;
import java.util.Queue;public class Main {public static void main(String[] args) {Queue<String> queue = new LinkedList<>();   //当做队列使用,还是很方便的queue.offer("AAA");queue.offer("BBB");System.out.println(queue.poll());System.out.println(queue.poll());}}

【java】集合类

可以直接将一个LinkedList当做一个队列来使用

//在双端队列中,所有的操作都有分别对应队首和队尾的
public interface Deque<E> extends Queue<E> {//在队首进行插入操作void addFirst(E e);//在队尾进行插入操作void addLast(E e);//不用多说了吧?boolean offerFirst(E e);boolean offerLast(E e);//在队首进行移除操作E removeFirst();//在队尾进行移除操作E removeLast();//不用多说了吧?E pollFirst();E pollLast();//获取队首元素E getFirst();//获取队尾元素E getLast();//不用多说了吧?E peekFirst();E peekLast();//从队列中删除第一个出现的指定元素boolean removeFirstOccurrence(Object o);//从队列中删除最后一个出现的指定元素boolean removeLastOccurrence(Object o);// * 队列中继承下来的方法操作是一样的,这里就不列出了 *...// * 栈相关操作已经帮助我们定义好了 *//将元素推向栈顶void push(E e);//将元素从栈顶出栈E pop();// * 集合类中继承的方法这里也不多种介绍了 *...//生成反向迭代器,这个迭代器也是单向的,但是是next方法是从后往前进行遍历的Iterator<E> descendingIterator();}import java.util.Deque;
import java.util.LinkedList;
public class Main {public static void main(String[] args) {Deque<String> deque = new LinkedList<>();deque.push("AAA");deque.push("BBB");System.out.println(deque.pop());System.out.println(deque.pop());}}
import java.util.PriorityQueue;
import java.util.Queue;
public class Main {public static void main(String[] args) {Queue<Integer> queue = new PriorityQueue<>();queue.offer(10);queue.offer(4);queue.offer(5);System.out.println(queue.poll());System.out.println(queue.poll());System.out.println(queue.poll());}}import java.util.PriorityQueue;
import java.util.Queue;
public class Main {public static void main(String[] args) {Queue<Integer> queue = new PriorityQueue<>((a,b)->b-a);queue.offer(10);queue.offer(4);queue.offer(5);System.out.println(queue.poll());System.out.println(queue.poll());System.out.println(queue.poll());}}

4
5
10

10
5
4

Set集合

  • 不允许出现重复元素
  • 不支持随机访问(不允许通过下标访问)

HashSet

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class Main {public static void main(String[] args) {Set<String> set = new HashSet<>();System.out.println(set.add("AAA"));   //这里我们连续插入两个同样的字符串System.out.println(set.add("AAA"));System.out.println(set);   //可以看到,最后实际上只有一个成功插入了System.out.println(set.remove("AAA"));System.out.println(set);set.addAll(Arrays.asList("A", "0", "-", "+"));System.out.println(set);}}

true
false
[AAA]
true
[]
[0, A, +, -]

LinkedHashSet

维持插入集合的顺序需要使用LinkedHashSet

public static void main(String[] args) {Set<String> set = new LinkedHashSet<>();set.addAll(Arrays.asList("A", "0", "-", "+"));System.out.println(set);
}

[A, 0, -, +]

TreeSet

它会在元素插入时进行排序

import java.util.TreeSet;
public class Main {public static void main(String[] args) {TreeSet<Integer> set = new TreeSet<>((a,b)->b-a);set.add(1);set.add(3);set.add(2);System.out.println(set);}}

[3, 2, 1]

键盘读入

import java.util.Scanner;
public class test {public static void main(String[] args){//演示接受用户的输入//步骤//Scanner类 表示 简单文本扫描器,在java.util 包//1. 引入/导入 Scanner类所在的包//2. 创建 Scanner 对象 , new 创建一个对象,体会//   myScanner 就是 Scanner类的对象Scanner myScanner = new Scanner(System.in);//3. 接收用户输入了, 使用 相关的方法System.out.println("请输入名字");//当程序执行到 next 方法时,会等待用户输入~~~String name = myScanner.next(); //接收用户输入字符串System.out.println("请输入年龄");int age = myScanner.nextInt(); //接收用户输入intSystem.out.println("请输入薪水");double sal = myScanner.nextDouble(); //接收用户输入doubleSystem.out.println("人的信息如下:");System.out.println("名字=" + name + " 年龄=" + age + " 薪水=" + sal);}
}

Map

HashMap

import java.util.HashMap;
import java.util.Map;
public class Main {public static void main(String[] args) {Map<Integer, String> map = new HashMap<>();map.put(1, "小明");   //使用put方法添加键值对,返回值我们会在后面讨论map.put(2, "小红");map.put(4, "coleak");System.out.println(map.get(2)); //使用get方法根据键获取对应的值map.remove(2);System.out.println(map);System.out.println(map.keySet());System.out.println(map.values());}}import java.util.*;
public class Main {public static void main(String[] args) {Map<Integer , String> map = new HashMap<>();map.put(0, "单走");map.replace(0, ">>>");   //直接替换为新的System.out.println(map);}}public static void main(String[] args) {Map<Integer , String> map = new HashMap<>();map.put(0, "单走");map.replace(0, "巴卡", "玛卡");   //只有键和值都匹配时,才进行替换System.out.println(map);
}
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class Main {public static void main(String[] args) {Map<Integer, String> map = new HashMap<>();map.put(1, "A");map.put(2, "B");map.compute(3, (k, v) -> {   //compute会将指定Key的值进行重新计算,若Key不存在,v会返回nullreturn v+"M";     //这里返回原来的value+M});map.computeIfPresent(3, (k, v) -> {   //当Key存在时存在则计算并赋予新的值return v+"M";     //这里返回原来的value+M});System.out.println(map);}}

{1=A, 2=B, 3=nullMM}

import java.util.*;public class Main {public static void main(String[] args) {List<Student> students = Arrays.asList(new Student("yoni", "English", 80),new Student("yoni", "Chiness", 98),new Student("yoni", "Math", 95),new Student("taohai.wang", "English", 50),new Student("taohai.wang", "Chiness", 72),new Student("taohai.wang", "Math", 41),new Student("Seely", "English", 88),new Student("Seely", "Chiness", 89),new Student("Seely", "Math", 92));Map<String, Integer> scoreMap = new HashMap<>();//merge方法可以对重复键的值进行特殊操作students.forEach(student -> scoreMap.merge(student.getName(), student.getScore(), Integer::sum));scoreMap.forEach((k, v) -> System.out.println("key:" + k + "总分" + "value:" + v));}static class Student {private final String name;private final String type;private final int score;public Student(String name, String type, int score) {this.name = name;this.type = type;this.score = score;}public String getName() {return name;}public int getScore() {return score;}public String getType() {return type;}}}

LinkedHashMap

如果需要维护顺序,我们同样可以使用LinkedHashMap,它的内部对插入顺序进行了维护

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class Main {public static void main(String[] args) {Map<String , String> map = new LinkedHashMap<>();map.put("0", "十七张");map.put("+", "牌");map.put("P", "你能秒我");System.out.println(map);System.out.println(map.keySet());System.out.println(map.values());}}

{0=十七张, +=牌, P=你能秒我}
[0, +, P]
[十七张, 牌, 你能秒我]

Stream流

stream()

import java.util.*;
import java.util.stream.Collectors;
public class Main {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");//Stream操作list = list     //链式调用.stream()    //获取流.filter(e -> !e.equals("B"))   //只允许所有不是B的元素通过流水线.collect(Collectors.toList());   //将流水线中的元素重新收集起来,变回ListSystem.out.println(list);}}
import java.util.*;
import java.util.stream.Collectors;
public class Main {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(3);System.out.println(list);list = list.stream().distinct()   //去重(使用equals判断).sorted((a, b) -> b - a)    //进行倒序排列.map(e -> e+10)    //每个元素都要执行+1操作.limit(2)    //只放行前两个元素.collect(Collectors.toList());System.out.println(list);}}

[1, 2, 3, 3]
[13, 12]

stream会先记录每一步操作,而不是直接开始执行内容,当整个链式调用完成后,才会依次进行

ints()

import java.util.Random;
public class Main {public static void main(String[] args) {Random random = new Random();random.ints(-100, 100)   //生成-100~100之间的,随机int型数字(本质上是一个IntStream).limit(10)   //只获取前10个数字(这是一个无限制的流,如果不加以限制,将会无限进行下去!).filter(i -> i < 0)   //只保留小于0的数字.sorted()    //默认从小到大排序.forEach(System.out::println);   //依次打印}}
import java.util.IntSummaryStatistics;
import java.util.Random;
public class Main {public static void main(String[] args) {Random random = new Random();  //Random是一个随机数工具类IntSummaryStatistics statistics = random.ints(0, 100).limit(1000).summaryStatistics();    //获取语法统计实例System.out.println(statistics.getMax());  //快速获取最大值System.out.println(statistics.getCount());  //获取数量System.out.println(statistics.getAverage());   //获取平均值}}
import java.util.*;
import java.util.stream.Collectors;
public class Main {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("A,B");list.add("C,D");list.add("E,F");   //我们想让每一个元素通过,进行分割,变成独立的6个元素list = list.stream()    //生成流.flatMap(e -> Arrays.stream(e.split(",")))    //分割字符串并生成新的流.collect(Collectors.toList());   //汇成新的ListSystem.out.println(list);   //得到结果}}

[A, B, C, D, E, F]

Collections工具类

import java.util.*;
import java.util.stream.Collectors;
public class Main {public static void main(String[] args) {List<Integer> list = Arrays.asList(2, 3, 8, 9, 10, 13);System.out.println(Collections.binarySearch(list, 8));System.out.println(Collections.max(list));Collections.fill(list, 6);System.out.println(list);List<Integer> list2 = new ArrayList<>(Arrays.asList(1,2,3,4,5));System.out.println(Collections.indexOfSubList(list2, Arrays.asList(4, 5)));}}

2
13
[6, 6, 6, 6, 6, 6]
3