美文网首页
OnJava8_集合

OnJava8_集合

作者: 啊啊啊哼哼哼 | 来源:发表于2020-02-01 21:54 被阅读0次

集合类:List, Set, Map, Queue

  • 泛型
    ArrayList<Apple> apples = new ArrayList<>();

类名,后边跟着对象的散列码的无符号十六进制表示(这个散列码是通过 hashCode() 方法产生的)


Objec.toString 方法打印对象.png

常用集合类型

        System.out.println(fill(new ArrayList<>()));
        System.out.println(fill(new LinkedList<>()));
        //通过hash算法存储和查找元素
        System.out.println(fill(new HashSet<>()));
        //比较结果的升序保存对象
        System.out.println(fill(new TreeSet<>()));
        //被添加的先后顺序保存对象
        System.out.println(fill(new LinkedHashSet<>()));
        System.out.println(fill(new HashMap<>()));
        System.out.println(fill(new TreeMap<>()));
        System.out.println(fill(new LinkedHashMap<>()));

列表

  • ArrayList: 底层是数组,所以擅长随机访问元素,在中间插入和删除元素较慢;

  • LinkedList:底层是链表,所以擅长list中插入和删除元素,随机访问元素较慢。

  • 所有的类都是 Iterable, 不需要.iterator()方法:

import typeinfo.pets.*;
import java.util.*;

public class CrossCollectionIteration2 {
  public static void display(Iterable<Pet> ip) {
    Iterator<Pet> it = ip.iterator();
    while(it.hasNext()) {
      Pet p = it.next();
      System.out.print(p.id() + ":" + p + " ");
    }
    System.out.println();
  }
  public static void main(String[] args) {
    List<Pet> pets = Pets.list(8);
    LinkedList<Pet> petsLL = new LinkedList<>(pets);
    HashSet<Pet> petsHS = new HashSet<>(pets);
    TreeSet<Pet> petsTS = new TreeSet<>(pets);
    display(pets);
    display(petsLL);
    display(petsHS);
    display(petsTS);
  }
}
  • ListIterator可以双向移动
package collections;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;

public class ListIteration {
    public static void main(String[] args) {
        List<Integer> lists = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
        ListIterator<Integer> it = lists.listIterator();
        while (it.hasNext()) {
            System.out.println(it.next() + " " + it.nextIndex() + " " + it.previousIndex());
        }
        System.out.println();
        while (it.hasPrevious()) {
            System.out.println(it.previous());
        }
        it = lists.listIterator(3);
        while (it.hasNext()) {
            ;
            System.out.println(it.next() + " " + it.nextIndex() + " " + it.previousIndex());
        }
    }
}

Set:(需要详细了解)

TreeSet用红黑树数据结构存储元素;会对元素进行排序;
HashSet使用散列函数存储元素;
LinkedHashSet 还不清楚。

idea的相对路径相对于项目根目录"./src/某某文件.txt"

stack (先进后出)

用ArrayDeque实现, ArrayDeque比Stack性能好。

package collections;

import java.util.ArrayDeque;
import java.util.Deque;

public class Stack<T> {
    private Deque<T> storage = new ArrayDeque<>();

    public void push(T v) {
        storage.push(v);
    }

    public T peek() {
        return storage.peek();
    }

    public T pop() {
        return storage.pop();
    }

    public boolean isEmpty() {
        return storage.isEmpty();
    }

    public String toString() {
        return storage.toString();
    }
}

queue (先进先出)

LinkedList 实现了 Queue 接口,并且提供了一些方法以支持队列行为,因此 LinkedList 可以用作 Queue 的一种实现。 通过将 LinkedList 向上转换为 Queue。

//offer() 在队列的尾部插入一个元素,或者返回 false;
// peek() 和 element() 都返回队头元素而不删除它;
//如果队列为空,则 element() 抛出 NoSuchElementException;
// peek() 返回 null; 
// poll() 和 remove()* 都删除并返回队头元素;
// 但如果队列为空,poll() 返回 null ,而 remove() 抛出。 NoSuchElementException 。
package collections;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;

public class QueueDemo {
    public static void printQ(Queue queue) {

        while (queue.peek() != null) {
            System.out.println(queue.remove() + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        Random rand = new Random(47);
        for (int i = 0; i < 10; i++) {
            queue.offer(rand.nextInt(i + 10));
        }
        printQ(queue);
        Queue<Character> qc = new LinkedList<>();
        for (char c : "Brontosaurus".toCharArray()) {
            qc.offer(c);
        }
        printQ(qc);
    }
}

优先级队列PriorityQueue

package collections;

import java.util.*;

public class PriorityQueueDemo {
    public static void main(String[] args) {
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
        Random random = new Random(47);
        for (int i = 0; i < 10; i++) {
            priorityQueue.offer(random.nextInt(i + 10));
        }
        QueueDemo.printQ(priorityQueue);

        List<Integer> ints = Arrays.asList(25, 22, 20, 18, 14, 9, 3, 1, 1, 2, 3, 9, 14, 18, 21, 23, 25);
        priorityQueue = new PriorityQueue<>(ints);
        QueueDemo.printQ(priorityQueue);
        priorityQueue = new PriorityQueue<>(ints.size(), Collections.reverseOrder());
        priorityQueue.addAll(ints);
        QueueDemo.printQ(priorityQueue);

        String fact = "EDUCATION SHOULD ESCHEW OBFUSCATION";
        List<String> strings = Arrays.asList(fact.split("\\s+"));
        PriorityQueue<String> stringPQ = new PriorityQueue<>(strings);
        QueueDemo.printQ(stringPQ);
        stringPQ = new PriorityQueue<>(strings.size(), Collections.reverseOrder());
        stringPQ.addAll(strings);
        QueueDemo.printQ(stringPQ);

        Set<Character> charSet = new HashSet<>();
        for (char c : fact.toCharArray())
            charSet.add(c);
        PriorityQueue<Character> characterPQ = new PriorityQueue<>(charSet);
        QueueDemo.printQ(characterPQ);
    }
}

HashMap 专为快速访问而设计,而 TreeMap 保持键始终处于排序状态,所以没有 HashMap 快。 LinkedHashMap 按插入顺序保存其元素,但使用散列提供快速访问的能力。
Set 不接受重复元素。 HashSet 提供最快的查询速度,而 TreeSet 保持元素处于排序状态。 LinkedHashSet 按插入顺序保存其元素,但使用散列提供快速访问的能力。

相关文章

  • OnJava8_集合

    集合类:List, Set, Map, Queue 泛型ArrayList apples = new Array...

  • OnJava8_封装

    IDEA怎么设置CLASSPATH 一个Java源码文件被称为一个编译单元,每个编译单元的后缀必须是.java。在...

  • OnJava8_简介

    OOP的特征 1、万物皆对象2、程序是一组对象,它们通过发送消息来相互告知要做什么。3、每个对象都有自己的存储空间...

  • OnJava8_内部类

    一个定义在另一个类中的类,叫作内部类。 内部类自动拥有对其外围类所有成员的访问权。这是如何做到的呢?当某个外围类的...

  • OnJava8_比较运算重写

    List的contains方法,当涉及自定义的类对象时,需要重写equals方法; 数据存储自定义类对象时并调用s...

  • OnJava8_初始化和清理

    Java对象初始化通过构造器,清理通过垃圾收集器(Garbage Collector, GC) 构造器 无参构造函...

  • OnJava8_万物皆对象

    我们所操作的标识符是对象的引用 String s = "qinxiaoyu", s 就是String对象"qinx...

  • OnJava8_运算符和控制流

    二进制表示 i-i: i的二进制数的补码(反码加1) 三元运算符 i>20? i : i+1; if(i>20) ...

  • 我的Swift的学习总结 -->第二周

    集合 集合:Set,定义一个集合可以写成:var 集合名 : Set<集合类型> = [集合元素],具体的集合应用...

  • markdown 测试

    集合 集合 集合 引用

网友评论

      本文标题:OnJava8_集合

      本文链接:https://www.haomeiwen.com/subject/dgsvthtx.html