再看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。
再看Java基本类型的更多相关文章
- 再看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 ...
- 再看 Java 中的单例
此前面试遇到了单例问题,本以为已经背的滚瓜烂熟,没想到被问单例如何避免被反射和序列化破坏,虽然后来还是等到了通知,但还是复习一下单例的实现方式,并学习防止反射和序列化破坏的手段. 基本实现方式 其他相 ...
- java 枚举类型分析
最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...
- 从Decorator,Adapter模式看Java的IO库
我想任何一本介绍模式的书在讲到Decorator模式的时候不能不提到它的实际应用--在Java/IO库里面的应用,<<Java与模式>>这本书也不例外,有点不一样的是,这本书在 ...
- 再探Java基础——String.format(String format, Object… args)的使用
最近看到类似这样的一些代码:String.format("参数%s不能为空", "birthday"); 以前还没用过这功能不知咐意思,后研究了一下,详细讲解如 ...
- 再探java基础——break和continue的用法
再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...
- Java虚拟机类型卸载和类型更新解析(转)
转自:http://www.blogjava.net/zhuxing/archive/2008/07/24/217285.html [摘要] 前面系统讨论过java 类型加载(loa ...
- 记一次synchronized锁字符串引发的坑兼再谈Java字符串
问题描述 业务有一个需求,我把问题描述一下: 通过代理IP访问国外某网站N,每个IP对应一个固定的网站N的COOKIE,COOKIE有失效时间.并发下,取IP是有一定策略的,取到IP之后拿IP对应的C ...
- 记一次 synchronized 锁字符串引发的坑兼再谈 Java 字符串
业务有一个需求,我把问题描述一下: 通过代理IP访问国外某网站N,每个IP对应一个固定的网站N的COOKIE,COOKIE有失效时间. 并发下,取IP是有一定策略的,取到IP之后拿IP对应的COOKI ...
随机推荐
- UVa 11461 - Square Numbers【数学,暴力】
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- HDU_5523Game
Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Sub ...
- 【转自知乎】:localhost、127.0.0.1 和 本机IP 三者的区别?
作者:知乎用户链接:https://www.zhihu.com/question/23940717/answer/26230963来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- Spark算子--partitionBy
转载请标明出处http://www.cnblogs.com/haozhengfei/p/923b11fce561e82748baa016bcfb8421.html partitionBy--Trans ...
- iOS学习——键盘弹出遮挡输入框问题解决方案
在iOS或Android等移动端开发过程中,经常遇到很多需要我们输入信息的情况,例如登录时要输入账号密码.查询时要输入查询信息.注册或申请时需要填写一些信息等都是通过我们键盘来进行输入的,在iOS开发 ...
- 如何利用vue和php做前后端分离开发?
新手上路,前端工程师,刚毕业参加工作两个月,上面让我用vue搭建环境和php工程师一起开发,做前后端分离,然而我只用过简单的vue做一些小组件的经验,完全不知道怎样和php工程师配合,ps: php那 ...
- 如何设置让网站禁止被爬虫收录?robots.txt
robot.txt只是爬虫禁抓协议,user-agent表示禁止哪个爬虫,disallow告诉爬出那个禁止抓取的目录. 如果爬虫够友好的话,会遵守网站的robot.txt内容. 一个内部业务系统,不想 ...
- bootstrap 响应式图片自适应图片大小
<img src="..." class="img-responsive center-block" > 或者 $(window).load(fun ...
- struts异常:Caused by: Parent package is not defined: json-default - [unknown location]解决办法
问题描述: Unable to load configuration. - [unknown location] at com.opensymphony.xwork2.config.Configura ...
- 前端之CSS介绍--选择器
一.CSS简介 介绍 css我们称呼层叠样式表(英文全称:Cascading Style Sheets).它是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等 ...