【Java咬文嚼字】关键字(二):八个基本数据类型
本次谈谈java中的基本数据类型。java中8个基本数据类型说多不多说少也不少,相对简单的记忆方式:整数型(byte,short,int,long)、浮点型(float,double)、逻辑型(boolean)、字符(char)。
java基本类型简介:
类型 | 所占空间(bit) | 所占空间(byte) | 取值范围 | 对应的装箱基本类型 | 基本类型大小判断 |
byte | 8bit | 1byte | -128~127 | Byte | >、<、==等 |
short | 16bit | 2byte | -32768~32767 | Short | >、<、==等 |
int | 32bit | 4byte | -(2^31)~(2^31)-1 | Integer | >、<、==等 |
long | 64bit | 8byte | -(2^63)~(2^63)-1 | Long | >、<、==等 |
float | 32bit | 4byte | (+-)3.402823447E+38F | Float | Float.compare()或Double.compare() |
double | 64bit | 8byte | (+-)1.79769313486231570E+308 | Double | Double.compare() |
boolean | 1bit | 1/8byte | 0、1 | Boolean | 无 |
char | 16bit | 2byte | 0~(2^16)-1 | Char | >、<、==等 |
基本类型&引用类型:
基本类型之所以叫基本类,是因为其数据能够在方法的栈空间中分配;相对应的引用类型是不能够在方法的栈空间中分配,而在堆空间中分配的。栈在性能上高于堆。这里的前提是方法的栈空间,类对象中基本类型域还是分配在堆空间中。
各自对应的装箱基本类型就是属于引用类型,封装相应的装箱基本类型是比较必要。
值传递or引用传递?:
所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
在c/c++是存在引用传递,但是java中没有引用传递(具体看:http://guhanjie.iteye.com/blog/1683637这位博主总结的还是不错的)
public class Test {
private int id; static Test test1;
static Test test2 = new Test(); static public void main(String[] args) { test2.id = 13;
System.out.println("doTest:");
System.out.println("test1 is " +test1);
doTest(test1);
System.out.println("test1 is " +test1);
System.out.println("########################");
System.out.println("test2 is " +test2);
doTest(test2);
System.out.println("test2 is " +test2);
} static private void doTest(Test test) {
System.out.println("start doTest:");
if (test == null) {
test = new Test();
}
test.id = 31;
System.out.println("test is " +test);
System.out.println("end doTest.");
} @Override
public String toString() {
return ""+this.id;
}
}
如果是引用传递那么其在函数中对参数的所进行的修改,将影响到实际参数。所以打印的结果应该是:
doTest:
test1 is null
start doTest:
test is 31
end doTest.
test1 is
########################
test2 is 13
start doTest:
test is 31
end doTest.
test2 is 31
但是现实容易打脸:
可以看到test1在执行完doTest之后还是null.即没用影响实际参数。但是为什么test2受到影响了呢?
那么真正的引用传递是如何的呢?这里为了方便查看打印出变量的地址。(在线编译器地址:http://codepad.org/)
#include <iostream>
using namespace std; struct Test {
int id;
}test1,test2={}; void doTest(Test &test) {
cout<<"start doTest:"<<endl;
cout<<"test address:"<<&test<<endl;
test.id = ;
cout<<"test is " <<test.id<<endl;
cout<<"end doTest."<<endl;
} int main() {
cout<<"doTest:"<<endl;
cout<<"test1 is " <<test1.id<<endl;
cout<<"test1 address:"<<&test1<<endl;
doTest(test1);
cout<<"test1 is " <<test1.id<<endl;
cout<<"########################"<<endl;
cout<<"test2 is " <<test2.id<<endl;
cout<<"test2 address:"<<&test2<<endl;
doTest(test2);
cout<<"test2 is " <<test2.id<<endl;
return ;
}
地址是一样的。。。。(c忘光了,不敢随便分析一下其内存分配,海涵)
这里给出java模型:
这里的test与test2没直接的关系,唯一相同的就是都引用了堆中地址为AAAA的Test对象
基本类型Or装箱基本类型:
这里探讨基本类型与装箱类型的应用场景:
1、能用基本类型就绝不用装箱类型,我的准则而言。基本类型在性能上远远优于装箱基本类型。
import java.util.*; public class Test {
static public void main(String[] args) {
double startTime = System.currentTimeMillis();
Long L = 0l;
for (int i = 0; i < Integer.MAX_VALUE; i++) {
L += 1;
}
double endTime = System.currentTimeMillis();
System.out.printf("装箱基本类型耗时:%f%n", (endTime - startTime)); startTime = System.currentTimeMillis();
long l = 0l;
for (int i = 0; i < Integer.MAX_VALUE; i++) {
l += 1;
}
endTime = System.currentTimeMillis();
System.out.printf("装箱基本类型耗时:%f%n", (endTime - startTime));
}
}
代码角度建议能不用装箱基本类型就不用或者减少装箱拆箱次数
2、泛型中只能使用装箱基本类型。原因:存在类型擦除的,将类型都替换成顶级父类(Object)。
装箱基本类型出现的必然性:
java作为一门面向对象的编程语言,各种编程逻辑应该都是基于对象。装箱基本类型的出现,使得各种逻辑更加便捷易懂,基本类型中的各种逻辑划分更加明了清晰。(还有挺多的不总结啦。。。)
譬如:int的边界直接定义在Integer中作为静态常量,long的边界直接定义在Long中作为静态常量;两者各司其职互不影响。
【Java咬文嚼字】关键字(二):八个基本数据类型的更多相关文章
- Java基础(二):基本数据类型和变量类型
一.java基本数据类型: 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间.内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. Java 的两 ...
- 由java的八个基本数据类型说开去
Java中定义了四类/八种基本数据类型: 布尔型----boolean 字符型----char 整数型----byte,short,int,long 浮点型----float,double 这八种基本 ...
- JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用
JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据 ...
- Java入门(二):注释和基本数据类型
上次通过eclipse在控制台输出了hello world,是不是有点小激动啊,今天接着介绍Java基础知识. 一.Java注释 1.Java注释语句不会被编译器运行,不用担心代码因为许多注释语句显得 ...
- java 八种基本数据类型之初始值、取值范围、对应的封装类
CreateTime--2017年12月6日10:03:53 Author:Marydon 一.java数据类型之基本数据类型 (二)八种基本数据类型的特征 import java.math.Bi ...
- java 八种基本数据类型之与对应的封装类之间的相互转化
迁移时间--2017年5月26日17:47:37 Author:Marydon 一.java数据类型之基本数据类型 UpdateTime--2017年1月9日17:31:14 (三)格式转换 1. ...
- Java学习笔记四:Java的八种基本数据类型
Java的八种基本数据类型 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. Java基本类型共有八种,基本类型可以分为三类,字符类型char,布 ...
- Java四类八项基本数据类型
一. 四类八项基本数据类型 1. 整数类型(byte.short.int.long) 三点注意事项: a. Java各整数类型有固定的表示范围和字段长度,其不收操作系统的影响,以保持Java的可移植性 ...
- 【转】Java八种基本数据类型的比较及其相互转化
java中有且仅有八种基本数据类型,记住就行,共分为四类: 第一类:整型-->byte short int long 第二类:浮点-->float doub ...
随机推荐
- HDU 1114 iggy-Bank(完全背包)
水 给出小猪钱罐的重量和装满钱后的重量,然后是几组数据,每组数据包括每种钱币的价值与重量 要求出重量最少能装满钱罐时的最大价值 #include<iostream> #include< ...
- 微软的无限存储空间-OneDrive
10 月 28 日消息,微软今天宣布为所有 Office 365 的用户提供无上限的云存储服务,也就是 OneDrive 存储空间将从目前的 1TB 变成无上限,而且无需支付额外费用.这意味着曾经困扰 ...
- 合并多行查询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数 (转)
转自: http://www.cnblogs.com/aolin/archive/2011/04/12/2014122.html 示例表 tb 数据如下 id value—————1 aa1 bb2 ...
- Galgame引擎编写,图像层
BG类层,立绘层,字符层,ui层.目前还没有好的方法将这些层统一为一种概念,排序也没有考虑,Game逻辑部分管理BG, ACTOR层. typedef enum { SF_BAD = -, SF_HI ...
- 路由器中pppoe,动态IP,静态IP的区别
路由器中pppoe,动态IP,静态IP的区别 要把路由器设置得能上网,无非就是设置WAN外网接口连接而已.WAN接口能上网,则连接的电脑就能上网,反之则上不了网.只不过WAN接口往往有pppoe,动态 ...
- POJ-3468 A Simple Problem with Integers Splay Tree区间练习
题目链接:http://poj.org/problem?id=3468 以前用线段树做过,现在用Splay Tree A了,向HH.kuangbin.cxlove大牛学习了各种Splay各种操作,,, ...
- 关于sqlite数据库
firedac数据引擎可以支持sqlite数据库,这种方式是纯绿色的,发布时不需要带上官方的sqlite.dll动态链接库文件. 当然调用该动态链接库的API方法也是可以操作sqlite数据库的,这样 ...
- ios 开发选取头像,图片库,相机,裁取图片
需要遵守的代理协议:UIActionSheetDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate @prop ...
- javascript中使用md5函数
javascript中使用md5函数 这对于js来讲本来是没有的,现在可以自己定义一个md5的函数,达到加密效果. var hexcase = 0; function hex_md5(a) { if ...
- Unicode和字符集小结
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Unicode和字符集小结.