Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
醒狮指南
JavaGuide
提交
f0b404a8
J
JavaGuide
项目概览
醒狮指南
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
1
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,发现更多精彩内容 >>
提交
f0b404a8
编写于
7月 14, 2019
作者:
S
SnailClimb
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add 基本数据类型与包装数据类型的使用标准
上级
0cef545a
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
97 addition
and
26 deletion
+97
-26
docs/java/Java疑难点.md
docs/java/Java疑难点.md
+97
-26
未找到文件。
docs/java/Java疑难点.md
浏览文件 @
f0b404a8
<!-- TOC -->
-
[
Arrays.asList()使用指南
](
#arraysaslist使用指南
)
-
[
简介
](
#简介
)
-
[
《阿里巴巴Java 开发手册》对其的描述
](
#阿里巴巴java-开发手册对其的描述
)
-
[
使用时的注意事项总结
](
#使用时的注意事项总结
)
-
[
如何正确的将数组转换为ArrayList?
](
#如何正确的将数组转换为arraylist
)
-
[
`Collection.toArray()`方法使用的坑&如何反转数组
](
#collectiontoarray方法使用的坑如何反转数组
)
-
[
1. 基础
](
#1-基础
)
-
[
1.1. 正确使用 equals 方法
](
#11-正确使用-equals-方法
)
-
[
1.2. 整形包装类值的比较
](
#12-整形包装类值的比较
)
-
[
1.3. BigDecimal
](
#13-bigdecimal
)
-
[
1.3.1. BigDecimal 的用处
](
#131-bigdecimal-的用处
)
-
[
1.3.2. BigDecimal 的大小比较
](
#132-bigdecimal-的大小比较
)
-
[
1.3.3. BigDecimal 保留几位小数
](
#133-bigdecimal-保留几位小数
)
-
[
1.3.4. BigDecimal 的使用注意事项
](
#134-bigdecimal-的使用注意事项
)
-
[
1.3.5. 总结
](
#135-总结
)
-
[
1.4. 基本数据类型与包装数据类型的使用标准
](
#14-基本数据类型与包装数据类型的使用标准
)
-
[
2. 集合
](
#2-集合
)
-
[
2.1. Arrays.asList()使用指南
](
#21-arraysaslist使用指南
)
-
[
2.1.1. 简介
](
#211-简介
)
-
[
2.1.2. 《阿里巴巴Java 开发手册》对其的描述
](
#212-阿里巴巴java-开发手册对其的描述
)
-
[
2.1.3. 使用时的注意事项总结
](
#213-使用时的注意事项总结
)
-
[
2.1.4. 如何正确的将数组转换为ArrayList?
](
#214-如何正确的将数组转换为arraylist
)
-
[
2.2. Collection.toArray()方法使用的坑&如何反转数组
](
#22-collectiontoarray方法使用的坑如何反转数组
)
-
[
2.3. 不要在 foreach 循环里进行元素的 remove/add 操作
](
#23-不要在-foreach-循环里进行元素的-removeadd-操作
)
<!-- /TOC -->
# 基础
#
1.
基础
## 整形包装类值的比较
## 1.1. 正确使用 equals 方法
Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。
举个例子:
```
java
// 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常
String
str
=
null
;
if
(
str
.
equals
(
"SnailClimb"
))
{
...
}
else
{
..
}
```
运行上面的程序会抛出空指针异常,但是我们把第二行的条件判断语句改为下面这样的话,就不会抛出空指针异常,else 语句块得到执行。:
```
java
"SnailClimb"
.
equals
(
str
);
// false
```
不过更推荐使用
`java.util.Objects#equals`
(JDK7 引入的工具类)。
```
java
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
));
}
```
**注意:**
Reference:
[
Java中equals方法造成空指针异常的原因及解决方案
](
https://blog.csdn.net/tick_tock97/article/details/72824894
)
-
每种原始类型都有默认值一样,如int默认值为0,boolean的默认值为false,null是任何引用类型的默认值,不严格的说是所有object类型的默认值。
-
可以使用==或者!=操作来比较null值,但是不能使用其他算法或者逻辑操作。在Java中
`null==null`
将返回true。
-
不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常
## 1.2. 整形包装类值的比较
所有整形包装类对象值得比较必须使用equals方法。
...
...
@@ -29,13 +83,11 @@ System.out.println(a.equals(b));//false
当使用自动装箱方式创建一个Integer对象时,当数值在-128 ~127时,会将创建的Integer对象缓存起来,当下次再出现该数值时,直接从缓存中取出对应的Integer对象。所以上述代码中,x和y引用的是相同的Integer对象。
注意:如果你的IDE(IDEA/Eclipse)上安装了阿里巴巴的p3c插件,这个插件如果检测到你用 ==的话会报错提示,推荐安装一个这个插件,很不错。
**注意:**
如果你的IDE(IDEA/Eclipse)上安装了阿里巴巴的p3c插件,这个插件如果检测到你用 ==的话会报错提示,推荐安装一个这个插件,很不错。
## BigDecimal
##
1.3.
BigDecimal
### BigDecimal 的用处
###
1.3.1.
BigDecimal 的用处
《阿里巴巴Java开发手册》中提到:
**浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals 来判断。**
具体原理和浮点数的编码方式有关,这里就不多提了,我们下面直接上实例:
...
...
@@ -57,7 +109,7 @@ BigDecimal y = b.subtract(c);// 0.1
System
.
out
.
println
(
x
.
equals
(
y
));
// true
```
### BigDecimal 的大小比较
###
1.3.2.
BigDecimal 的大小比较
`a.compareTo(b)`
: 返回 -1 表示小于,0 表示 等于, 1表示 大于。
...
...
@@ -66,7 +118,7 @@ BigDecimal a = new BigDecimal("1.0");
BigDecimal
b
=
new
BigDecimal
(
"0.9"
);
System
.
out
.
println
(
a
.
compareTo
(
b
));
// 1
```
### BigDecimal 保留几位小数
###
1.3.3.
BigDecimal 保留几位小数
通过
`setScale`
方法设置保留几位小数以及保留规则。保留规则有挺多种,不需要记,IDEA会提示。
...
...
@@ -76,25 +128,44 @@ BigDecimal n = m.setScale(3,BigDecimal.ROUND_HALF_DOWN);
System
.
out
.
println
(
n
);
// 1.255
```
### BigDecimal 的使用注意事项
###
1.3.4.
BigDecimal 的使用注意事项
注意:我们在使用BigDecimal时,为了防止精度丢失,推荐使用它的
**BigDecimal(String)**
构造方法来创建对象。《阿里巴巴Java开发手册》对这部分内容也有提到如下图所示。
注意:我们在使用BigDecimal时,为了防止精度丢失,推荐使用它的
**BigDecimal(String)**
构造方法来创建对象。《阿里巴巴Java开发手册》对这部分内容也有提到如下图所示。
![
《阿里巴巴Java开发手册》对这部分BigDecimal的描述
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019/7/BigDecimal.png
)
### 总结
###
1.3.5.
总结
BigDecimal 主要用来操作(大)浮点数,BigInteger 主要用来操作大整数(超过 long 类型)。
BigDecimal 的实现利用到了 BigInteger, 所不同的是 BigDecimal 加入了小数位的概念
# 集合
## 1.4. 基本数据类型与包装数据类型的使用标准
Reference:《阿里巴巴Java开发手册》
-
【强制】所有的 POJO 类属性必须使用包装数据类型。
-
【强制】RPC 方法的返回值和参数必须使用包装数据类型。
-
【推荐】所有的局部变量使用基本数据类型。
比如我们如果自定义了一个Student类,其中有一个属性是成绩score,如果用Integer而不用int定义,一次考试,学生可能没考,值是null,也可能考了,但考了0分,值是0,这两个表达的状态明显不一样.
**说明**
:POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 NPE 问题,或
者入库检查,都由使用者来保证。
**正例**
: 数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。
**反例**
: 比如显示成交总额涨跌情况,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调用不成功时,
返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线。所以包装数据类型的 null 值,能
够表示额外的信息,如:远程调用失败,异常退出。
# 2. 集合
## Arrays.asList()使用指南
##
2.1.
Arrays.asList()使用指南
最近使用
`Arrays.asList()`
遇到了一些坑,然后在网上看到这篇文章:
[
Java Array to List Examples
](
http://javadevnotes.com/java-array-to-list-examples
)
感觉挺不错的,但是还是特别全面。所以,自己对于这块小知识点进行了简单的总结。
### 简介
###
2.1.1.
简介
`Arrays.asList()`
在平时开发中还是比较常见的,我们可以使用它将一个数组转换为一个List集合。
...
...
@@ -116,13 +187,13 @@ public static <T> List<T> asList(T... a) {
}
```
### 《阿里巴巴Java 开发手册》对其的描述
###
2.1.2.
《阿里巴巴Java 开发手册》对其的描述
`Arrays.asList()`
将数组转换为集合后,底层其实还是数组,《阿里巴巴Java 开发手册》对于这个方法有如下描述:
![
阿里巴巴Java开发手-Arrays.asList()方法
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/阿里巴巴Java开发手-Arrays.asList(
)
方法.png)
### 使用时的注意事项总结
###
2.1.3.
使用时的注意事项总结
**传递的数组必须是对象数组,而不是基本类型。**
...
...
@@ -214,7 +285,7 @@ public E remove(int index) {
}
```
### 如何正确的将数组转换为ArrayList?
###
2.1.4.
如何正确的将数组转换为ArrayList?
stackoverflow:https://dwz.cn/vcBkTiTW
...
...
@@ -276,7 +347,7 @@ List<String> list = new ArrayList<String>();
CollectionUtils
.
addAll
(
list
,
str
);
```
## Collection.toArray()方法使用的坑&如何反转数组
##
2.2.
Collection.toArray()方法使用的坑&如何反转数组
该方法是一个泛型方法:
`<T> T[] toArray(T[] a);`
如果
`toArray`
方法中没有传递任何参数的话返回的是
`Object`
类型数组。
...
...
@@ -291,7 +362,7 @@ s=list.toArray(new String[0]);//没有指定类型的话会报错
由于JVM优化,
`new String[0]`
作为
`Collection.toArray()`
方法的参数现在使用更好,
`new String[0]`
就是起一个模板的作用,指定了返回数组的类型,0是为了节省空间,因为它只是为了说明返回的类型。详见:
<https://shipilev.net/blog/2016/arrays-wisdom-ancients/>
## 不要在 foreach 循环里进行元素的 remove/add 操作
##
2.3.
不要在 foreach 循环里进行元素的 remove/add 操作
如果要进行
`remove`
操作,可以调用迭代器的
`remove `
方法而不是集合类的 remove 方法。因为如果列表在任何时间从结构上修改创建迭代器之后,以任何方式除非通过迭代器自身
`remove/add`
方法,迭代器都将抛出一个
`ConcurrentModificationException`
,这就是单线程状态下产生的
**fail-fast 机制**
。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录