编码小技巧碎片
记录日常编码注意事项以及小技巧
# 1. EXCEL 中生成UUID
- Excel生成guid,uuid 格式:600d65bc-948a-1260-2217-fd8dfeebb1cd
=LOWER(CONCATENATE(DEC2HEX(RANDBETWEEN(0,POWER(16,8)),8),"-",DEC2HEX(RANDBETWEEN(0,POWER(16,4)),4),"-","4",DEC2HEX(RANDBETWEEN(0,POWER(16,3)),3),"-",DEC2HEX(RANDBETWEEN(8,11)),DEC2HEX(RANDBETWEEN(0,POWER(16,3)),3),"-",DEC2HEX(RANDBETWEEN(0,POWER(16,8)),8),DEC2HEX(RANDBETWEEN(0,POWER(16,4)),4)))
- Excel生成guid,uuid 格式:600d65bc948a12602217fd8dfeebb1cd
=LOWER(CONCATENATE(DEC2HEX(RANDBETWEEN(0,POWER(16,8)),8),"",DEC2HEX(RANDBETWEEN(0,POWER(16,4)),4),"","4",DEC2HEX(RANDBETWEEN(0,POWER(16,3)),3),"",DEC2HEX(RANDBETWEEN(8,11)),DEC2HEX(RANDBETWEEN(0,POWER(16,3)),3),"",DEC2HEX(RANDBETWEEN(0,POWER(16,8)),8),DEC2HEX(RANDBETWEEN(0,POWER(16,4)),4)))
- Excel生成guid,uuid 格式:4E3B14BB-ECF3-7B2E-A5A2-FE6E1A52DE6A
=CONCATENATE(DEC2HEX(RANDBETWEEN(0,POWER(16,8)),8),"-",DEC2HEX(RANDBETWEEN(0,POWER(16,4)),4),"-","4",DEC2HEX(RANDBETWEEN(0,POWER(16,3)),3),"-",DEC2HEX(RANDBETWEEN(8,11)),DEC2HEX(RANDBETWEEN(0,POWER(16,3)),3),"-",DEC2HEX(RANDBETWEEN(0,POWER(16,8)),8),DEC2HEX(RANDBETWEEN(0,POWER(16,4)),4))
- Excel生成guid,uuid 格式:4E3B14BBECF37B2E-A5A2FE6E1A52DE6A
=CONCATENATE(DEC2HEX(RANDBETWEEN(0,POWER(16,8)),8),"",DEC2HEX(RANDBETWEEN(0,POWER(16,4)),4),"","4",DEC2HEX(RANDBETWEEN(0,POWER(16,3)),3),"",DEC2HEX(RANDBETWEEN(8,11)),DEC2HEX(RANDBETWEEN(0,POWER(16,3)),3),"",DEC2HEX(RANDBETWEEN(0,POWER(16,8)),8),DEC2HEX(RANDBETWEEN(0,POWER(16,4)),4))
# 2. 软件版本管理
Alpha: 是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。
Beta: 也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出。
RC (Release Candidate) 顾名思义么 ! 用在软件上就是候选版本。系统平台上就是发行候选版本。RC版不会再加入新的功能了,主要着重于除错。
GA: General Availability,正式发布的版本,在国外都是用GA来说明release版本的。
RTM: (Release to Manufacture)是给工厂大量压片的版本,内容跟正式版是一样的,不过RTM版也有出限制、评估版的。但是和正式版本的主要程序代码都是一样的。
OEM: 是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。包装不像零售版精美,通常只有一面CD和说明书(授权书)。
RVL: 号称是正式版,其实RVL根本不是版本的名称。它是中文版/英文版文档破解出来的。
EVAL: 而流通在网络上的EVAL版,与“评估版”类似,功能上和零售版没有区别。
RTL: Retail(零售版)是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行EULAID,就是你的版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试版。_PRE,代表家庭版;_PRO,代表专业版。
α、β、λ 常用来表示软件测试过程中的三个阶段,α是第一阶段,一般只供内部测试使用;β是第二个阶段,已经消除了软件中大部分的不完善之处,但仍有可能还存在缺陷和漏洞,一般只提供给特定的用户群来测试使用;λ是第三个阶段,此时产品已经相当成熟,只需在个别地方再做进一步的优化处理即可上市发行。
# 3. BigDecimal精度计算问题
这里涉及到一个银行家算法,主要为了设计金额时必变损失,规则如下:
舍去位的数值小于5时,直接舍去;
舍去位的数值大于等于6时,进位后舍去;
当舍去位的数值等于5时,分两种情况:5后面还有其他数字(非0),则进位后舍去;若5后面是0(即5是最后一个数字),则根据5前一位数的奇偶性来判断是否需要进位,奇数进位,偶数舍去。
以上规则汇总成一句话:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一
2
3
4
案例: round(10.5551)=10.56 round(10.555)=10.56 round(10.545)=10.54
而BigDecimal也是支持这种算法的(使用RoundingMode.HALF_EVEN
即可),但是似乎是严格版,没有最后位数为5时的奇偶判断;
几种枚举规则:
ROUND_UP:远离零方向舍入。
向远离0的方向舍入,也就是说,向绝对值最大的方向舍入,只要舍弃位非0即进位。
ROUND_DOWN:趋向零方向舍入。
向0方向靠拢,也就是说,向绝对值最小的方向输入,注意:所有的位都舍弃,不存在进位情况。
ROUND_CEILING:向正无穷方向舍入。
向正最大方向靠拢,如果是正数,舍入行为类似于ROUND_UP;如果为负数,则舍入行为类似于ROUND_DOWN。注意:Math.round方法使用的即为此模式。
ROUND_FLOOR:向负无穷方向舍入。
向负无穷方向靠拢,如果是正数,则舍入行为类似于ROUND_DOWN;如果是负数,则舍入行为类似于ROUND_UP。
HALF_UP:最近数字舍入(5进)。
这就是我们最最经典的四舍五入模式。
HALF_DOWN:最近数字舍入(5舍)。
在四舍五入中,5是进位的,而在HALF_DOWN中却是舍弃不进位。
HALF_EVEN:银行家算法。
但是这里的规则是这样的:四舍六入五考虑,五后非零就进一,五后为零看奇偶(并没有标准最后两条规则)
UNNECESSARY:取整计算,若非整数计算抛出异常ArithmeticException
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 4. 反序列化final不会被重新赋值
- 通过构造函数为final变量赋值。
- 通过方法返回值为final变量赋值。
- final修饰的属性不是基本类型
# 5. 日期格式化表达式
yyyy:年
MM:月
dd:日
hh:1~12小时制(1-12)
HH:24小时制(0-23)
mm:分
ss:秒
S:毫秒
E:星期几
D:一年中的第几天
F:一月中的第几个星期(会把这个月总共过的天数除以7)
w:一年中的第几个星期
W:一月中的第几星期(会根据实际情况来算)
a:上下午标识
k:和HH差不多,表示一天24小时制(1-24)。
K:和hh差不多,表示一天12小时制(0-11)。
z:表示时区
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 6. 字符格式化
日常开发经常遇到使用工具类 java.util.Formatter
,熟悉常用转换字符,对开发效率非常有用,下表列出常用转换字符。
参数格式:%[argument_index$][flags][width]conversion
转换符 | 类型 | 举例 | 转换符 | 类型 | 举例 |
---|---|---|---|---|---|
d | 十进制整数 | 159 | s | 字符串 | ("%s","hello")-> hello |
x | 十六进制整数 | 9f | c | 字符 | ("%c",'h')-> h |
o | 八进制整数 | 237 | b | 布尔 | ("%b","xx")-> true |
f | 定点浮点数 | ("%.2f",222.2)-> 222.20 | h | 散列码 | ("%h",23423423)-> 16569bf |
e | 指数浮点数 | ("%e",222.2)-> 2.222000e+02 | + | 打印正数和负数的符合 | +25252 |
g | 通用浮点数 | % | 百分号 | ||
a | 十六进制浮点数 | ("%e",222.2)-> 0x1.bc66666666666p7 | n | 与平台有关的行分隔符 | |
( | 将负数括在括号内 | ("%,(.2f",-22.22)-> (22.22) | , | 添加分组分隔符 | ("%,d",85433565)-> 85,433,565 |
0 | 数字前面用 0 补位 | ("%05d",25)-> 00025 |
其他转换符:java.util.Formatter (opens new window)
# 7. System.getProperties
获取Java环境信息
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=F:\softs\Java\jdk1.8.0_152\jre\bin
java.vm.version=25.152-b16
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.country=CN
user.script=
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=E:\DevWorkspace\IDEA\java8
java.runtime.version=1.8.0_152-b16
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=F:\softs\Java\jdk1.8.0_152\jre\lib\endorsed
os.arch=amd64
java.io.tmpdir=C:\Users\Rick\AppData\Local\Temp\
line.separator=
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 10
sun.jnu.encoding=GBK
java.library.path=F:\softs\Java\jdk1.8.0_152\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;F:\softs\Git\cmd;F:\softs\TortoiseGit\bin;C:\WINDOWS\System32\OpenSSH\;C:\Users\Rick\AppData\Local\Microsoft\WindowsApps;F:\softs\Java\jdk1.8.0_152\bin;F:\softs\apache-maven-3.3.9\bin\;%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;;.
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=10.0
user.home=C:\Users\Rick
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=UTF-8
java.specification.version=1.8
java.class.path=F:\softs\Java\jdk1.8.0_152\jre\lib\charsets.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\deploy.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\ext\access-bridge-64.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\ext\cldrdata.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\ext\dnsns.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\ext\jaccess.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\ext\jfxrt.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\ext\localedata.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\ext\nashorn.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\ext\sunec.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\ext\sunjce_provider.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\ext\sunmscapi.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\ext\sunpkcs11.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\ext\zipfs.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\javaws.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\jce.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\jfr.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\jfxswt.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\jsse.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\management-agent.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\plugin.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\resources.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\rt.jar;E:\DevWorkspace\IDEA\java8\out\production\java8;F:\ideaIU-2018.2.3.win\lib\idea_rt.jar
user.name=Rick
java.vm.specification.version=1.8
sun.java.command=jstype.IntergeTest
java.home=F:\softs\Java\jdk1.8.0_152\jre
sun.arch.data.model=64
user.language=zh
java.specification.vendor=Oracle Corporation
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_152
java.ext.dirs=F:\softs\Java\jdk1.8.0_152\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
sun.boot.class.path=F:\softs\Java\jdk1.8.0_152\jre\lib\resources.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\rt.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\sunrsasign.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\jsse.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\jce.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\charsets.jar;F:\softs\Java\jdk1.8.0_152\jre\lib\jfr.jar;F:\softs\Java\jdk1.8.0_152\jre\classes
java.vendor=Oracle Corporation
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding=UnicodeLittle
sun.cpu.endian=little
sun.desktop=windows
sun.cpu.isalist=amd64
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 8. Java泛型中K T V E ? object等的含义
E – Element (在集合中使用,因为集合中存放的是元素)
T – Type(Java 类)
K – Key(键)
V – Value(值)
N – Number(数值类型)
? – 表示不确定的java类型(无限制通配符类型)
S、U、V – 2nd、3rd、4th types
Object – 是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T、E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换
2
3
4
5
6
7
8
泛型使用顺序
建议采用的顺序是List<T>、List<?>、List<Object>
List<T>、List<?>、List<Object>这三者都可以容纳所有的对象,但使用的顺序应该是首选List<T>,次之List<?>,最后选择List<Object>,原因如下:
- List<T>是确定的某一个类型
List<T>表示的是List集合中的元素都为T类型,具体类型在运行期决定;List<?>表示的是任意类型,与List<T>类似,而List<Object>则表示List集合中的所有元素为Object类型,因为Object是所有类的父类,所以List<Object>也可以容纳所有的类类型,从这一字面意义上分析,List<T>更符合习惯:编码者知道它是某一个类型,只是在运行期才确定而已。
- List<T>可以进行读写操作
List<T>可以进行诸如add、remove等操作,因为它的类型是固定的T类型,在编码期不需要进行任何的转型操作。
- List<?>只可以进行读操作
List<?>不能进行增加、修改操作,因为编译器不知道List中容纳的是什么类型的元素,也就无法校验类型是否安全了,而且List<?>读取出的元素都是Object类型的,需要主动转型,所以它经常用于泛型方法的返回值。注意,List<?>虽然无法增加、修改元素,但是却可以删除元素,比如执行remove、clear等方法,那是因为它的删除动作与泛型类型无关。
- List<Object>也可以读写操作,但是它执行写入操作时需要向上转型(Up cast),在读取数据后需要向下转型(Down cast),而此时已经失去了泛型存在的意义了。
# 9. 多版本JDK共存
官方网站下载各种JDK版本,这里我下载了JDK6、7、8
把个版本JDK安装好,接着配置环境变量
不同的版本配置不同的环境变量java_home6:D:\Tools\Java\jdk1.6.0_45
java_home7:D:\Tools\Java\jdk1.7.0_80
java_home8:D:\Tools\Java\jdk8u352-b08-x86
java_home:%java_home6%
classpath: .;%Java_home%\bin;%Java_home%\lib\dt.jar;%Java_home%\lib\tools.jar
path:%Java_home%\bin
删除系统windows/System32目录下的java.exe,javaw.exe,javaws.exe文件,因为每次安装JDK时会被覆盖。因为这个目录中的文件所在的环境变量优先级比较高。
通过命令行工具查看java版本可能还是你最后安装的那个版本,这个可能是系统环境变量Path中存在Java的环境文件路径如:C:\ProgramData\Oracle\Java\javapath;——>删掉即可(每个人遇到情况好像不太一样耶)