Java中的基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。
数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型是有符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。
先看看各种类型所占的字节长度,long型和double型都占8个字节,float和int占4个字节,short和char占2个字节,byte占1个字节,boolean型的占一个bit。
Java中的基本类型又都有对应的一个封装类,如int所对应的Integer,适用于要求参数是对象的情况。
下面是一些使用基本类型需要注意的细节:
1.java的数值是有符号的,不要忘了还要考虑负数
判断一个数是不是奇数,
if( i % 2 == 1){
...
}
如果i是负数,i%2 的结果将是-1.应该是写成:
if( i%2 ! =0){
}
2.如果使用小数,默认的将是double类型,要使用float类型,应该显示的指明小数的类型
float f = 1.24f;
3.小数都可能会有精度的丢失,使用float和double做小数计算时可能都会碰到这样的问题,如果就是需要精确地计算,可以考虑使用BigDicemal,整型对应的是BigInteger。这里要用的是new BigDicemal(String)而不能用new BigDicemal(double),否则在构造BigDicemal之前就已经丢失了精度,这是需要注意的。
System.out.println(2.0f - 1.1f);
System.out.println(2.0d - 1.1d);
float f = 20014999;
System.out.println(f);
float型所占用内存
double型所占用的内存
整数可以用二进制精确地表示 ,但小数就不一定了。关于小数到二进制的转换,可以参考:http://www.blogjava.net/jelver/articles/340038.html
下面是BigDicemal的一个封装类,来自网上,需要使用时直接调用方法即可。
import java.math.BigDecimal; public class Utils { /** 精度 */ private static final int DEF_DIV_SCALE = 10; /** * 加,BigDecimal用 * * @param v1 * @param v2 * @return result */ public static BigDecimal add(Object v1, Object v2) { BigDecimal result = null; BigDecimal b1 = new BigDecimal(v1.toString()); BigDecimal b2 = new BigDecimal(v2.toString()); result = b1.add(b2); return result; } /** * 减,BigDecimal用 * * @param v1 * @param v2 * @return result */ public static BigDecimal sub(Object v1, Object v2) { BigDecimal result = null; // if(v1!=null && v2!=null){ BigDecimal b1 = new BigDecimal(v1.toString()); BigDecimal b2 = new BigDecimal(v2.toString()); result = b1.subtract(b2); // } return result; } /** * 乘,BigDecimal用 * * @param v1 * @param v2 * @return result */ public static BigDecimal mul(Object v1, Object v2) { BigDecimal result = null; // if(v1!=null && v2!=null){ BigDecimal b1 = new BigDecimal(v1.toString()); BigDecimal b2 = new BigDecimal(v2.toString()); result = b1.multiply(b2); // } return result; } /** * 除,BigDecimal用 * * @param v1 * @param v2 * @return result */ public static BigDecimal div(Object v1, Object v2) { BigDecimal result = null; BigDecimal b1 = new BigDecimal(v1.toString()); BigDecimal b2 = new BigDecimal(v2.toString()); result = b1.divide(b2); return result; } /** * * @param v1 * @param v2 * @param scale * @return result */ public static BigDecimal div(Object v1, Object v2, int scale) { BigDecimal result = null; if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1.toString()); BigDecimal b2 = new BigDecimal(v2.toString()); result = b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP); return result; } public static BigDecimal round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one, scale, BigDecimal.ROUND_HALF_UP); } }
4. char类型占2个字节,可以表示中文字符,基于正则表达式判断字符是否是中文字符的方法如下,判断依据是字符的
Unicode编码(CJK统一汉字的编码区间:0x4e00–0x9fbb)的正则来做判断,但是其实这个区间来判断中文不是非常精确,因为有些中文的标点符号比如:,。等等是不能识别的。
以下是比较完善的判断方法:CharUtil.java
http://www.micmiu.com/lang/java/java-check-chinese/
import java.util.regex.Pattern; public class CharUtil { public static void main(String[] args) { String[] strArr = new String[] { "www.micmiu.com", "!@#$%^&*()_+{}[]|"'?/:;<>,.", "!¥……()——:;“”‘’《》,。?、", "不要啊", "やめて", "韩佳人", "???" }; for (String str : strArr) { System.out.println("===========> 测试字符串:" + str); System.out.println("正则判断结果:" + isChineseByREG(str) + " -- " + isChineseByName(str)); System.out.println("Unicode判断结果 :" + isChinese(str)); System.out.println("详细判断列表:"); char[] ch = str.toCharArray(); for (int i = 0; i < ch.length; i++) { char c = ch[i]; System.out.println(c + " --> " + (isChinese(c) ? "是" : "否")); } } } // 根据Unicode编码完美的判断中文汉字和符号 private static boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) { return true; } return false; } // 完整的判断中文汉字和符号 public static boolean isChinese(String strName) { char[] ch = strName.toCharArray(); for (int i = 0; i < ch.length; i++) { char c = ch[i]; if (isChinese(c)) { return true; } } return false; } // 只能判断部分CJK字符(CJK统一汉字) public static boolean isChineseByREG(String str) { if (str == null) { return false; } Pattern pattern = Pattern.compile("[\u4E00-\u9FBF]+"); return pattern.matcher(str.trim()).find(); } // 只能判断部分CJK字符(CJK统一汉字) public static boolean isChineseByName(String str) { if (str == null) { return false; } // 大小写不同:\p 表示包含,\P 表示不包含 // \p{Cn} 的意思为 Unicode 中未被定义字符的编码,\P{Cn} 就表示 Unicode中已经被定义字符的编码 String reg = "\p{InCJK Unified Ideographs}&&\P{Cn}"; Pattern pattern = Pattern.compile(reg); return pattern.matcher(str.trim()).find(); } }
5.java的加法运算符只有当一个参数是字符串时才会做字符串拼接的操作,否则就是数值计算。
System.out.println('a' + 'A')的结果将是162,而不是aA。