刚上手Java会踩的坑

1.  用==号比较的坑

Integer类型的两个参数使用==号比较是否相等,或者使用String类型的两个变量进行==比较,天真的认为他们是理所应当的。

其实==操作只适用于基本数据类型如int , byte, boolean, short, char, long, float, double这些基本数据类型。

其它的包装类型Integer, Byte, Boolean, Short, Character Long, Float, Double 这些是对基本数据类型的包装类型。我们做项目的时候,保存数据类型一般都使用Integer这类包装数据类型,因为它们的默认值为null,而不是基本数据类型例如int的默认值是0。使用包装数据类型不容易出错,与前端进行交互时也可以快速的定位错误(数据字段前端有没有发过来,而不会有默认值,直接就是null)。

像String,数组,类的实例对象或者基本数据类型的包装类这类进行比较是否相等要使用equals(),因为它们是引用类型的数据。

 

        Integer integer = new Integer(1);Integer integer1 = new Integer(1);System.out.println(integer1 == integer); // falseSystem.out.println(integer1.equals(integer)); // true

 

Integer中不是有范围是:-128-127的缓存吗?为什么是false?它其实并没有用到缓存

那么缓存是在哪里用的?答案在valueOf方法中:

        String s1 = new String("1");String s2 = new String("1");System.out.println(Integer.valueOf(s1) == Integer.valueOf(s2)); // true

 

2.Object.equals()

equals方法的判断逻辑如下:

  1. 该方法先判断对象a和b的引用是否相等,如果相等则直接返回true。

  2. 如果引用不相等,则判断a是否为空,如果a为空则返回false。

  3. 如果a不为空,调用对象的equals方法进一步判断值是否相等。

 

3. BigDecimal

通常我们会把一些小数类型的字段(比如:金额),定义成BigDecimal,而不是Double,避免丢失精度问题。

a - b应该等于0.01

        double a = 0.03;double b = 0.02;System.out.println(a - b);// 0.009999999999999998

Double类型的两个参数相减会转换成二进制,因为Double有效位数为16位这就会出现存储小数位数不够的情况,这种情况下就会出现误差。

我们使用BigDecimal能避免丢失精度。但也有坑在里面,我们可以使用Double.toString方法,对double类型的小数进行转换,这样能保证精度不丢失。

使用BigDecimal.valueOf方法初始化BigDecimal类型参数,也能保证精度不丢失。

 BigDecimal c = new BigDecimal(0.02);BigDecimal d = new BigDecimal(0.03);System.out.println(d.subtract(c)); // 0.0099999999999999984734433411404097569175064563751220703125BigDecimal r = new BigDecimal(Double.toString(0.02));BigDecimal g = new BigDecimal(Double.toString(0.03));System.out.println(g.subtract(r));// 0.01BigDecimal v = BigDecimal.valueOf(0.02);BigDecimal b = BigDecimal.valueOf(0.03);System.out.println(b.subtract(v));

 

4.  Java8 filter

Java8中的Stream用法很强大,刚使用时很震撼。对集合Stream操作,可以实现:遍历集合、过滤数据、排序、判断、转换集合等等功能。

public List<User> filterUser(List<User> userList) {if(CollectionUtils.isEmpty(userList)) {return Collections.emptyList();}return userList.stream().filter(user -> user.getId() > 1000 && user.getAge() > 18).collect(Collectors.toList());
}

如果你对过滤后的数据做修改将同时影响原本的数据

List<User> userList = queryUser();
List<User> filterList = filterUser(userList);
for(User user: filterList) {user.setName(user.getName() + "测试");
}for(User user: userList) {System.out.println(user.getName());
}

其根本原因是:过滤后的集合中,保存的是对象的引用,该引用只有一份数据。

也就是说,只要有一个地方,把该引用对象的成员变量的值,做修改了,其他地方也会同步修改。

 

5. 自动拆箱

Java5之后,提供了自动装箱自动拆箱的功能。

自动装箱是指:JDK会把基本类型,自动变成包装类型。

Integer integer = 66;
// 等同
Integer integer = new Integer(66);

而自动拆箱是指:JDK会把包装类型,自动转换成基本类型。

Integer integer = new Integer(9);
int num= integer + 1;
// 等同于
Integer integer = new Integer(9);
int num= integer.intValue() + 1;

我们在使用自动拆箱时,往往忘记了判空,导致出现NullPointerException异常。

 

6. 字符串的replace() 和 replaeAll()

我们在使用字符串时,想把字符串中一些指定的字符替换成我们希望的字符。

replace方法:

1) 其中一个方法的参数:char oldChar 和 char newChar,支持字符的替换。

source.replace('A', 'B')

2) 另一个方法的参数是:CharSequence target 和 CharSequence replacement,支持字符串的替换。

source.replace("A", "B")

 

replaceAll方法的参数是:String regex 和 String replacement,即基于正则表达式的替换。

普通字符串进行替换: source.replaceAll("A", "B")

使用正则表达替换(将数字替换成A):str.replaceAll("\\d", "A")

只想替换第一个匹配的字符串,使用replaceFirst()方法

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/16970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

instanceof 关键字的作用

instanceof 严格来说是 Java 中的一个双目运算符&#xff0c;用来测试一个对象是否为一个类的实例&#xff0c;用法为&#xff1a; boolean result obj instanceof Class其中 obj 为一个对象&#xff0c;Class 表示一个类或者一个接口&#xff0c;当 obj 为 Class 的对象&…

JavaEE-JPA(相关概念及Spring JPA)

JPA JPA 相关概念 ORM 框架 (Object Relational Mapping) 建立 Java 程序实体类与数据库表之间的映射关系。使用 ORM 框架进行编程 Java 程序会根据开发者配置&#xff0c;在运行时自动把数据对象持久化到数据库中&#xff0c;比直接使用 JDBC 编程更为方便和强大。 常见的 …

Android面试题之Kotlin常见集合操作技巧

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 list 创建和修改 不可变list,listOf var list listOf("a","d","f") println(list.getOrElse(3){"Unkn…

Kubernetes可视化界面之DashBoard

1.1 DashBoard Kubernetes Dashboard 是 Kubernetes 集群的一个开箱即用的 Web UI&#xff0c;提供了一种图形化的方式来管理和监视 Kubernetes 集群中的资源。它允许用户直接在浏览器中执行许多常见的 Kubernetes 管理任务&#xff0c;如部署应用、监控应用状态、执行故障排查…

用循环神经网络预测股价

循环神经网络可以用来对时间序列进行预测&#xff0c;之前我们在介绍循环神经网络RNN,LSTM和GRU的时候都用到了正弦函数预测的例子&#xff0c;其实这个例子就是一个时间序列。而在众多的时间序列例子中&#xff0c;最普遍的就是股价的预测了&#xff0c;股价序列是一种很明显的…

链表练习题

返回倒数第K个节点 快慢指针 让快指针先走k步&#xff0c;再使得快指针与慢指针同时走一步&#xff0c;这样没有开额外空间&#xff0c;空间复杂度较低。 代码实现如下&#xff1a; struct ListNode {int val;struct ListNode* next;}; int kthToLast(struct ListNode* head…

第 52 期:MySQL 半同步复制频繁报错

社区王牌专栏《一问一实验&#xff1a;AI 版》全新改版归来&#xff0c;得到了新老读者们的关注。其中不乏对 ChatDBA 感兴趣的读者前来咨询&#xff0c;表达了想试用体验 ChatDBA 的意愿&#xff0c;对此我们表示感谢 &#x1f91f;。 目前&#xff0c;ChatDBA 还在最后的准备…

el-table实现合并特定列的所有行

el-table实现合并特定列的所有行 示例&#xff1a; 在这里插入图片描述 const objectSpanMethod ({ row, column, rowIndex, columnIndex }) > {if (columnIndex 5 || columnIndex 7) {// 就是只保留第一行&#xff0c;其他直接不要&#xff0c;然后行数是列表长度if …

2024年03月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 下列哪个命令,可以将2024转换成’2024’ 呢?( ) A:str(2024) B:int(2024) C:float(2024) D:bool(2024) 答案:A 本题考察的是str() 语句,将数字转换成字符串用到的是str() 语句。 …

Java:IO

首 java.io中有百万计的类&#xff0c;如何找到自己需要的部分&#xff1f; 流 IO涉及到一个“流”stream的概念&#xff0c;可以简单理解成数据从一个源头到一个目的地。明白数据从哪来&#xff0c;要到哪里去&#xff0c;数据流中是字节还是字符之后&#xff0c;才能找到自…

回顾下Java中的基本数据类型以及Integer与int的区别

一、Java中的基本数据类型&#xff08;Primitive Data Types&#xff09;共有八种&#xff0c;它们分别是&#xff1a; byte&#xff1a;字节型&#xff0c;用于表示8位整数&#xff0c;取值范围从-128到127&#xff08;包括-128和127&#xff09;。 short&#xff1a;短整型&…

由于找不到d3dx9_39.dll,无法继续执行代码的5种解决方法

在现代科技发展的时代&#xff0c;电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;由于各种原因&#xff0c;我们可能会遇到一些电脑问题&#xff0c;其中之一就是“d3dx9_39.dll丢失”。这个问题可能会导致我们在运行某些游戏或应用程序时遇到错误提示&#xff0c;…

AI 生成第9篇测试文章:测试人员如何发挥自己在团队中的作用?

背景 在快速迭代的软件开发环境中&#xff0c;测试人员的角色早已超越了传统的“找bug”范畴&#xff0c;TA们成为了保证产品质量、促进团队协作、推动技术创新的重要力量。本文将深入探讨测试人员如何在团队中发挥更加全面和深入的作用&#xff0c;成为不可或缺的一环。 1. …

Vue中引入组件需要哪三步

在Vue中引入组件通常需要以下三步&#xff1a; 导入组件&#xff1a;首先&#xff0c;你需要在父组件中导入你想要使用的子组件。这通常是通过ES6的import语法完成的。 注册组件&#xff1a;接下来&#xff0c;你需要在父组件中注册这个子组件。这可以通过components选项完成&…

JavaScript如何让一个按钮的点击事件在完成之前禁用

在JavaScript中&#xff0c;要禁用一个按钮的点击事件直到某个操作完成&#xff0c;你可以将其点击事件用匿名函数的方式书写。 你可以将其在点击函数内设置为null来禁用按钮。 <button id"butto_n">点击抽奖</button><script>butto_n.onclick bu…

大整数运算详解升级版

目录 大整数的存储 大整数的四则运算 高精度加法 高精度减法 高精度与低精度的乘法 高精度与低精度的除法 大整数的存储 对于大整数使用数组存储&#xff0c;例如定义int型数组d[1000]&#xff0c;那么这个数组中的每一位就代表了存放的整数的每一位。如将整数235813存…

android requireActivity() 和 getActivity()使用问题

requireActivity() 和 getActivity() 都是从 Fragment 中获取宿主 Activity 的方法,但它们有一些不同的行为和使用场景。 requireActivity() 抛出异常:如果 Fragment 没有附加到任何 Activity,调用 requireActivity() 会抛出 IllegalStateException。安全性:通常在你确定 …

新品 | Forge® 1GigE IP67工业相机助力智能农业、食品和饮料行业

近日&#xff0c;51camera的合作伙伴Teledyne FLIR IIS推出Forge 1GigE IP67,它是Forge系列的最新工业相机&#xff0c;旨在在恶劣的工业环境中运行&#xff0c;同时确保高效的生产能力。Forge 1GigE IP67致力于为工厂自动化提供先进成像系统的最新产品。 Forge 1GigE IP67相机…

python-pytorch 实现seq2seq+luong general concat attention 完整代码

接上一篇https://blog.csdn.net/m0_60688978/article/details/139046644 # def getAQ(): # ask[] # answer[] # with open("./data/flink.txt","r",encoding"utf-8") as f: # linesf.readlines() # for line in lin…

MyBatis多数据源配置与使用,基于ThreadLocal+AOP

导读 MyBatis多数据源配置与使用其一其二1. 引依赖2. 配置文件3. 编写测试代码4. 自定义DynamicDataSource类5. DataSourceConfig配置类6. AOP与ThreadLocal结合7. 引入AOP依赖8. DataSourceContextHolder9. 自定义注解UseDB10. 创建切面类UseDBAspect11. 修改DynamicDataSourc…