Java学习随便记3

Posted sjg20010414

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习随便记3相关的知识,希望对你有一定的参考价值。

Java数据结构-BitSet类

BitSet类的功能和 C++ STL  bitset<N>模板类大致接近,只是STL bitset类没有直接位逻辑运算的方法,不过它可以直接[]索引,自己循环解决;另外,STL bitset没有求交集之类集合运算,不过<algorithm>提供了set_xxx系列对有序序列的集合运算。(参考 bitset - C++ Reference    <algorithm> - C++ Reference

import java.util.BitSet;

public class BitSetTest 
    public static void main(String[] args) 
        BitSet bits1 = new BitSet(32);
        BitSet bits2 = new BitSet(32);

        bits1.set(0, 7);
        bits2.set(0, 7, false);

        for (int i = 8; i < 32; i++) 
            if (i % 2 == 0)
                bits1.set(i);
            if (i % 3 == 1)
                bits2.set(i);
        
        System.out.print("bits1: ");
        System.out.println(bits1);
        System.out.print("bits2: ");
        System.out.println(bits2);

        System.out.print("Does bits1 intersect with bits2: ");
        System.out.println(bits1.intersects(bits2) ? "YES" : "NO");

        System.out.print("First clear bit of bits1 from index 0, index = ");
        System.out.println(bits1.nextClearBit(0));

        System.out.print("First set bit of bits2 from index 0, index = ");
        System.out.println(bits2.nextSetBit(0));

        bits1.xor(bits2);
        System.out.print("bits1 = bits1 XOR bits2: ");
        System.out.println(bits1);

        System.out.print("Cardinality of bits1: ");
        System.out.println(bits1.cardinality());

    
bits1: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30
bits2: 10, 13, 16, 19, 22, 25, 28, 31
Does bits1 intersect with bits2: YES
First clear bit of bits1 from index 0, index = 7
First set bit of bits2 from index 0, index = 10
bits1 = bits1 XOR bits2: 0, 1, 2, 3, 4, 5, 6, 8, 12, 13, 14, 18, 19, 20, 24, 25, 26, 30, 31
Cardinality of bits1: 19

Java数据结构-Dictionary类、集合框架 Map、Map.Entry接口

因为 Java 的 Dictionary类是抽象类,所以,你并不能拿来就用。既然如此,Java的 Collection集合框架中有更好用的 Map接口,我们不如使用从 Map接口继承的 HashMap泛型类。Map.Entry接口需要配合Set工作,所以这里用法暂时略,简单来说,Map.Entry接口对应的具体类相当于 STL map 中的pair<K,V>键值对。

import java.util.HashMap;
import java.util.Map;

public class MapTest 
    public static void main(String[] args) 
        Map mp1 = new HashMap<String, Integer>();
        mp1.put("耐克", 200);
        mp1.put("Adidas", 199);
        mp1.put("李宁", 180);
        System.out.println();
        System.out.print("Map Elements: ");
        System.out.println(mp1);
        System.out.print("耐克 价格:");
        System.out.println(mp1.get("耐克"));
    

Java数据结构-Vector类

Java的 Vector泛型类 和 STL vector接近,值得注意的是,Java的 Vector 可以同时装入整数和浮点数(可以认为此时它们都是Object类型),而 STL vector只能是整数序列或者浮点数序列。

import java.util.Vector;

public class VectorTest 
    public static void main(String[] args) 
        Vector v = new Vector(3, 2); // 2 是空间增长量
        System.out.println("v 初始大小: " + v.size());
        System.out.println("v 初始容量: " + v.capacity());
        v.add(new Integer(1));
        v.add(new Integer(2));
        v.add(new Integer(3));
        v.add(new Integer(4));
        System.out.println("v 加入4个元素后的容量: " + v.capacity());
        v.add(new Double(3.14));
        System.out.println("v 当前的容量: " + v.capacity());
        System.out.println("最后一个元素:" + v.lastElement());
        System.out.println("第二个元素:" + v.get(1));
        for (Object n : v)  // n 可能是装箱了的整数或者浮点数
            System.out.print(n + "\\t");
        
        System.out.println();
    

v 初始大小: 0
v 初始容量: 3
v 加入4个元素后的容量: 5
v 当前的容量: 5
最后一个元素:3.14
第二个元素:2
1       2       3       4       3.14

Java数据结构-Stack类

Stack类是Vector类的子类,这一点和STL类似,即 Stack 本质上是 Vector实现的。借由Vector实现的 Stack类的优点是线程安全的,但作为栈使用,如果频繁进出栈,不如用 LinkedList 实现栈结构(但在编程竞赛中,如果一次性的分配不会超出空间,那自己维护栈顶指针的数组才能速度最快)。

import java.util.EmptyStackException;
import java.util.Stack;

public class StackTest 
    public static void main(String[] args) 
        Stack stk = new Stack();
        System.out.println("stack: " + stk);
        stk.push(new Integer(42));
        stk.push(new Integer(77));
        stk.push(new Integer(88));
        System.out.println("stack: " + stk);
        stk.pop();
        stk.pop();
        System.out.println("stack: " + stk);
        System.out.println("Is stack empty: " + stk.empty());
        try 
            stk.pop();
            System.out.println("Is stack empty: " + stk.empty());
            stk.pop();
         catch (EmptyStackException e) 
            System.out.println("Stack empty!!!");
        
    

stack: []
stack: [42, 77, 88]
stack: [42]
Is stack empty: false
Is stack empty: true
Stack empty!!!

Java数据结构-集合框架List接口(ArrayList、LinkedList)

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

public class ListTest 
    public static void main(String[] args) 
        List lst1 = new ArrayList();
        lst1.add("纽约");
        lst1.add("东京");
        lst1.add("北京");
        System.out.println("ArrayList: " + lst1);
        List lst2 = new LinkedList();
        lst2.add("纽约");
        lst2.add("东京");
        lst2.add("北京");
        System.out.println("LinkedList: " + lst2);
    
ArrayList: [纽约, 东京, 北京]
LinkedList: [纽约, 东京, 北京]

从表面效果来看,ArrayList和LinkedList是“差不多”的,但它内部实现有很大不同。ArrayList是内部Object[]类型数组作为buffer实现的,如果装入是一次性的或者只会少量在后面再次装入,主要是查询,那么它的效果会比较好;但要从头部或中间增删元素,对它是很糟糕的情况(这个意义上说,它和传统Java数据结构中的Vector一样,或者说,ArrayList就是集合框架中Vector的对应物)。LinkedList则是标准的双向链表,具有链表的特性,对于头部、中间增删频繁的情况特别适用,尾部增删频繁也可用。

Java数据结构-集合框架Set接口

Set就是数学概念上的集合,即元素的唯一性,这种唯一性是可以比较的。继承Set接口的有HashSet,TreeSet,LinkedHashSet等。HashSet是基于Hash的,所以,有“去重”效果,但元素无序;TreeSet是基于红黑树之类的树结构,所以,元素是有序的(实现了SortedSet接口)。LinkedHashSet 引入了链表特性,使得hash表大小可变。和STL对比,反而是TreeSet像STL set,HashSet则像unordered_set。

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

public class SetTest 
    public static void main(String[] args) 
        int[] a =  34, 22, 10, 60, 30, 22 ;
        Set<Integer> s = new HashSet<Integer>();
        try 
            for (int n : a) 
                s.add(n);
            
            System.out.println(s);
            TreeSet sortedSet = new TreeSet<>(s);
            System.out.println("Sorted set is: " + sortedSet);
            System.out.println("1st element of sortedSet: " + sortedSet.first());
            System.out.println("last element of sortedSet: " + sortedSet.last());
         catch (Exception e) 
        
    

[34, 22, 10, 60, 30]
Sorted set is: [10, 22, 30, 34, 60]
1st element of sortedSet: 10
last element of sortedSet: 60

Java数据结构-集合框架 Map、Map.Entry、SortedMap接口

SortedMap接口从Map接口继承,HashMap是继承Map接口,而TreeMap则继承SortedMap接口。HashMap类似STL 的 unordered_map,而TreeMap则像map,Map.Entry像pair<K,V>。

TreeMap遍历需要用键值对的集合或者键的集合来达到目的。

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class MapTest2 
    public static void main(String[] args) 
        TreeMap mp = new TreeMap<>();
        mp.put("萝卜", 0.85);
        mp.put("黄瓜", 3.45);
        mp.put("芹菜", 4.85);
        mp.put("土豆", 1.00);
        Set s = mp.entrySet();
        Iterator itr = s.iterator();
        while (itr.hasNext()) 
            Map.Entry entry = (Map.Entry) itr.next();
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        
        Double price = ((Double) mp.get("萝卜")).doubleValue();
        mp.put("萝卜", new Double(price + 0.5));
        System.out.println("萝卜的新价格: " + mp.get("萝卜"));
    

简单来说,Java传统数据结构中,除了Bitset类,其他我们可以考虑用Collection集合框架下的接口和类。要用Vector,可以考虑 ArrayList,要用Stack,可以考虑LinkedList。无论是 Map 还是 Set,都有 Hash方式的和Tree方式的。

Java数据结构-队列

没有涉及的似乎还有一个“队列”。

Queue和Deque都是接口而已,实际我们会考虑使用的,一个是 LinkedList,一个是 ArrayDeque。前者是链表实现的双端队列,后者是循环数组实现的双端队列。

另外一个“队列”是优先队列 PriorityQueue,也就是基于数组的堆结构。

以上是关于Java学习随便记3的主要内容,如果未能解决你的问题,请参考以下文章

golang学习随便记9

Java学习随便记1

Java学习随便记1

Java学习随便记4 (待续)

Java学习随便记4 (待续)

Java学习随便记2