Guava学习笔记(二)

Guava学习笔记(二)

本部分主要笔记Guava之Collections的用法

Immutable Collections

不可变的对象有很多好处:

  • 不受信任的库可以安全使用。
  • 线程安全:可以被许多线程使用,没有竞争条件的风险。
  • 不需要支持变异,并且可以通过该假设节省时间和空间。所有不可变的集合实现都比它们可变的兄弟节点更具内存效率
  • 可以用作常量,期望它将保持固定。

防御性编程(defensive programming technique)

Guava 为JDK里面的各个几何类都提供了一个不可变的版本

-w627

3种创建方式

  1. 使用copyOf()
  2. 使用of():

    1
    ImmutableSet.of("a", "b", "c", "a", "d", "b")
  3. Builder

    1
    2
    3
    4
    5
     public static final ImmutableSet<Color> GOOGLE_COLORS =
    ImmutableSet.<Color>builder()
    .addAll(WEBSAFE_COLORS)
    .add(new Color(0, 191, 255))
    .build();

New Collection Types

Guava在JDK的基础上,重新定义了几个集合类型

Multiset

我们知道Set集合取值是没有重复的,Multiset和Set的区别在于Multiset是可以存重复的值的

1
2
3
4
5
6
7
8
9
10
11
12
13
public void test2() {
Multiset<String> multiset = HashMultiset.create();
multiset.add("apple", 2);
multiset.add("orange");

System.out.println(multiset.count("apple")); //2

System.out.println(multiset.setCount("apple", 2, 5)); //true
System.out.println(multiset.count("apple")); //5
//第二个参数表示旧值,第三个参数表示新值,返回false表示设置失败,旧值校验不对
System.out.println(multiset.setCount("apple", 2, 6)); //false
System.out.println(multiset.count("apple")); //5
}

从上面的示例可以看出Multiset是一个很好用的计数容器。

Multimap

这个集合对象也特别有意思,它和Map不同,Map结构是一个K对应一个V,而Mutilmap是一个K对应多个V

1
2
3
4
5
6
7
8
9
public void test3() {
Multimap<String, String> multimap = HashMultimap.create();
multimap.put("apple", "red");
multimap.put("apple", "green");
multimap.put("apple", "yellow");
multimap.put("orange", "orange");
Collection<String> attrs = multimap.get("apple");
attrs.forEach(System.out::println);
}

怎么样,挺有意思吧?同时Multimap还提供了一组视图方法,用来转换multimap对象的数据到其它的数据结构视图,这个就不穷举说明了,看文档

Muiltumap提供了多种实现

-w565

BiMap

BiMap在Map的基础上,提供了一个reverse()方法,可以将Map的key和value值进行对掉。

1
2
3
4
5
6
7
8
public void test4() {
BiMap<Integer, String> biMap = HashBiMap.create();
biMap.put(1, "apple");
biMap.put(2, "guava");
biMap.put(3, "kiwi");
BiMap<String, Integer> biMapReverse = biMap.inverse();
assertEquals(1, biMapReverse.get("apple")); //1
}

-w564

Table

Table用来记录一个坐标的值

1
2
3
4
5
6
7
8
9
public void test5() {
Table<String, String, Integer> table = HashBasedTable.create();
table.put("1", "1", 11);
table.put("1", "2", 12);
table.put("1", "3", 13);
table.put("2", "1", 21);
table.put("2", "2", 22);
assertEquals(12, table.get("1", "2"));
}

ClassToInstanceMap

ClassToInstanceMap提供了K为class,V为值的map类型,emmm,没想到应用场景

1
2
3
4
5
public void test6() {
ClassToInstanceMap<Number> numberDefaults = MutableClassToInstanceMap.create();
numberDefaults.putInstance(Integer.class, Integer.valueOf(1));
numberDefaults.putInstance(Double.class, Double.valueOf(1));
}

RangeSet

RangeSet用来处理一些连续的非空的range,当添加一个range到一个RangeSet之后,任何有连续的range将被自动合并,而空的range将被自动去除

1
2
3
4
5
6
7
8
9
10
public void test7() {
RangeSet rangeSet = TreeRangeSet.create();
rangeSet.add(Range.closed(0, 10));

rangeSet.add(Range.closedOpen(10, 15));

rangeSet.add(Range.closedOpen(16, 18));

System.out.println(rangeSet);
}

RangeMap

和RangeSet相比,RangeMap将Range作为了一个key,每一个Range对应一个值。

1
2
3
4
5
6
7
public void test8() {
RangeMap rangeMap = TreeRangeMap.create();
rangeMap.put(Range.closed(5, 10), "apple");
rangeMap.put(Range.closed(8, 12), "banana");
System.out.println(rangeMap);
}
//[[5..8)=apple, [8..12]=banana]

Collection Utilities

Guava为一些集合接口开发了一组工具类

-w543

Extension Utilities

这个以后再看

# guava

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×