java编码的一些经验之谈

Java编码方式:Base64 编码与解码 Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。它主要用于在不支持二进制数据的场合(如电子邮件、URL、文件系统名等)传输二进制数据。严格来说Base64 并不是一种加密/解密算法,而是一种编码方式。Base64 不生成密钥,通过Base64 编码后的密文就可以直接“翻译”为明文。 阅读详情

目录

1. NPE的判断

2. Timsort报错

3. 三元运算符的隐式向下转型-NPE

4. 缓存范围外的数值==

 5. Object.equals 类型不匹配问题

6. Collections.max参数为空报错

7. Collectios.toMap  dumplicateKey

8. 返回集合的时候尽量将null值过滤掉是个好习惯


1. NPE的判断

引用别人的一句话:“任何你怀疑会发生NPE的地方,总有一天会发生”,判空永远不是多余步骤,同时返回值也尽量不要返回null。

2. Timsort报错

  java.util.Arrays#sort(T[], int, int, java.util.Comparator<? super T>)方法:

public static <T> void sort(T[] a, int fromIndex, int toIndex, 
       Comparator<? super T> c)
{
    if (c == null)
    {
        sort(a, fromIndex, toIndex);
    }
    else
    {
        rangeCheck(a.length, fromIndex, toIndex);
        // 此方法是1.7前的实现,1.7及后版本默认不开启
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a, fromIndex, toIndex, c);
        else
            TimSort.sort(a, fromIndex, toIndex, c, null, 0, 0);
    }
}

         可以看到,使用sort方法默认是使用的TimSort的算法实现,其中比较器需要满足以下三个条件,否则将会抛出异常IllegalArgumentException("Comparison method violates its general contract!"):

        1 ) 自反性: x , y 的比较结果和 y , x 的比较结果相反。
        2 ) 传递性: x > y , y > z ,则 x > z 。
        3 ) 对称性: x = y ,则 x , z 比较结果和 y , z 比较结果相同。

3. 三元运算符的隐式向下转型-NPE

    TestObj src = new TestObj();
    TestObj dst = new TestObj();
    dst.setId(src.getId() != null ? 0L : src.getId());

        比如在jdk中则会抛出NPE,在IDE中直接已经给出了提示:

        但需要注意的是,以下类似的代码在1.8版本中却可以正常执行,因为根据JLS15.25.3,1.8版本增强了类型推断功能,尽管有泛型擦除机制,但是根据JLS规定,编译器根据合成表达式和当前的返回值类型推断出第二个表达式和第三个表达式的结果都是Boolean,不存在拆箱过程就没有异常产生:

    Map<String,Boolean> map = new HashMap<String, Boolean>();
    Boolean b = (map!=null ? map.get("key") : false);

        tips:如何查询class文件的编译版本:

        可以vim底线模式:%!xxd或者hexdump -C Test.class都可以看到对应的十六进制信息,如果有jdk环境,可以通过javap -v Test.class反编译结果查看版本信息。

        java字节码文件魔数0xcafebabe占用四个字节,后面紧接着依次是次版本号和主版本号,只需要记住该版本号是从45开始的,jdk1.1之后每个大版本加一,所以到jdk8应该是52,这个二进制的数字转为十六进制刚好是0x34。        

4. 缓存范围外的数值==

 System.err.println(Integer.valueOf(-129) == Integer.valueOf(-129)); // false
 System.err.println(Integer.valueOf(-128) == Integer.valueOf(-128)); // true
 System.err.println(Integer.valueOf(127) == Integer.valueOf(127));   // true
 System.err.println(Integer.valueOf(128) == Integer.valueOf(128));   // false

        注意Integer的构造函数和valueOf方法的区别即可,Integer的数值缓存范围为[-128,127]。

 // 构造函数,直接生成新对象
 public Integer(int value) {
     this.value = value;
 }

 // valueOf方法,如果在缓存范围内,则返回缓存对象
 public static Integer valueOf(int i) {
     if (i >= IntegerCache.low && i <= IntegerCache.high)
         return IntegerCache.cache[i + (-IntegerCache.low)];
     return new Integer(i);
 }

        其中number类型中,short、int、long对应的包装类中都内置了缓存数据。

 5. Objects.equals 类型不匹配问题

        举一个简单的例子,以下代码运行结果为false。执行过程中1L会自动转型为Long,1自动向上转型为Integer,所以在执行第一个参数的equals方法的时候,因为类型不一致就会返回false,所以使用这个方法的时候,需要特别注意参数的类型是否一致。

 System.err.println(Objects.equals(1L, 1));  // false
 // Long的equals方法
 public boolean equals(Object obj) {
     // 类型不一致,直接返回false
     if (obj instanceof Long) {
         return value == ((Long)obj).longValue();
     }
     return false;
 }

6. Collections.max参数为空报错

 // java.util.NoSuchElementException
 List<Long> ids = new ArrayList<>();
 Long max = Collections.max(ids);

        查看源码可以知道max方法的实现是通过Iterator迭代器实现的,遍历一次所有的元素,选出最大的那个。第一步就是要找到第一个元素作为候选结果和对比对象,其使用Iterator接口的next()方法得到,看next方法的定义可知,如果迭代器为空则直接抛出NoSuchElement的异常,所以迭代器的next的所有具体实现都会涉及到这个逻辑以保持一致,比如java.util.ArrayList.Itr#next()、java.util.LinkedList.ListItr#next()等都有对应的异常抛出逻辑。

 /**
  * Returns the next element in the iteration.
  *
  * @return the next element in the iteration
  * @throws NoSuchElementException if the iteration has no more elements
  */
 E next();
 // java.util.LinkedList.ListItr#next()
 public E next() {
     checkForComodification();
     // 异常由此处抛出
     if (!hasNext())
         throw new NoSuchElementException();
     lastReturned = next;
     next = next.next;
     nextIndex++;
     return lastReturned.item;
 }

7. Collectios.toMap  dumplicateKey

 TestObj test1 = new TestObj(1L);
 TestObj test2 = new TestObj(1L);
 // 忽略返回值
 Stream.of(test1, test2).collect(Collectors
         .toMap(TestObj::getId, Function.identity()));

        报错:java.lang.IllegalStateException: Duplicate key Test$TestObj@506e1b77

        因为没有考虑key重复时候的策略,修改为让key重复的元素直接覆盖,报错消失。

 TestObj test1 = new TestObj(1L);
 TestObj test2 = new TestObj(1L);
 Stream.of(test1, test2).collect(Collectors
         .toMap(TestObj::getId, Function.identity(), (k1, k2) -> k2));

8. 返回集合的时候尽量将null值过滤掉是个好习惯

 Map<Long, TestObj> cache = new HashMap<>();
 cache.put(1L, new TestObj(1L));
 cache.put(2L, new TestObj(2L));
 cache.put(3L, null);

 // return ids.stream().map(cache::get).collect(Collectors.toList());
 // 建议实现中去掉null值,防止调用者使用时未判断导致的NPE
 return ids.stream().map(cache::get).filter(Objects::nonNull).collect(Collectors.toList());

手把手教你用Logisim搭建5级流水MIPS CPU(附华中科技计组实验避坑指南) 本文详细介绍了如何使用Logisim从零构建5级流水MIPS CPU,特别针对华中科技大学计算机组成原理实验提供实用指南。内容涵盖单周期CPU过渡、流水线寄存器设计、数据冒险处理等核心环节,并附有实验避坑建议和性能优化技巧,帮助学生高效完成这一挑战性项目。 阅读详情

相关推荐

Word | 简单可操作的快捷公式编号、右对齐和引用方法

在理工科论文的写作中,涉及到大量的公式输入,我们希望能够按照章节为公式进行编号,并且实现公式居中,编号右对齐的效果。网上有各种各样的方法来实现,操作繁琐和简单的混在一起,让没有接触过公式编号的人感觉比较混乱。笔者自己博览相关博客,亲身实践,总结出一套自认为比较简便的公式编号、对齐和引用方法,在这里分享给大家~

qq_43466146的博客 3万+

java npe是什么_NPE问题(一)

最近在看Java_manual.pdf,其中有一点值得反思:“防止 NPE,是程序员的基本修养。”NPE(Null Pointer Exception)一直是我们最头疼的问题,也是最容易忽视的地方,先总结几条不同场景的解决方案,望后续补充。1.RPC调用某个规定好的接口,如获取某一范围内查询结果,返回结果我们约定好是List。若没有结果,我们是返回null还是Collections.emptyLi...

weixin_36013970的博客 4036

通信系统原理[郭宇春]——模拟调制系统——课后习题答案

通信系统原理[郭宇春]——第三章课后习题答案,出错望指正!

尧呱呱的博客 3844

高效处理NPE(空指针)异常的方法(一)

Optional类高效处理空指针异常

weixin_45236540的博客 2727

Android PackageManagerService 总结(一)应用市场下载安装apk流程

前言: 本篇文章是对系统包安装流程的总结,基于Android12 上 com.android.packageinstaller 源码的分析,第三方应用商城(华为商城,小米商城,应用宝,豌豆荚,酷安等)下载安装应 用,在普通安装和静默安装app两种方式下,对代码流程的梳理和讲解。 触发安装: 当你在商城界面中点击安装按钮,应用会自动下载,下载完成后就会调起系统安装应用的界面,此种触发方式一般是通过Intent 隐式调用的,我们先阅读如下代码: ......

u012514113的专栏 1万+

基于verilog的16QAM调制

思路1:正交调幅法——实现16QAM调制,可以理解为时相位相差90度的两个正弦波的4PAM叠加。 4比特输入经过2->4进制转化得到两路2比特输入,然后分别经过4PAM后叠加所得输出即为16QAM调制结果。 具体程序稍后编写。 思路2:复合相移法——可以借助前面编写的QPSK,相当于两路幅度不同的QPSK的叠加,比如幅度分别取1和3 。 思路1正交调幅法的设计方案: 两正弦波相位差...

weixin_30725467的博客 2929

Java - NPE(NullPointerException);Optional

空指针异常。

MinggeQingchun的博客 880

PCL 使用RANSAC拟合平面【2026最新版】

RANSAC拟合平面算法原理和实现流程详解以及最大迭代次数和内点期望概率的设置方法。最后再对拟合后的平面法向量与向量(1,1,1)进行定向。博客长期更新,最近一次更新时间为:2026年4月24日。

点云侠的博客 42万+

处理各种NPE(NullPointerException) 判空 集合 字符串等

目录 1、判断对象是否相等时,使用Objects.equals(a, b) 2、字符串 NPE 3、包装类NPE(自动拆箱的陷阱。当使用包装类与原始类型做比对时,要特别注意空指针问题) 4、集合list的NPE 5、写方法时尽量不要返回 null 值--Collections.emptyMap/emptySet/emptyList() 6、Optional 1、判断对象是否相等时,使用Objects.equals(a, b) if (Objects.equals("null",...

墨咖 1070

【PX4学习笔记】1. ROS及PX4环境搭建

环境 Ubuntu18.04 安装教程参考 https://www.guyuehome.com/8983 安装过程中问题的解决 问题1 rosdep init 错误的终极解决方法 注意etc/下的ros和rostep文件夹要自己建 问题2 Ubuntu安装ROS报错 sudo: rosdep:找不到命令 问题3(更好地解决了问题1、2)【推荐】 解决GitHub的raw.githubusercontent.com无法连接问题 问题4:GeographicLib的安装 教程中安装GeographicLib d

【人工智障 | 计算鸡视觉 | 机器孩】 8230

17.6 LangSmith 私有化部署实战指南:企业级AI应用的安全基石

LangSmith 私有化部署, 企业级AI开发平台, 数据隐私合规, 混合云架构, 模型监控与审计。

yonggeit的博客 3777

java基本概念-4

java

yanyanzhenshuai的博客 283

HDR 人像肤色稳定实战:AE/AWB/ToneMap 冲突解耦与优先级裁决

人像 HDR 最容易“翻车”的就是**肤色飘**:AE 抢亮度、AWB 拉白点、TM 又在肩部压高光,三方各自“对”却合起来“错”。本文给出一套**工程可落地**的裁决策略:以**肤色 ROI 锚点**为最高约束,AE 先对脸部入射照度收敛,AWB 在**肤色先验 + 光源模型**下缓变,TM 采用**色相保持 + 中灰/肤色双锚**且时域一致化。配套**阈值与回归**(ΔE00、亮度漂移 RMS、频闪注入),把“主观对”的口径落到**可度量**,并给出逆光、多脸、霓虹等极端场景的**例外分流**。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1198

【Java开发编码的工作效率问题工作经验之谈】

在本文中,将探讨Java开发编码的工作效率问题,包括如何提高Java编码效率,如何提高代码质量,如何提高代码可维护性等方面的内容。通过使用合适的工具和框架、遵循编码规范和最佳实践、使用单元测试和代码质量工具、重构和代码复审等,可以提高Java编码的效率、质量和可维护性。使用开源的框架可以加速开发进程,例如Spring、Hibernate等,这些框架提供了很多常用的功能,例如数据访问、事务管理、AOP等,可以简化开发任务。使用代码质量工具可以帮助开发人员发现代码中的问题,包括潜在的漏洞、代码重复等。

我是Java程序员廖志伟,感谢朋友们的支持! 437

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java获取文件编码

java编码 移位运算 获取文件编码

Benjamin 9539

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JAVA字符编码系列三:Java应用中的编码问题

 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考。为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问题,特别是乱码问题,我觉得组成一个系列来描述和分析更好一些,包括三篇文章:第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础第二篇:JAVA字符编

qinysong的专栏 4万+

【总结】Effective java经验之谈,创建和销毁对象

关于Effective java 这本书,自己的一些总结性的思考。篇幅可能不按照目录来,因为自己喜欢先看哪一章就直接阅读了。不过能确定的是,每一章都会有总结。欢迎大家拍砖与补充。

阿利在努力 2302

java string的编码_Java中string的编码的详细说明

本文主要说明java的系统里字符串(string)的编码的情况首先一个问题,如何知道某个string(变量的值)的编码是什么?情况复杂,下面分开说明首先要知道系统默认编码(“系统”不是指操作系统,而是本java应用)。影响编码有以下情况:默认时,就是操作系统的编码,我们用的中文windows编码一般是GBK,而linux一般是utf-8当java启动命令可以指定具体编码。我们生产环境一般都会设为u...

weixin_35869703的博客 3024

查看 java 编码_java编码详解

举个例子我们在开发过程中,特别是多种编码格式并存的情况下,很容易遇到乱码问题。 假如有一个GBK编码java文件,然后再使用-Dfile.encoding=GBK参数,写入的文件中哪些是乱码呢。那如果使用UFT-8编码的java文件呢。public class Main {static String content = "中文";public static void main(String[] a...

weixin_39640395的博客 1902

[JAVA-编码] 3 java编译文件的编码

会有如题的思考,是因为我一直有一个疑问java文件的编码会影响字符串的编码嘛?因此自然而然就想到了java编译后的文件的编码。手动建立一个java文件Demo.java,并保存。此时Demo.java文件的编码为ANSI,中文操作系统下就是GBK。然后使用javac命令来编译该源文件。 Javac也需要读取java文件,那么javac是使用什么编码来解码我们读取的字节呢?其实javac采用了操作系统默认的GBK编码解码我们读取的字节,这个编码正好也是Demo.java文件的编码,二者一致,所以不会出现乱

wltsysterm的博客 1667

Java编码详解

     Java编码     对于使用中文以及其他非拉丁语系语言的开发人员来说,经常会遇到字符集编码问题。对于Java语言来说,其内核和class文件使用的是UCS2编码(2个字节的Unicode编码)。这种编码并不属于某个语系的语言编码,它实际上是一种编码格式的世界语。在这个世界上所有可以在计算机中使用的语言都有对应的UCS2编码,这使Java程序具有良好的跨平台性。正是因为Jav

zjl5231123的专栏 2186

java中的编码_Java中的编码

提及Java中的编码问题,许多博客都会提及Java中的getBytes()方法,不过笔者在研究这个问题的时候,会陷入一个疑惑中,getBytes()方法的作用是将字符串按照指定的charset编码,但是这些字符串本身其实已经以某种编码方式存在内存中了,那这个方法的指定参数不会导致乱码吗,假如原本是以unicode码存在内存,getBytes("BGK")用BGK对原来的编码进行再编码?要较好的理解...

weixin_33513218的博客 911

ibm java 编码_关于Java中编码的问题

在Java中使用了Unicode编码,在程序中显式的指定编码时,表示Unicode的字符串是什么?“ISO-8859-1”到底是什么样的编码?|SupportedEncodingsTheclassesjava.io.InputStreamReader,java.io.OutputStreamWriter,andjava.lang.StringcanconvertbetweenU...

weixin_29558841的博客 946

Java 中的 Unicode 编码

(.java)和编译后的 .class 文件的编码并不一样。源文件 .java 可以采用多种编码格式,如之所以有(可以有)

geniushorse的博客 4710

java编码转换_Java 中的编码转换

一、Java 编码转换过程我们总是用一个java类文件和用户进行最直接的交互(输入、输出),这些交互内容包含的文字可能会包含中文。无论这些java类是与数据库交互,还是与前端页面交互,他们的生命周期总是这样的:程序员在操作系统上通过编辑器编写程序代码并且以.java的格式保存操作系统中,这些文件我们称之为源文件。通过JDK中的javac.exe编译这些源文件形成.class类。直接运行这些类或者部...

weixin_42183453的博客 1195

java 编码问题_Java编码问题原因以及解决

一、文件编码Unicode 是首选编码。Unicode 是全球范围的字符编码标准。小结: GBK 与unicode之间的转换是通过gbk unicode映射表。UTF-8 与unicode之间的转换是通过转换规则公式所以说,unicode是核心中介。Gbk要转换成utf-8的话,先转成unicode。然后unicode再转换成utf-8;反之亦然。二、XML编码问题★ 编码属性应当被指定为文档被保...

weixin_36387422的博客 1541

Java中的编码问题

编码问题一直困扰着开发人员,尤其在java中更加明显,因为Java是跨平台语言,不同平台的编码之间的切换较多。

qq_43456605的博客 934
上一篇: docker-镜像加速
下一篇: 常用命令集锦
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值