uRick's PKM uRick's PKM
首页
导航
  • Java
  • 数据库
书单
  • 优质好文
  • 有趣的工具
  • 分类
  • 标签
  • 归档
关于
首页
导航
  • Java
  • 数据库
书单
  • 优质好文
  • 有趣的工具
  • 分类
  • 标签
  • 归档
关于
  • 编码小技巧

    • 1. EXCEL 中生成UUID
      • 2. 软件版本管理
        • 3. BigDecimal精度计算问题
          • 4. 反序列化final不会被重新赋值
            • 5. 日期格式化表达式
              • 6. 字符格式化
                • 7. System.getProperties
                  • 8. Java泛型中K T V E ? object等的含义
                    • 9. 多版本JDK共存
                    uRick
                    2020-01-23
                    碎片
                    目录

                    编码小技巧碎片

                    记录日常编码注意事项以及小技巧

                    TechCode

                    # 1. EXCEL 中生成UUID

                    1. 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)))
                    
                    1
                    1. 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)))
                    
                    1
                    1. 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))
                    
                    1
                    1. 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))
                    
                    1

                    # 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前一位数的奇偶性来判断是否需要进位,奇数进位,偶数舍去。
                    以上规则汇总成一句话:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一
                    
                    1
                    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
                    
                    1
                    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:表示时区
                    
                    1
                    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
                    
                    1
                    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等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换
                    
                    1
                    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共存

                    1. 官方网站下载各种JDK版本,这里我下载了JDK6、7、8

                    2. 把个版本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

                        _环境变量_1516520167_12796

                    3. 删除系统windows/System32目录下的java.exe,javaw.exe,javaws.exe文件,因为每次安装JDK时会被覆盖。因为这个目录中的文件所在的环境变量优先级比较高。 删除文件

                    4. 通过命令行工具查看java版本可能还是你最后安装的那个版本,这个可能是系统环境变量Path中存在Java的环境文件路径如:C:\ProgramData\Oracle\Java\javapath;——>删掉即可(每个人遇到情况好像不太一样耶)

                    环境变量_1516520485_32516

                    #技术
                    上次更新: 2024/03/02, 14:21:03
                    最近更新
                    01
                    从0到1:开启商业与未来的秘密
                    11-26
                    02
                    如何阅读一本书: 读懂一本书,精于一件事
                    10-25
                    03
                    深入理解Lambda
                    06-27
                    更多文章>
                    Theme by Vdoing | Copyright © 2019-2024 uRick | CC BY 4.0
                    • 跟随系统
                    • 浅色模式
                    • 深色模式
                    • 阅读模式