guava笔记2-集合

(1)构造不可变集合

不可变集合的优点:
1. 避免别人调用时更改集合内容
2. 线程安全:因为是只读的,所以多线程条件下是安全的
3. 不必考虑集合变化,所以会比可变的集合更加的有效率
4. 可以作为常量使用

JDK里面Collections.unmodifiableXXX也可以得到不可变的集合,但是是有缺陷的:
1. api不友好,用起来麻烦
2. 不安全的,unmodifiableXXX返回的集合确实不可以直接修改,但是可以通过修改原集合元素来改变返回的集合。
3. 低效的:数据结构依然含有可变集合的特性,如并发修改检查,hashtable中的额外空间等。

所以:当你期望一个集合不要被更改,或者想把一个集合当常量使用,那就把它变成immutable吧。
需要注意的是:guava的immutable集合不允许包含null值,他们对google内部代码做了研究,认为95%的情况,不允许包含null值会更方便。
如果你实在希望immutable集合允许包含null值,那就只有用jdk的Collections.unmodifiableXXX了。

在guava中,ImmutableXXX有三种方法可以得到:
1. 使用copyOf方法,如:ImmutableSet.copyOf(set)
2. 使用of方法,如:ImmutableSet.of("a", "b", "c") or ImmutableMap.of("a", 1, "b", 2)
3. 使用Builder,如:
    public static final ImmutableSet<Color> GOOGLE_COLORS =
       ImmutableSet.<Color>builder()
           .addAll(WEBSAFE_COLORS)
           .add(new Color(0, 191, 255))
           .build();

智能的copyOf:
copyOf方法会根据实际情况,决定是否通过全量copy的方式生成不可变集合。
可以直接来看ImmutableList的copyOf方法:
  public static <E> ImmutableList<E> copyOf(Collection<? extends E> elements) {
    if (elements instanceof ImmutableCollection) {
      @SuppressWarnings("unchecked") // all supported methods are covariant
      ImmutableList<E> list = ((ImmutableCollection<E>) elements).asList();
      return list.isPartialView() ? copyFromCollection(list) : list;
    }
    return copyFromCollection(elements);
  }

1. 如果集合本身就是不可变的,就会考虑直接返回集合的asList(),否则就做全量copy。
2. 如果copyOf集合的部分元素,还是需要做copy的
3. copyOf的其他重构方法可以看到:如果原集合和不可变集合类型不同,就需要做全量copy。

Interface

JDK or Guava?

Immutable Version

Collection

JDK

ImmutableCollection

List

JDK

ImmutableList

Set

JDK

ImmutableSet

SortedSet/NavigableSet

JDK

ImmutableSortedSet

Map

JDK

ImmutableMap

SortedMap

JDK

ImmutableSortedMap

Multiset(可放重复元素的set,有方法返回元素出现的次数)

Guava

ImmutableMultiset

SortedMultiset(有序的multiset)

Guava

ImmutableSortedMultiset

Multimap(key可重复的map,有方法返回指定key的所有value)

Guava

ImmutableMultimap

ListMultimap(value采用list存储的Multimap,实现类很多:如LinkedListMultimap,ArrayListMultimap等等)

Guava

ImmutableListMultimap

SetMultimap(value采用set存储的Multimap,同样,实现类很多:如MapMultimap,LinkedHashMultimap等等)

Guava

ImmutableSetMultimap

BiMap(key可以查找value,也可通过value查找key,提供方法inverse()进行转换)

Guava

ImmutableBiMap

ClassToInstanceMap(key是class的map)

Guava

ImmutableClassToInstanceMap

Table(x,y,value)的格式存储数据,可以通过坐标(x,y)查找元素

Guava

ImmutableTable

RangeSet 元素是Range的set,Range表示一个区域,类似 (2,4)  [2,4]等。有方法可以判定区域的包含关系,或者将多个区域并为一个。

Guava

ImmutableRangeSet

RangeMap 元素是Range的map

Guava

ImmutableRangeMap



(2)集合帮助类:
就像JDK里面Collections提供了很多实用方法一样,guava也针对不同的集合类提供了帮助类。

 

Interface

JDK or Guava?

Corresponding Guava utility class

Collection

JDK

Collections2 (avoiding conflict with java.util.Collections)

List

JDK

Lists

Set

JDK

Sets

SortedSet

JDK

Sets

Map

JDK

Maps

SortedMap

JDK

Maps

Queue

JDK

Queues

Multiset

Guava

Multisets

Multimap

Guava

Multimaps

BiMap

Guava

Maps

Table

Guava

Tables


还有个比较特殊的帮助类:Iterables
Google推荐处理集合类的api最好针对Iterable,而不是Collection。
我们知道Collection实现了Iterable,Iterable其实只有一个方法iterator(),实现该方法的对象就可以使用foreach来遍历该集合。
很多时候,我们无法一次性得到集合的所有元素(比如数据来自db或者另一个数据中心),所以size()方法是无法实现的,这时候,如果我们实现Iterable的话,就只需要实现iterator()方法。
    Iterables是针对Iterable的帮助类,Guava12以后,又增加了一个FluentIterable类来处理Iterable。基本上Iterables的方法在FluentIterable中都有对应的实现。
    Iterables的方法都是static的;FluentIterable实现了Iterable接口,方法都是非static的
FluentIterable.from(Iterable iterable)可以把iterable封装为FluentIterable对象,然后就可以使用那些非static的方法了。

集合帮助类一般包含3种api:
(1)    静态工厂方法:构造集合的方法,上面的表格基本说明了构造各种集合该用哪种帮助类。一般是XxxS.newXX()或者Xxxs.create()方法来构造集合。
(2)    包装方法:包装成Unmodifiable,Synchronized
(3)    特色方法:如lists可以对集合的元素分组,sets可以对集合执行并交差操作。

下面重点介绍下特色方法:
1.    Iterables & FluentIterable
Iterable中的方法:
(1)    concat(Iterable<Iterable>) 合并多个Iterable集合为一个
(2)    frequency(Iterable, Object) 统计对象出现次数
(3)    partition(Iterable, int) 按一定尺寸进行分段  paddedPartition会用null填充少的元素
(4)    getFirst(Iterable, T default) 得到第一个对象
(5)    getLast(Iterable) 得到最后一个对象
(6)    elementsEqual(Iterable, Iterable) 比较Iterable的所有元素是否顺序相同且相等
(7)    unmodifiableIterable(Iterable) 得到不可变的集合视图
(8)    limit(Iterable, int) 取前n个元素构成集合
(9)    getOnlyElement(Iterable) 返回Iterable中的唯一元素,必须保证Iterable只有1个元素

FluentIterable中还有如下的方法:
ImmutableList toImmutableList() 使用Iterable构造不可变的List
ImmutableSet toImmutableSet() 使用Iterable构造不可变的Set
ImmutableSortedSet toImmutableSortedSet(Comparator) 使用Iterable,采用Comparator指定的排序方式构造有序的Set
此外,Iterables & FluentIterable还有类似Collections对Collection对象操作的方法,可以对Iterable进行集合相关的操作

2.    Lists
partition(List, int) 按照指定size对list进行分组
reverse(List)倒序,注意:如果list是Immutable的,考虑使用ImmutableList.reverse() 代替

3.    Sets
union(Set, Set) 并集
intersection(Set, Set) 交集
difference(Set, Set) 差集 set1中存在,set2中不存在
symmetricDifference(Set, Set) 对称差集 (set1和set2中出现,但不同时出现)
cartesianProduct(List<Set>) 笛卡尔积
powerSet(Set) 所有可能的子集合

4.    Maps
uniqueIndex(Iterable, Function) 这个很有用,希望构造另一个Map,key是Function转换后的对象,value就是Iterable的元素。用于实现key查找value,key通过Function来构造。
difference(Map, Map) 比较2个map的差异,返回的MapDifference
对象可以比较包括key和value的差异
synchronizedBiMap(BiMap) 构造线程安全的biMap
unmodifiableBiMap(BiMap) 构造Immutable的biMap

5.    Multisets
containsOccurrences(Multiset sup, Multiset sub) 判断所有元素在sup中出现的次数是否都大于等于sub中出现的次数
removeOccurrences(Multiset removeFrom, Multiset toRemove) 从removeFrom中移除对象在toRemove中出现的次数
retainOccurrences(Multiset removeFrom, Multiset toRetain) 从removeForm中保留toRetain中出现的次数
intersection(Multiset, Multiset) 返回2个Multiset的交集,2个集合中都包含,保留出现次数少的次数
copyHighestCountFirst(Multiset) 得到immutable的Multiset,按出现次数排序
unmodifiableMultiset(Multiset) 返回immutable的Multiset
unmodifiableSortedMultiset(SortedMultiset) 返回immutable的SortedMultiset

6.    Multimaps
index(Iterable, Function)  跟Mpas. uniqueIndex类似,但是同一个key可以包含多个value
invertFrom(Multimap toInvert, Multimap dest)  倒序,注意:如果toInvert是immutable的,考虑使用 ImmutableMultimap.inverse()代替
forMap(Map) 使用Map构造Multimaps,结合invertFrom可以轻松实现map中通过value找key。

7.    Tables
newCustomTable(Map, Supplier<Map>)  使用指定的值来构造Table对象,Map是(x,y),Supplier<Map>是value。
transpose(Table<R, C, V>)  (x,y)换成(y,x)

(3)实现自己的集合类

1. Forwarding Decorators
有时候,我们自己实现的集合,有些特殊的需求,比如元素加入或删除时记日志,发消息;再比如元素的加入删除读取,其实是对db或者文件的操作。这时候我们可以直接继承guava提供的抽象父类。
例如,下面是自己实现的list,在加入元素时打下日志。
class AddLoggingList<E> extends ForwardingList<E> {
  final List<E> delegate; // backing list
  @Override protected List<E> delegate() {
    return delegate;
  }
  @Override public void add(int index, E elem) {
    log(index, elem);
    super.add(index, elem);
  }
  @Override public boolean add(E elem) {
    return standardAdd(elem); // implements in terms of add(int, E)
  }
  @Override public boolean addAll(Collection<? extends E> c) {
    return standardAddAll(c); // implements in terms of add
  }
}

类似List,其他的集合类都有对应的抽象父类

Interface

Forwarding Decorator

Collection

ForwardingCollection

List

ForwardingList

Set

ForwardingSet

SortedSet

ForwardingSortedSet

Map

ForwardingMap

SortedMap

ForwardingSortedMap

ConcurrentMap

ForwardingConcurrentMap

Map.Entry

ForwardingMapEntry

Queue

ForwardingQueue

Iterator

ForwardingIterator

ListIterator

ForwardingListIterator

Multiset

ForwardingMultiset

Multimap

ForwardingMultimap

ListMultimap

ForwardingListMultimap

SetMultimap

ForwardingSetMultimap


2. PeekingIterator
iter.next() 会返回集合当前遍历到的元素,有时候我们需要比较当前元素和下一个元素,根据比较结果来决定当前元素的取舍。如果自己实现,可能需要使用额外的变量保存当前值。
PeekingIterator实现了Iterator,但是他不仅有next()方法,还有个peek()方法,返回再下一个元素,但是遍历指针不会向前移动。这样就可以方便把当前元素跟下一个元素对比,来决定当前元素做些神马操作(next?remove?)
下面示例代码可以去重连续重复的元素。Iterators.peekingIterator(Iterator)可以将普通Iterable封装为PeekingIterator
List<E> result = Lists.newArrayList();
PeekingIterator<E> iter = Iterators.peekingIterator(source.iterator());
while (iter.hasNext()) {
  E current = iter.next();
  while (iter.hasNext() && iter.peek().equals(current)) {
    // skip this duplicate element
    iter.next();
  }
  result.add(current);
}

3.AbstractIterator
假如我们自己实现Iterator,考虑的重点应该是如何获取下一个元素,以及是否还有下一个元素。
继承AbstractIterator,我们可以通过实现computeNext()方法来完成这一点,其他的我们就不用操心了。当然,如果没有下一个元素了,我们可以调用endOfData方法
例如,下面的代码返回的自定义Iterator可以跳过null值。
public static Iterator<String> skipNulls(final Iterator<String> in) {
  return new AbstractIterator<String>() {
    protected String computeNext() {
      while (in.hasNext()) {
        String s = in.next();
        if (s != null) {
          return s;
        }
      }
      return endOfData();
    }
  };
}


4.AbstractSequentialIterator
如果,我们计算下一个元素需要前一个参数作为依据,可以考虑实现AbstractSequentialIterator。
它的computeNext方法会传一个参数,代表集合前一个值。与AbstractIterator
不同,如果想让集合马上结束,返回null即可。此外,AbstractSequentialIterator的构造方法必须指定集合的第一个值是多少,如果是null,则是个空iterator。
   下面的例子构造了一个Iterator,返回2的n次方
   Iterator<Integer> powersOfTwo = new AbstractSequentialIterator<Integer>(1) { // note the initial value!
     protected Integer computeNext(Integer previous) {
       return (previous == 1 << 30) ? null : previous * 2;
     }
   };

JAVA集合和guava集合使用和原理解析 一:总体介绍: Java集合框架介绍 集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下。 Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口)。 其中L... 阅读详情

相关推荐

高通Camera HAL3调试实战:如何用camxoverridesettings.txt高效抓取日志与dump图像数据

本文深入探讨了高通Camera HAL3调试中camxoverridesettings.txt文件的高效应用,重点介绍了如何通过该文件精准控制日志输出级别与dump图像数据,帮助开发者快速定位移动影像系统中的问题。文章详细解析了日志分级配置、图像数据捕获技巧及典型问题排查流程,为高通Camera HAL3项目开发提供了实用技术点。

weixin_30315905的博客 863

Java常用开源库梳理(1)

Java集合数据结构 1. List: 线程不安全:ArrayList, LinkedList, BitSet 线程安全:Vector, CopyOnWriteArrayList (1)ArrayList:使用数组实现的List,相当于动态数组,读取速度快,插入与删除速度慢(因为插入与删除时要移动后面的元素),保持插入顺序,适合于随机访问。允许重复元素,包括null。 (2)Linke...

Jack Zhou的专栏 2442

python等级考试——一级知识点汇总(不包含turtle画图)

本篇文章是针对中国电子学会青少年编程等级考试的,适合初学者以及青少年编程学习者

weixin_65350557的博客 9033

[Guava]——BiMap

public class demo7 {//hashmap,键唯一,值可以重复,BiMap:双向Map(Bidrectional Map)键与值都不能重 public static void main(String[] args) { BiMap biMap=HashBiMap.create(); biMap.put("abcd", "abcdm@qq.com"); biMap.pu

年轻正好 588

计算机视觉-深度学习图像检测方法梳理

计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目

qq_41662991的博客 9953

ISO 26262中的失效率计算:Mission profile的使用

Mission profile:任务剖面,即产品在完成规定任务这段时间内所经历的时间和环境的时序描述;集成电路在工作时环境温度是在不停变化的,同时也存在运行状态和非运行状态;为此标准提出了根据任务剖面(Mission profile)以及集成电路的实际结温来评估热幅度变化、循环温度幅值等因素的影响;汽车电子元器件相关的Mission profile参考IEC TR 62380:Table 11。

weixin_47071127的博客 4816

Guava学习之Collections ——Collection Utilities

Collection Utilities 有经验的程序员在使用JDK Collections框架时都喜欢使用 java.util.Collections 的工具类。Guava 沿用这条线提供了更多的实用工具:适用于所有集合的静态方法。这部分是Guava中最受欢迎也是最成熟的部分。 对应于特定接口的方法以相对直观的方式分组: Interface JDK or Guava? Corr...

yshuoo的博客 1177

【单点登录】SSO单点登录sa-token接入流程详解

Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。Sa-Token 目前主要五大功能模块:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。

Hello, New World! 1793

Guava库学习:学习Collections(四)Maps

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34240657的博客 980

第5.2章 【自动驾驶行业融合定位核心】:手把手详解ESKF(误差卡尔曼滤波)理论公式及代码

自动驾驶定位中的ESKF(误差卡尔曼滤波)技术是解决IMU累积误差的关键,通过分离名义状态与误差状态实现高精度定位。其核心步骤包括:1)名义状态递推(位置/速度/姿态的基础物理计算);2)误差传播建模(雅可比矩阵F量化误差影响);3)协方差更新(评估定位不确定性)。ESKF在GNSS信号丢失(如隧道场景)、无卫星定位(地下车库)等场景发挥重要作用,通过融合多传感器数据维持定位精度。工程实现需解决零偏校准、协方差投影等关键问题,噪声参数需通过数据标定而非随意设置。掌握ESKF原理与实现是自动驾驶定位工程师的核

行知SLAM 705

自动化测试与AI的结合应用

自动化测试,人工智能,机器学习,深度学习,测试用例生成,缺陷预测,测试优化 1. 背景介绍 在软件开发领域,自动化测试已成为不可或缺的一部分,它可以提高测试效率、降低测试成本,并确保软件质量。然而,传统的自动化测试方法往往依赖于人工编写的测试用例,这不仅耗时费力,而且难以应对复杂软件

AI架构师小马 2248

关于Map线程安全的几种实现方案

如果使Map线程安全,有四种方法: 1.使用synchronized关键字; synchronized(anObject){ value = map.get(key); } 2.使用JDK提供的锁,java.util.concurrent.locks.Lock; lock.lock(); value = map.get(key); lock.unlock(): 3

Wanted_Tao的博客 9246

金融机构和贷款产品数据抓取:使用Python爬虫技术获取金融机构的贷款产品信息与条件

本文介绍了如何使用Python爬虫技术抓取金融机构的贷款产品信息,包括静态网页抓取和动态网页抓取两种方法。通过requestsSelenium等工具,我们能够轻松抓取银行和消费金融平台上的贷款信息,并存储和分析数据。随着技术的发展,我们还可以扩展爬虫功能,抓取更多的金融机构网站,或者结合自然语言处理技术对贷款产品的评论进行情感分析,为用户提供更多维度的贷款决策支持。

2201_76125261的博客 1734

Guava学习笔记 2. 集合 [Collections]

Guava 对 JDK 集合的扩展,这是 Guava 最成熟和为人所知的部分 本文主要通过例子的方式简单介绍了一下集合的使用以及需要注意的一些细节。 如果希望了解更多的细节,可以可以查看目录中的链接进行查看。 — By Syahfozy 1 不可变集合: 用不变的集合进行防御性编程和性能提升。 2 新集合类型: multisets, multimaps, tables, bidirectional maps 等 3 强大的集合工具类: 提供 java.util.Collections 中没有的集合工具

syahfozy的博客 649

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Google Guava API学习笔记(2):集合

[b][size=x-large]不可变集合 Immutable Collections[/size][/b] [b][size=large]例子[/size][/b] [code="java"]public static final ImmutableSet COLOR_NAMES = ImmutableSet.of( "red", "orange", "yello...

stamen的程序员之路 159

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Guava学习笔记(2) --- Guava的不可变集合

/** * Guava的不可变集合用法 * * 创建对象的不可变集合是一种很好的防御性编程技巧; * Guava为所有JDK标准集合类型和Guava集合类型都提供了简单易用的不可变版本; * * 1、不可变集合的优点: * (1)当对象被不可信的库调用时,不可变形式是安全的; * (2)不可变对象被多个线程调用时,不存在竞态条件问题; * (3)不可变集合不需要考虑变...

小道的博客 273

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Guava中关于字符串处理以及加强版集合的使用记录(个人学习笔记)

Guava中关于字符串的处理 Strings工具类的使用 // 获取共同的前缀 String commonPrefix = Strings.commonPrefix(&quot;fenglang&quot;, &quot;fengyue&quot;); System.out.println(commonPrefix); // 获取共同的后缀 String commonSuffix = Strings.commonSuffi...

冯朗的博客 3150

Guava的基础功能与集合

Guava中的基础功能和集合

hefrankeleyn的博客 9039

Guava系列之新的集合类型

Guava中新增加了一些集合类型,是对JDK集合类型的补充,使开发者更方便使用集合类型来实现业务功能 Multiset 首先我们来看一下日常研发中常用到的一个场景,统计一个list中每个元素出现的次数,我们大概会这样写: List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("b"); list.add("b.

果子爸聊技术 3953

【Guava】集合工具类-Immutable&Lists&Maps&Sets

如《Effective Java》Item1)所述,在设计类的时候,倾向优先使用静态工厂方法(static factory method)而非构造函数(constructor)创建对象,优点在于:同样,如《Effective Java》Item17所述,需要最小化可变性,遵循了最佳实践。首先,不可以通过构造函数实例化,更准确地说,不可以在外部通过构造函数实例化。而在程序设计中使用不可变对象,也可以提高代码的可靠性和可维护性,其优势包括:创建对象的不可变拷贝是一项很好的防御性编程技巧。Guava为所有JDK标

SevenCoding的博客 1260

Guava的Collections2:过滤和转换Java集合

Groovy的便利之一是能够通过Groovy的闭包支持轻松地对集合执行过滤和转换操作。 Guava将对集合的过滤和转换引入标准Java,这是本文的主题。 Guava的Collections2类具有两个公共方法,这两个方法都是静态的。 方法filter(Collection,Predicate)和transform(Collection,Function)的作用含义是:分别对给定的集合执行...

最佳 Java 编程 1329

掌握Guava集合工具:简化复杂集合操作,让代码更优雅

无论你是初级开发者还是经验丰富的Java工程师,掌握Guava类库的集合工具将成为你代码中的一把利剑。在这篇技术文章中,我们将深入探索Guava集合工具的使用方法、独特特点以及广泛的应用场景。通过学习如何优雅地处理Java集合,你将能够提升代码的可读性、简化复杂的集合操作,并在性能方面获得巨大的提升。无论你是想要解决数据结构问题,还是寻求更高效的代码实现方式,本文都将为你提供宝贵的指导和实用技巧。不容错过的一篇文章,让我们一起探索Guava集合工具的奇妙世界!

凡夫编程 1754

guava 集合转换_Guava的Collections2:过滤和转换Java集合

guava 集合转换 Groovy的便利之一是能够通过Groovy的闭包支持轻松地对集合执行过滤和转换操作。 Guava将对集合的过滤和转换引入标准Java,这是本文的主题。 Guava的Collections2类具有两个公共方法,这两个方法都是静态的。 方法filter(Collection,Predicate)和transform(Collection,Function)的功能含义是:...

最佳 Java 编程 967

Guava--集合

文章目录1.不可变集合2.Guava集合2.1 Multiset2.2 Multimap2.3 BiMap2.4 Table2.5 RangeSet2.6 RangeMap 1.不可变集合  Guava为所有JDK标准集合类型和Guava新集合类型都提供了简单易用的不可变版本 优点: 当对象被不可信的库调用时,不可变形式是安全的; 不可变对象被多个线程调用时,不存在竞态条件问题 不可变集合不需要考虑变化,因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率(分析和测试细节); 不可

一个巨大的博客 1615

Google Guava 集合工具使用详解

集合分类 Multiset HashMultiset TreeMultiset LinkedHashMultiset Multimap ArrayListMultimap HashMultimap LinkedListMultimap LinkedHashMultimap TreeMultimap BiMap HashBiMap Table HashBasedTable TreeBasedTable ArrayTable RangeSet TreeRangeSet RangeMap TreeRangeMap

骑个小蜗牛的博客 5798
上一篇: java强引用,软引用,弱引用,虚引用
下一篇: guava笔记3-cache
leadtoit
博客等级 码龄17年 2粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值