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 = ;
Integer b = ;
Integer c = ;
Integer d = ;
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 >= ;
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 = -;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = ;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, );
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -);
}
high = h;
cache = new Integer[(high - low) + ];
int j = low;
for(int k = ; 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();
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();
}
在遍历时删除元素也是比较常用的操作,但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平时需要注意的事项的更多相关文章
- 2015/12/29 Java语言概述 操作中注意事项
java语言概述 ①版本分类:JavaSE 标准版 桌面开发 JavaEE 企业版 网络开发 JavaME 移动版 嵌入式开发(塞班系统 ...
- java编写规范及注意事项
java编写规范及注意事项 1.注释 常见注释有三种 // /**/ /****/ 如何才能写出漂亮的注释呢,注释的目的就是为了使你的代码让人更容易理解和维护,写一手好的注释是一个优秀码农的基本 ...
- java单例模式使用及注意事项
1. 说明 1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例 2)单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstan ...
- Java的多态及注意事项
什么是多态: 多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序.在Java中,所有的方法都是通过动态绑定实现多态的.将一个方法调用同一个方法主体关联起来被称作绑定.动态绑定的含义是在运行 ...
- java异常及日志注意事项
一.异常注意事项 简单整理了下关于异常的规范: 1) 在异常处理模块中应提供精确.易读的错误原因信息. 2) 不要处理能够避免的异常. 3) 一个方法不应该抛出太多类型的 ...
- java BigDecimal解析及注意事项
BigDecimal简介 JDK文档(中文)中的解释如下: 不可变的.任意精度的有符号十进制数.BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成.如果为零或 ...
- Java常量定义需要注意事项及static作用(复习)
在任何开发语言中,都需要定义常量.在Java开发语言平台中也不例外.不过在Java常量定义的时候,跟其他语言有所不同.其有自己的特色.在这篇文章中,主要针对Java语言中定义常量的注意事项进行解析,帮 ...
- Java集合XMind与注意事项
Java中集合使用时的几个注意事项: 1.ArrayList和HashMap都具有扩容 ArrayList初始化数组长度为10,扩容后的容量为原来的1.5倍. HashMap初始化的数组长度为16,扩 ...
- 【转】 java web开发之安全事项
从事java web开发也有几年了,可是开发中的安全问题却越来越不以为然.直到不久遇到一黑软,瞬间sql注入,少时攻破网站数据库.还好,我还没有用root级的用户连接数据库.不过也没有什么用了,因为我 ...
随机推荐
- Python阶段复习 - part 1 - Python基础练习题
1.实现1-100的所有的和 # 方法1: sum = 0 for i in range(1,101): sum += i print(sum) # 方法2: num1 = int(input('请输 ...
- aiohttp/asyncio 小例子和解释
#!/usr/bin/env python # encoding: utf-8 import aiohttp import asyncio import time # 通过async def定义的函数 ...
- 【bzoj2212&3702】二叉树
线段树合并入门题. 分别计算左子树的逆序对,右子树的逆序对,合并的时候计算贡献. #include<bits/stdc++.h> #define N 8000005 using names ...
- [ Linux 命令 ] awk
一.AWK简介 awk:报告生成器,是以行为单位进行处理,并格式化后显示 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说a ...
- 关于transform的属性
transfrom的出现让许多静态的东西动了起来,让网页更加具有生命力. 在transform属性中,transform-origin属性仅是其中之一,要彻底理解transform属性,这是不够的,必 ...
- Webpack指南(一):安装,创建项目,配置文件,开发环境以及问题汇总
Webpack是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency gra ...
- linux常用命令 ps
linux常用命令 ps Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些线程的快照,就是执行ps命令的那个时刻的那些进程 ...
- 学习OpenResty编程
1.Windows版本的下载位置 https://github.com/LomoX-Offical/nginx-openresty-windows Linux下OpenResty的下载和安装 http ...
- Bootstrap模态框垂直居中展示的方法
在bootstrap.js中加入以下代码:
- AC日记——Collectors Problem uva 10779
UVA - 10779 思路: 最大流: s向所有的贴纸的种类连边,流量为Bob拥有的数量: 然后,Bob的朋友如果没有这种贴纸,则这种贴纸向bob的朋友连边,容量1: 如果bob的朋友的贴纸很多大于 ...