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。

再看Java基本类型的更多相关文章

  1. 再看Java之温故知新(体系篇)

    一 数据类型 1.1 8种基本数据类型 1.2 引用数据类型 1.3 java内存机制 1.3.1 寄存器 1.3.2 栈 1.3.3 堆 1.3.4. 静态区/方法区 1.3.5. 运行时常量池(R ...

  2. 再看 Java 中的单例

    此前面试遇到了单例问题,本以为已经背的滚瓜烂熟,没想到被问单例如何避免被反射和序列化破坏,虽然后来还是等到了通知,但还是复习一下单例的实现方式,并学习防止反射和序列化破坏的手段. 基本实现方式 其他相 ...

  3. java 枚举类型分析

    最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...

  4. 从Decorator,Adapter模式看Java的IO库

    我想任何一本介绍模式的书在讲到Decorator模式的时候不能不提到它的实际应用--在Java/IO库里面的应用,<<Java与模式>>这本书也不例外,有点不一样的是,这本书在 ...

  5. 再探Java基础——String.format(String format, Object… args)的使用

    最近看到类似这样的一些代码:String.format("参数%s不能为空", "birthday"); 以前还没用过这功能不知咐意思,后研究了一下,详细讲解如 ...

  6. 再探java基础——break和continue的用法

    再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...

  7. Java虚拟机类型卸载和类型更新解析(转)

    转自:http://www.blogjava.net/zhuxing/archive/2008/07/24/217285.html [摘要]          前面系统讨论过java 类型加载(loa ...

  8. 记一次synchronized锁字符串引发的坑兼再谈Java字符串

    问题描述 业务有一个需求,我把问题描述一下: 通过代理IP访问国外某网站N,每个IP对应一个固定的网站N的COOKIE,COOKIE有失效时间.并发下,取IP是有一定策略的,取到IP之后拿IP对应的C ...

  9. 记一次 synchronized 锁字符串引发的坑兼再谈 Java 字符串

    业务有一个需求,我把问题描述一下: 通过代理IP访问国外某网站N,每个IP对应一个固定的网站N的COOKIE,COOKIE有失效时间. 并发下,取IP是有一定策略的,取到IP之后拿IP对应的COOKI ...

随机推荐

  1. linphone-android-客户端APP-工程解读

    LinphoneLauncherActivity 是APP的入口组件,在这个组件里,它会启动LinphoneService这个后台服务,然后不断地判断这个后台服务是否已经启动完毕,如果已经启动完毕后, ...

  2. 对于hive使用的一点记录

    最近一段时间因工作需要接触了一些hive上的使用!当然大部分都是比较基本的使用,仅当入门!各位看到有不足之处望多多指正! 废话不多说,开始: 首先是创建数据库 create database '数据库 ...

  3. i++是否原子操作?并解释为什么?

    都不是原子操作.理由: 1.i++分为三个阶段: 内存到寄存器寄存器自增写回内存这三个阶段中间都可以被中断分离开.  2.++i首先要看编译器是怎么编译的, 某些编译器比如VC在非优化版本中会编译为以 ...

  4. 利用PHPExcel导出Excel并设置Excel格式以及数据源

    浏览:23969 发布日期:2013/07/24 分类:技术分享 代码有点长,读起来有点累.先来个截图 导出的Excel太宽了,所以将后面的列宽重新调整了再截的图 功能包括: 1.设置单元格格式,包括 ...

  5. 配置shiro错误

    在web配置工程中配置shiro,如果启动Tomcat,报错:org.apache.shiro.web.config.WebIniSecurityManagerFactory.setDefaults ...

  6. 监控服务器ssh登录,并发送报警邮件

    最近想监控下云主机的ssh登录情况,所以开始写ssh登录报警监控.实现方式并不难. 一:邮箱申请开启SMTP 在邮箱中选择“设置”----->“账户” 在如下图处开启POP3/SMTP服务,并生 ...

  7. SQLServer分页查询模板

    SELECT TOP 10 * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM ERPTelFile ) A WHE ...

  8. mybatis-XML配置文件

    <?xml version="1.0" encoding="UTF-8" ?><!--plugins在配置文件中的位置必须要符合要求,否则会报 ...

  9. git 签出(恢复)指定文件

    在项目开发中,偶尔会因为误删文件或其他原因需要从git仓库中恢复某些文件.此篇文章将介绍如何通过git从历史提交记录.分支记录恢复指定文件. 1. git checkout 说明:使用git chec ...

  10. Django_xamin注册model错误

    可能出现的错误: 1. xadmin.sites.AlreadyRegistered: The model UserProfile is already registered 2. error:Fie ...