Java平时需要注意的事项
1、String 相等
稍微有点经验的程序员都会用equals比较而不是用 ==,但用equals就真的安全了吗,看下面的代码
user.getName().equals("xiaoming"); //有经验的老司机很快就能看到问题,如果user.getName()为null,就会抛出空指针异常,因此下面的写法更为稳妥"xiaoming".equals(user.getName()); //当然这种写法并不是万能的,如果比对的两边都是未知变量,如下 user.getName().equals(user1.getName());//user.getName() 和 user1.getName()都有可能为null
因此更为稳妥的方法可以采用jdk Objects类中的equals方法,左右两边都可以避免空指针异常
Objects.equals(user.getName(), user1.getName()); //需要注意的是Objects类在jdk1.7才支持,如果是jdk1.6,可以采用guava中的Objects类代替
2、Integer 比较
Integer a = 127; Integer b = 127; Integer c = 128; Integer d = 128; System.out.println(a == b);// 结果为:true System.out.println(c == d);// 结果为:false
令人惊讶的是结果并不是预料中的全是true,而是一个为true,一个为false;至于原因还需要从源码中探究
首先通过源码来看一下,当通过 = 对Integer赋值时,实际调用了Integer.valueOf()方法
public static Integer valueOf(int i) {assert IntegerCache.high >= 127;if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i); }
可以看到当 i >= IntegerCache.low && i <= IntegerCache.high 时,是从一个缓存类中取,其它情况会new一个对象。IntegerCache.low默认为-128,high默认为127(可调整)。
这样a=b就很好解释了,因为==比较的是内存地址,a,b都是从这个缓存类中取的同一个对象,所以返回结果为true。b,c则都是new的新对象,内存地址自然不同,所以返回false。
既然看到了这个缓存类,就有必要一睹它的庐山真面目了
private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}private IntegerCache() {} }
IntegerCache 是Integer类中一个静态内部类,high值可通过JVM 的启动参数设置
3、Arrays.asList(array)
String [] array= {"a","b","c"}; // 返回的List实例为:java.util.Arrays.ArrayList List<String> list = Arrays.asList(array); list.remove(0);
Arrays.asList是一种很常见的创建List的方式,但该方法返回的List实例不是平时常用的List实例,而是Arrays的一个静态内部类,该类继承自AbstractList类,并未提供List的完整的实现,例如remove方法就未实现。当然,如果只是用做遍历,则完全是没问题的。
类似的情况还有不少,使用时要注意,例如:
1、ArrayList的subList方法,返回的是ArrayList中的一个内部类java.util.ArrayList.SubList
2、HashMap的values方法,返回的是HashMap中的一个内部类:java.util.HashMap.Values
4、list.toArray
List<String> list = new ArrayList<String>(); String[] array=(String[]) list.toArray();
上面的写法乍一看似乎没有什么问题,但list.toArray()返回的是一个object数组,强转会抛异常。其实是可以指定返回数组的类型的,如下
String[] array=list.toArray(new String[list.size()]);
具体可查看之前总结的这篇博客:集合转数组的toArray()和toArray(T[] a)方法
5、foreach remove
List<String> list =new ArrayList<String>(); list.add("java"); list.add("c"); list.add("js"); for(String str:list){list.remove(0); }
在遍历时删除元素也是比较常用的操作,但foreach时删除元素有可能抛异常,这种不好控制的写法还是不用为好,可以用迭代器去代替
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {String str = iterator.next();iterator.remove(); }
6、String getBytes
String str="韦德"; byte[] bytes = str.getBytes();
String的getBytes()方法用的是当前项目的默认编码,如果不指定编码,在不同的运行环境很容易被坑,所以还是根据自己的需要指定对应的编码比较靠谱
String str="韦德"; byte[] bytes = str.getBytes("utf-8");
Java平时需要注意的事项相关推荐
- java异常及日志注意事项
java异常及日志注意事项 参考文章: (1)java异常及日志注意事项 (2)https://www.cnblogs.com/lq147760524/p/8475531.html 备忘一下.
- 关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了
关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了
- 写java代码时的注意事项_从方法返回Java 8的可选项时的注意事项
写java代码时的注意事项 Java 8引入的Optional类一直是该语言版本引入的最具争议的功能之一. 尽管我喜欢这个新的Java类的东西比不喜欢的东西多,但在Java方法中将其用作return类 ...
- java 上传文件注意事项
java 上传文件注意事项 1.文件名有特殊字符的情况,所以最好是文件名前台url编码,后台再url解码,这点在下载的时候也一样 2.文件大小一定要设置,spring boot 有默认. 3.文件名校 ...
- Java开发规范及注意事项
文章目录 Java开发规范及注意事项 编程规约 异常日志违约 单元测试规约 工程结构规约 数据库规约 Java开发规范及注意事项 编程规约 POJO类中布尔类型的变量,都不要加is前缀,否则部分框架解 ...
- 关于 Delphi跨平台开发Android调用 JNI JAR java 的说明和注意事项
2Pascal-新时代的Pascal-关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了 - Powered by Discuz! 关于 调用 JNI JAR 的说明和注意事项 ...
- java北大青鸟试题_10个常见2020春招Java面试题及注意事项!
春招开始啦,在面试Java工程师的时候,同学们会经常会遇到一些很困扰的问题:感觉自己的Java技术能力还不错,甚至是游刃有余,但是到了面试的时候就凉凉:对面试官提出的问题感到迷惑,不理解面试官到底是想 ...
- java后端需要注意的事项_【后端开发】Java中关于null的含义以及使用中要注意的事项...
下面小编就为大家带来一篇浅谈java中null是什么,以及使用中要注意的事项.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.null既不是对象也不是一种类型,它仅是 ...
- java单例模式使用及注意事项
1. 说明 1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例 2)单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstan ...
最新文章
- spring Transaction Propagation 事务传播
- [网络安全自学篇] 三十一.文件上传之Upload-labs靶场及CTF题目01-10(四)
- 电脑上装蓝牙_指甲盖变触控板,隔空就能操控手机和电脑!
- C# 的扩展方法在 LINQ 中实现数组排序
- win7下安装pip——Python的包管理工具
- 前端学习(2738):重读vue电商网站48之通过 chainWebpack 自定义打包入口
- Z-Blog 扩展数据库 字段 二次开发
- 用随机梯度下降来优化人生
- CTS(5)---Android8.0中CTS测试对于TEE的要求
- Rivian计划在乔治亚州新增一个工厂
- 后台接收数组_腾讯C++后台开发面试笔试知识点参考笔记
- 2019写给对象的话_数组方法写给女友的一系列 JS 数组操作(建议收藏 | 内附思维导图)...
- 编程基础(五)—— 虚拟内存
- 如何根治BYOD中国式“水土不服”
- 【Java面试题】这道分布式面试题一定要拿下,说说你对CAP的理解?看看高手如何回答
- 易用宝项目记录day4-代码生成器
- python怎样控制继电器_使用Python和树莓派控制跨阵M2继电器通断
- 攻防世界-logmein
- linux裸设备详解,Linux裸设备管理详解(原创)
- 拉丁超立方抽样 Latin hypercube sampling,java 代码
热门文章
- Linux/ubuntu 服务器开启6010端口-X11服务-ssh连接
- Linux/ubuntu server 18.04 安装远程桌面--vnc server
- fusioncompute中cpu可以设置的qos参数有哪些?_kubernetes 中 Qos 的设计与实现
- es写入数据的工作原理是什么啊?es查询数据的工作原理是什么啊?
- kafka数据丢失的场景
- C++_泛型编程与标准库(六)
- java 商城 jfinal,Jfinal开发农副产品电子商城系统,完整前后台系统
- IBInspectable / IBDesignable
- Android Fragment 基本介绍
- openwrt配置内核驱动_openwrt增加内核模块的方法