Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
么么么么木木木
JavaGuide
提交
4b93fb17
J
JavaGuide
项目概览
么么么么木木木
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
4b93fb17
编写于
9月 09, 2020
作者:
ishellhub
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
* Fixed typo
* Add features
上级
814bda6b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
37 addition
and
14 deletion
+37
-14
docs/java/Java疑难点.md
docs/java/Java疑难点.md
+37
-14
未找到文件。
docs/java/Java疑难点.md
浏览文件 @
4b93fb17
...
...
@@ -52,9 +52,9 @@ Objects.equals(null,"SnailClimb");// false
我们看一下
`java.util.Objects#equals`
的源码就知道原因了。
```
java
public
static
boolean
equals
(
Object
a
,
Object
b
)
{
// 可以避免空指针异常。如果a==null的话此时a.equals(b)就不会得到执行,避免出现空指针异常。
return
(
a
==
b
)
||
(
a
!=
null
&&
a
.
equals
(
b
));
}
// 可以避免空指针异常。如果a==null的话此时a.equals(b)就不会得到执行,避免出现空指针异常。
return
(
a
==
b
)
||
(
a
!=
null
&&
a
.
equals
(
b
));
}
```
**注意:**
...
...
@@ -104,14 +104,18 @@ System.out.println(a == b);// false
BigDecimal
a
=
new
BigDecimal
(
"1.0"
);
BigDecimal
b
=
new
BigDecimal
(
"0.9"
);
BigDecimal
c
=
new
BigDecimal
(
"0.8"
);
BigDecimal
x
=
a
.
subtract
(
b
);
// 0.1
BigDecimal
y
=
b
.
subtract
(
c
);
// 0.1
System
.
out
.
println
(
x
.
equals
(
y
));
// true
BigDecimal
x
=
a
.
subtract
(
b
);
BigDecimal
y
=
b
.
subtract
(
c
);
System
.
out
.
println
(
x
);
/* 0.1 */
System
.
out
.
println
(
y
);
/* 0.1 */
System
.
out
.
println
(
Objects
.
equals
(
x
,
y
));
/* true */
```
### 1.3.2. BigDecimal 的大小比较
`a.compareTo(b)`
: 返回 -1 表示
小于,0 表示 等于, 1表示 大于
。
`a.compareTo(b)`
: 返回 -1 表示
`a`
小于
`b`
,0 表示
`a`
等于
`b`
, 1表示
`a`
大于
`b`
。
```
java
BigDecimal
a
=
new
BigDecimal
(
"1.0"
);
...
...
@@ -167,7 +171,7 @@ Reference:《阿里巴巴Java开发手册》
`Arrays.asList()`
在平时开发中还是比较常见的,我们可以使用它将一个数组转换为一个List集合。
```
java
String
[]
myArray
=
{
"Apple"
,
"Banana"
,
"Orange"
}
;
String
[]
myArray
=
{
"Apple"
,
"Banana"
,
"Orange"
};
List
<
String
>
myList
=
Arrays
.
asList
(
myArray
);
//上面两个语句等价于下面一条语句
List
<
String
>
myList
=
Arrays
.
asList
(
"Apple"
,
"Banana"
,
"Orange"
);
...
...
@@ -177,8 +181,9 @@ JDK 源码对于这个方法的说明:
```
java
/**
*返回由指定数组支持的固定大小的列表。此方法作为基于数组和基于集合的API之间的桥梁,与 Collection.toArray()结合使用。返回的List是可序列化并实现RandomAccess接口。
*/
*返回由指定数组支持的固定大小的列表。此方法作为基于数组和基于集合的API之间的桥梁,
* 与 Collection.toArray()结合使用。返回的List是可序列化并实现RandomAccess接口。
*/
public
static
<
T
>
List
<
T
>
asList
(
T
...
a
)
{
return
new
ArrayList
<>(
a
);
}
...
...
@@ -197,12 +202,12 @@ public static <T> List<T> asList(T... a) {
`Arrays.asList()`
是泛型方法,传入的对象必须是对象数组。
```
java
int
[]
myArray
=
{
1
,
2
,
3
};
int
[]
myArray
=
{
1
,
2
,
3
};
List
myList
=
Arrays
.
asList
(
myArray
);
System
.
out
.
println
(
myList
.
size
());
//1
System
.
out
.
println
(
myList
.
get
(
0
));
//数组地址值
System
.
out
.
println
(
myList
.
get
(
1
));
//报错:ArrayIndexOutOfBoundsException
int
[]
array
=
(
int
[])
myList
.
get
(
0
);
int
[]
array
=
(
int
[])
myList
.
get
(
0
);
System
.
out
.
println
(
array
[
0
]);
//1
```
当传入一个原生数据类型数组时,
`Arrays.asList()`
的真正得到的参数就不是数组中的元素,而是数组对象本身!此时List 的唯一元素就是这个数组,这也就解释了上面的代码。
...
...
@@ -210,7 +215,7 @@ System.out.println(array[0]);//1
我们使用包装类型数组就可以解决这个问题。
```
java
Integer
[]
myArray
=
{
1
,
2
,
3
};
Integer
[]
myArray
=
{
1
,
2
,
3
};
```
**使用集合的修改方法:`add()`、`remove()`、`clear()`会抛出异常。**
...
...
@@ -296,7 +301,7 @@ static <T> List<T> arrayToList(final T[] array) {
for
(
final
T
s
:
array
)
{
l
.
add
(
s
);
}
return
(
l
)
;
return
l
;
}
```
...
...
@@ -344,6 +349,14 @@ List<String> list = new ArrayList<String>();
CollectionUtils
.
addAll
(
list
,
str
);
```
**6. 使用 Java9 的 `List.of()`方法**
```
java
Integer
[]
array
=
{
1
,
2
,
3
};
List
<
Integer
>
list
=
List
.
of
(
array
);
System
.
out
.
println
(
list
);
/* [1, 2, 3] */
/* 不支持基本数据类型 */
```
## 2.2. Collection.toArray()方法使用的坑&如何反转数组
该方法是一个泛型方法:
`<T> T[] toArray(T[] a);`
如果
`toArray`
方法中没有传递任何参数的话返回的是
`Object`
类型数组。
...
...
@@ -365,6 +378,16 @@ s=list.toArray(new String[0]);//没有指定类型的话会报错
> **fail-fast 机制** :多个线程对 fail-fast 集合进行修改的时,可能会抛出ConcurrentModificationException,单线程下也会出现这种情况,上面已经提到过。
Java8开始,可以使用
`Collection#removeIf()`
方法删除满足特定条件的元素,如
```
java
List
<
Integer
>
list
=
new
ArrayList
<>();
for
(
int
i
=
1
;
i
<=
10
;
++
i
)
{
list
.
add
(
i
);
}
list
.
removeIf
(
filter
->
filter
%
2
==
0
);
/* 删除list中的所有偶数 */
System
.
out
.
println
(
list
);
/* [1, 3, 5, 7, 9] */
```
`java.util`
包下面的所有的集合类都是fail-fast的,而
`java.util.concurrent`
包下面的所有的类都是fail-safe的。
![
不要在 foreach 循环里进行元素的 remove/add 操作
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019/7/foreach-remove:add.png
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录