简介
Guava 是一组来自 Google 的核心 Java 库,其中包括新的集合类型(例如 multimap 和 multiset)、不可变集合、图形库以及用于并发、I/O、散列、缓存、原语、字符串等的实用程序!它广泛用于 Google 内部的大多数 Java 项目,也被许多其他公司广泛使用。
- 需要 JDK 1.8 或更高版本。
Maven依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
常用工具类
🦆Multimap和Multiset
Multimap是一个可以添加重复key的新集合类型,类似于Map<String,List<String>>的结构。
//创建multimap Multimap<String, String> multimap = HashMultimap.create(); //放入小黄鸭 multimap.put("duck","yellow"); //放下乌鸭 multimap.put("duck","black"); //取出🦆 Collection<String> duck = multimap.get("duck"); System.out.println(duck);//[yellow, black] //取个🐕 Collection<String> dog = multimap.get("dog"); //如果尝试取出不存在的key 则会返回一个空集合而不是null System.out.println(dog);//[]
Multiset是一个可以方便的统计集合中重复元素出现的次数的新集合类型。
//创建Multiset Multiset<String> multiset = HashMultiset.create(); //放入🦆 multiset.add("duck"); //再放一个🦆 multiset.add("duck"); //放一个🐕 multiset.add("dog"); //看下🦆数量 int duckCount = multiset.count("duck"); System.out.println(duckCount);//2 //看下🦆和🐕的数量 int allCount = multiset.size(); System.out.println(allCount);//3
🦆Table
Table是一种特殊的键值对的结构集合,类似于Map<String,Map<String,String>>的结构,Table<R,C,V> = Map<R,Map<C,V>>。
//创建table表 Table<String,String,String> table = HashBasedTable.create(); //添加🦆 table.put("duck","yellow","small"); table.put("duck","black","big"); //添加🐕 table.put("dog","black","small"); table.put("dog","pink","big"); //所有数据 System.out.println(table.cellSet());//[(duck,yellow)=small, (duck,black)=big, (dog,black)=small, (dog,yellow)=big] //所有动物 System.out.println(table.rowKeySet());//[duck, dog] //所有颜色 System.out.println(table.columnKeySet());//[yellow, black, pink] //查看🦆的所有属性 Map<String, String> duck = table.row("duck"); //取出粉红色的🐕的大小 System.out.println(table.get("dog","pink"));//big
🦆BiMap
BiMap可以理解为是一种双向的键值对映射,既可以通过key获取value的值,也可以通过value反向获取key的值。
//创建BiMap BiMap<String,String> duckMap = HashBiMap.create(); //放入🦆的英文和中文 duckMap.put("duck","鸭子"); //根据中文取出英文 String duckEn = duckMap.inverse().get("鸭子"); //根据英文取出中文 String duckCn = duckMap.get("duck"); System.out.println(duckEn);//duck System.out.println(duckCn);//鸭子
🦆Immutable Collections(不可变集合)
优点:
- 当被第三方调用时,不可变集合是安全的
- 不可变集合节省内存,不用考虑扩容,因此可以节省时间和空间,内存利用率高。
- 不可变集合被多线程调用时,不存在竞争。
- 可以当作常量使用
//copyOf形式创建 黄🦆 黑🦆 粉红🦆 ImmutableSet<String> duckList = ImmutableSet.of("yellow duck", "black duck", "pink duck"); //Builder方式创建 ImmutableSet<String> duckList = ImmutableSet.<String>builder() .add("yellow duck") .add("black duck") .add("pink duck") .build();
🦆Joiner和Splitter
Joiner是字符串连接器。
//把集合里添加🦆,🐕,🐱并且以 | 连接 List<String> list = Arrays.asList("duck","dog","cat"); String res = Joiner.on("|").join(list); System.out.println(res);//duck|dog|cat //添加一个空对象 List<String> list1 = Arrays.asList("duck","dog",null,"cat"); //忽略集合中的null String skipNullStr = Joiner.on("|").skipNulls().join(list1); System.out.println(skipNullStr);//duck|dog|cat //把集合里的空对象换成一只🐖 String useNullStr = Joiner.on("|").useForNull("pig").join(list1); System.out.println(useNullStr);//duck|dog|pig|cat
Splitter是字符串分割器。
//利用Splitter把🦆|🐕|🐱分割开来 List<String> list = Splitter.on("|").splitToList("duck|dog|cat"); System.out.println(list);//[duck, dog, cat] //按照固定长度拆分 List<String> list1 = Splitter.fixedLength(4).splitToList("duckdog1cat1"); System.out.println(list1);//[duck, dog1, cat1]
🦆Lists和Sets
Lists.partion集合分割方法
//创建一个🦆🐱🐕🐖乐园 List<String> list = new ArrayList<>(); list.add("duck"); list.add("cat"); list.add("dog"); list.add("pig"); //分割成两份 List<List<String>> partition = Lists.partition(list, 2); System.out.println(partition);//[[duck, cat], [dog, pig]]
Sets.intersection()交集
Sets.difference()差集
Sets.union()并集
//创建两个Sets集合 //农场:🦆 🐕 🐱 Set<String> sets = Sets.newHashSet("duck", "dog", "cat"); //农场:🦆 🐕 🐖 Set<String> sets2 = Sets.newHashSet("duck", "dog","pig"); // 交集 Sets.SetView<String> intersection = Sets.intersection(sets, sets2); System.out.println(intersection);//[dog, duck]🐕🦆 // 差集 Sets.SetView<String> diff = Sets.difference(sets, sets2); Sets.SetView<String> diff1 = Sets.difference(sets2, sets); System.out.println(diff);//[cat]🐱 System.out.println(diff1);//[pig]🐖 // 并集 Sets.SetView<String> union = Sets.union(sets, sets2); System.out.println(union);//[dog, duck, cat, pig]🐕🦆🐱🐖