@@ -52,9 +52,9 @@ Objects.equals(null,"SnailClimb");// false
52
52
我们看一下` java.util.Objects#equals ` 的源码就知道原因了。
53
53
``` java
54
54
public static boolean equals(Object a, Object b) {
55
- // 可以避免空指针异常。如果a==null的话此时a.equals(b)就不会得到执行,避免出现空指针异常。
56
- return (a == b) || (a != null && a. equals(b));
57
- }
55
+ // 可以避免空指针异常。如果a==null的话此时a.equals(b)就不会得到执行,避免出现空指针异常。
56
+ return (a == b) || (a != null && a. equals(b));
57
+ }
58
58
```
59
59
60
60
** 注意:**
@@ -104,14 +104,18 @@ System.out.println(a == b);// false
104
104
BigDecimal a = new BigDecimal (" 1.0" );
105
105
BigDecimal b = new BigDecimal (" 0.9" );
106
106
BigDecimal c = new BigDecimal (" 0.8" );
107
- BigDecimal x = a. subtract(b);// 0.1
108
- BigDecimal y = b. subtract(c);// 0.1
109
- System . out. println(x. equals(y));// true
107
+
108
+ BigDecimal x = a. subtract(b);
109
+ BigDecimal y = b. subtract(c);
110
+
111
+ System . out. println(x); /* 0.1 */
112
+ System . out. println(y); /* 0.1 */
113
+ System . out. println(Objects . equals(x, y)); /* true */
110
114
```
111
115
112
116
### 1.3.2. BigDecimal 的大小比较
113
117
114
- ` a.compareTo(b) ` : 返回 -1 表示小于 ,0 表示 等于 , 1表示 大于 。
118
+ ` a.compareTo(b) ` : 返回 -1 表示 ` a ` 小于 ` b ` ,0 表示 ` a ` 等于 ` b ` , 1表示 ` a ` 大于 ` b ` 。
115
119
116
120
``` java
117
121
BigDecimal a = new BigDecimal (" 1.0" );
@@ -167,7 +171,7 @@ Reference:《阿里巴巴Java开发手册》
167
171
` Arrays.asList() ` 在平时开发中还是比较常见的,我们可以使用它将一个数组转换为一个List集合。
168
172
169
173
``` java
170
- String [] myArray = { " Apple" , " Banana" , " Orange" };
174
+ String [] myArray = {" Apple" , " Banana" , " Orange" };
171
175
List<String > myList = Arrays . asList(myArray);
172
176
// 上面两个语句等价于下面一条语句
173
177
List<String > myList = Arrays . asList(" Apple" ," Banana" , " Orange" );
@@ -177,8 +181,9 @@ JDK 源码对于这个方法的说明:
177
181
178
182
``` java
179
183
/**
180
- *返回由指定数组支持的固定大小的列表。此方法作为基于数组和基于集合的API之间的桥梁,与 Collection.toArray()结合使用。返回的List是可序列化并实现RandomAccess接口。
181
- */
184
+ *返回由指定数组支持的固定大小的列表。此方法作为基于数组和基于集合的API之间的桥梁,
185
+ * 与 Collection.toArray()结合使用。返回的List是可序列化并实现RandomAccess接口。
186
+ */
182
187
public static < T > List<T > asList(T . .. a) {
183
188
return new ArrayList<> (a);
184
189
}
@@ -197,20 +202,20 @@ public static <T> List<T> asList(T... a) {
197
202
` Arrays.asList() ` 是泛型方法,传入的对象必须是对象数组。
198
203
199
204
``` java
200
- int [] myArray = { 1 , 2 , 3 };
205
+ int [] myArray = {1 , 2 , 3 };
201
206
List myList = Arrays . asList(myArray);
202
207
System . out. println(myList. size());// 1
203
208
System . out. println(myList. get(0 ));// 数组地址值
204
209
System . out. println(myList. get(1 ));// 报错:ArrayIndexOutOfBoundsException
205
- int [] array= (int []) myList. get(0 );
210
+ int [] array = (int []) myList. get(0 );
206
211
System . out. println(array[0 ]);// 1
207
212
```
208
213
当传入一个原生数据类型数组时,` Arrays.asList() ` 的真正得到的参数就不是数组中的元素,而是数组对象本身!此时List 的唯一元素就是这个数组,这也就解释了上面的代码。
209
214
210
215
我们使用包装类型数组就可以解决这个问题。
211
216
212
217
``` java
213
- Integer [] myArray = { 1 , 2 , 3 };
218
+ Integer [] myArray = {1 , 2 , 3 };
214
219
```
215
220
216
221
** 使用集合的修改方法:` add() ` 、` remove() ` 、` clear() ` 会抛出异常。**
@@ -296,7 +301,7 @@ static <T> List<T> arrayToList(final T[] array) {
296
301
for (final T s : array) {
297
302
l. add(s);
298
303
}
299
- return (l) ;
304
+ return l ;
300
305
}
301
306
```
302
307
@@ -344,6 +349,14 @@ List<String> list = new ArrayList<String>();
344
349
CollectionUtils . addAll(list, str);
345
350
```
346
351
352
+ ** 6. 使用 Java9 的 ` List.of() ` 方法**
353
+ ``` java
354
+ Integer [] array = {1 , 2 , 3 };
355
+ List<Integer > list = List . of(array);
356
+ System . out. println(list); /* [1, 2, 3] */
357
+ /* 不支持基本数据类型 */
358
+ ```
359
+
347
360
## 2.2. Collection.toArray()方法使用的坑&如何反转数组
348
361
349
362
该方法是一个泛型方法:` <T> T[] toArray(T[] a); ` 如果` toArray ` 方法中没有传递任何参数的话返回的是` Object ` 类型数组。
@@ -365,6 +378,16 @@ s=list.toArray(new String[0]);//没有指定类型的话会报错
365
378
366
379
> ** fail-fast 机制** :多个线程对 fail-fast 集合进行修改的时,可能会抛出ConcurrentModificationException,单线程下也会出现这种情况,上面已经提到过。
367
380
381
+ Java8开始,可以使用` Collection#removeIf() ` 方法删除满足特定条件的元素,如
382
+ ``` java
383
+ List<Integer > list = new ArrayList<> ();
384
+ for (int i = 1 ; i <= 10 ; ++ i) {
385
+ list. add(i);
386
+ }
387
+ list. removeIf(filter - > filter % 2 == 0 ); /* 删除list中的所有偶数 */
388
+ System . out. println(list); /* [1, 3, 5, 7, 9] */
389
+ ```
390
+
368
391
` java.util ` 包下面的所有的集合类都是fail-fast的,而` java.util.concurrent ` 包下面的所有的类都是fail-safe的。
369
392
370
393
![ 不要在 foreach 循环里进行元素的 remove/add 操作] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019/7/foreach-remove:add.png )
0 commit comments