再看Java基本类型

  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。

原文地址:https://www.cnblogs.com/lnlvinso/p/4035072.html