C++ 喜欢 Java 中的 Map?

Wal*_*iul -3 java

有没有办法像C++一样访问Java地图?

在 C++ 中,以下代码片段有效:

map<string, int> myMap;
string str = "okay";
myMap[str] = 69;
myMap[str]++;
cout<<myMap[str]<<endl;
Run Code Online (Sandbox Code Playgroud)

上面的代码完美运行并在控制台中显示 70。

Java中有类似的东西吗?

Joa*_*uer 6

是和否。

是的,显然您可以在 Java 代码中获得类似的结果。

不,因为您使用的许多概念并不像那样存在,因此 Java 代码看起来会大不相同。

基本示例

在微不足道的层面上,相当于map<string,int>Map<String, Integer>。请注意,int不能在这里使用,因为 Java 泛型不支持原始类型作为类型参数,因此您需要使用包装器。在代码中,由于自动装箱,这种差异几乎是不可见的。

但是Map是一个接口,因此您需要指定要使用的实现。HashMap是默认选择,如果您没有特定要求。

Map<String, Integer> myMap = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

Java 没有(自定义)运算符重载,因此您需要调用.put()以向地图添加值:

String str = "okay";
myMap.put(str, 69); // nice
Run Code Online (Sandbox Code Playgroud)

并且由于同样的问题并且由于Integer对象是不可变的,以下行在 Java 中看起来有点难看:

myMap.put(str, myMap.get(str) + 1);
Run Code Online (Sandbox Code Playgroud)

打印就是这样:

System.out.println(myMap.get(str));
Run Code Online (Sandbox Code Playgroud)

备选方案 1:使用 compute

一种替代方法(即我个人觉得大材小用)是使用compute方法和lambda表达式这样的(有也computeIfPresentcomputeIfAbsent与obviuos限制):

myMap.compute(str, (k, v) -> v+1);
Run Code Online (Sandbox Code Playgroud)

备选方案 2:使用AtomicInteger(或int[]) 代替Integer

另一种选择是使用类似的东西AtomicInteger作为你的价值。在这种情况下,您不会真正关心AtomicInteger具有原子操作的事实,而是Integer在某种程度上将其用作“可变”。

Map<String, AtomicInteger> myMap = new HashMap<>();
String str = "okay";
myMap.put(str, new AtomicInteger(69));
myMap.get(str).incrementAndGet();
Run Code Online (Sandbox Code Playgroud)

由于AtomicInteger是可变的,您不必更改映射来更改它指向的值。有些人使用单元素数组(如new int[1])来获得类似的效果。我认为这两种用法都有点hacky,个人更喜欢更明确的AtomicInteger

Map<String, int[]> myMap = new HashMap<>();
String str = "okay";
myMap.put(str, new int[] { 69 });
myMap.get(str)[0]++;
Run Code Online (Sandbox Code Playgroud)