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平时需要注意的事项相关推荐

  1. java异常及日志注意事项

    java异常及日志注意事项 参考文章: (1)java异常及日志注意事项 (2)https://www.cnblogs.com/lq147760524/p/8475531.html 备忘一下.

  2. 关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了

    关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了

  3. 写java代码时的注意事项_从方法返回Java 8的可选项时的注意事项

    写java代码时的注意事项 Java 8引入的Optional类一直是该语言版本引入的最具争议的功能之一. 尽管我喜欢这个新的Java类的东西比不喜欢的东西多,但在Java方法中将其用作return类 ...

  4. java 上传文件注意事项

    java 上传文件注意事项 1.文件名有特殊字符的情况,所以最好是文件名前台url编码,后台再url解码,这点在下载的时候也一样 2.文件大小一定要设置,spring boot 有默认. 3.文件名校 ...

  5. Java开发规范及注意事项

    文章目录 Java开发规范及注意事项 编程规约 异常日志违约 单元测试规约 工程结构规约 数据库规约 Java开发规范及注意事项 编程规约 POJO类中布尔类型的变量,都不要加is前缀,否则部分框架解 ...

  6. 关于 Delphi跨平台开发Android调用 JNI JAR java 的说明和注意事项

    2Pascal-新时代的Pascal-关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了 - Powered by Discuz! 关于 调用 JNI JAR 的说明和注意事项 ...

  7. java北大青鸟试题_10个常见2020春招Java面试题及注意事项!

    春招开始啦,在面试Java工程师的时候,同学们会经常会遇到一些很困扰的问题:感觉自己的Java技术能力还不错,甚至是游刃有余,但是到了面试的时候就凉凉:对面试官提出的问题感到迷惑,不理解面试官到底是想 ...

  8. java后端需要注意的事项_【后端开发】Java中关于null的含义以及使用中要注意的事项...

    下面小编就为大家带来一篇浅谈java中null是什么,以及使用中要注意的事项.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.null既不是对象也不是一种类型,它仅是 ...

  9. java单例模式使用及注意事项

    1. 说明 1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例 2)单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstan ...

最新文章

  1. spring Transaction Propagation 事务传播
  2. [网络安全自学篇] 三十一.文件上传之Upload-labs靶场及CTF题目01-10(四)
  3. 电脑上装蓝牙_指甲盖变触控板,隔空就能操控手机和电脑!
  4. C# 的扩展方法在 LINQ 中实现数组排序
  5. win7下安装pip——Python的包管理工具
  6. 前端学习(2738):重读vue电商网站48之通过 chainWebpack 自定义打包入口
  7. Z-Blog 扩展数据库 字段 二次开发
  8. 用随机梯度下降来优化人生
  9. CTS(5)---Android8.0中CTS测试对于TEE的要求
  10. Rivian计划在乔治亚州新增一个工厂
  11. 后台接收数组_腾讯C++后台开发面试笔试知识点参考笔记
  12. 2019写给对象的话_数组方法写给女友的一系列 JS 数组操作(建议收藏 | 内附思维导图)...
  13. 编程基础(五)—— 虚拟内存
  14. 如何根治BYOD中国式“水土不服”
  15. 【Java面试题】这道分布式面试题一定要拿下,说说你对CAP的理解?看看高手如何回答
  16. 易用宝项目记录day4-代码生成器
  17. python怎样控制继电器_使用Python和树莓派控制跨阵M2继电器通断
  18. 攻防世界-logmein
  19. linux裸设备详解,Linux裸设备管理详解(原创)
  20. 拉丁超立方抽样 Latin hypercube sampling,java 代码

热门文章

  1. Linux/ubuntu 服务器开启6010端口-X11服务-ssh连接
  2. Linux/ubuntu server 18.04 安装远程桌面--vnc server
  3. fusioncompute中cpu可以设置的qos参数有哪些?_kubernetes 中 Qos 的设计与实现
  4. es写入数据的工作原理是什么啊?es查询数据的工作原理是什么啊?
  5. kafka数据丢失的场景
  6. C++_泛型编程与标准库(六)
  7. java 商城 jfinal,Jfinal开发农副产品电子商城系统,完整前后台系统
  8. IBInspectable / IBDesignable
  9. Android Fragment 基本介绍
  10. openwrt配置内核驱动_openwrt增加内核模块的方法