本次谈谈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这位博主总结的还是不错的)

  1. public class Test {
  2. private int id;
  3.  
  4. static Test test1;
  5. static Test test2 = new Test();
  6.  
  7. static public void main(String[] args) {
  8.  
  9. test2.id = 13;
  10. System.out.println("doTest:");
  11. System.out.println("test1 is " +test1);
  12. doTest(test1);
  13. System.out.println("test1 is " +test1);
  14. System.out.println("########################");
  15. System.out.println("test2 is " +test2);
  16. doTest(test2);
  17. System.out.println("test2 is " +test2);
  18. }
  19.  
  20. static private void doTest(Test test) {
  21. System.out.println("start doTest:");
  22. if (test == null) {
  23. test = new Test();
  24. }
  25. test.id = 31;
  26. System.out.println("test is " +test);
  27. System.out.println("end doTest.");
  28. }
  29.  
  30. @Override
  31. public String toString() {
  32. return ""+this.id;
  33. }
  34. }

如果是引用传递那么其在函数中对参数的所进行的修改,将影响到实际参数。所以打印的结果应该是:

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/)

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct Test {
  5. int id;
  6. }test1,test2={};
  7.  
  8. void doTest(Test &test) {
  9. cout<<"start doTest:"<<endl;
  10. cout<<"test address:"<<&test<<endl;
  11. test.id = ;
  12. cout<<"test is " <<test.id<<endl;
  13. cout<<"end doTest."<<endl;
  14. }
  15.  
  16. int main() {
  17. cout<<"doTest:"<<endl;
  18. cout<<"test1 is " <<test1.id<<endl;
  19. cout<<"test1 address:"<<&test1<<endl;
  20. doTest(test1);
  21. cout<<"test1 is " <<test1.id<<endl;
  22. cout<<"########################"<<endl;
  23. cout<<"test2 is " <<test2.id<<endl;
  24. cout<<"test2 address:"<<&test2<<endl;
  25. doTest(test2);
  26. cout<<"test2 is " <<test2.id<<endl;
  27. return ;
  28. }

地址是一样的。。。。(c忘光了,不敢随便分析一下其内存分配,海涵)

这里给出java模型:

这里的test与test2没直接的关系,唯一相同的就是都引用了堆中地址为AAAA的Test对象

基本类型Or装箱基本类型:

这里探讨基本类型与装箱类型的应用场景:

1、能用基本类型就绝不用装箱类型,我的准则而言。基本类型在性能上远远优于装箱基本类型。

  1. import java.util.*;
  2.  
  3. public class Test {
  4. static public void main(String[] args) {
  5. double startTime = System.currentTimeMillis();
  6. Long L = 0l;
  7. for (int i = 0; i < Integer.MAX_VALUE; i++) {
  8. L += 1;
  9. }
  10. double endTime = System.currentTimeMillis();
  11. System.out.printf("装箱基本类型耗时:%f%n", (endTime - startTime));
  12.  
  13. startTime = System.currentTimeMillis();
  14. long l = 0l;
  15. for (int i = 0; i < Integer.MAX_VALUE; i++) {
  16. l += 1;
  17. }
  18. endTime = System.currentTimeMillis();
  19. System.out.printf("装箱基本类型耗时:%f%n", (endTime - startTime));
  20. }
  21. }

代码角度建议能不用装箱基本类型就不用或者减少装箱拆箱次数

2、泛型中只能使用装箱基本类型。原因:存在类型擦除的,将类型都替换成顶级父类(Object)。

装箱基本类型出现的必然性:

java作为一门面向对象的编程语言,各种编程逻辑应该都是基于对象。装箱基本类型的出现,使得各种逻辑更加便捷易懂,基本类型中的各种逻辑划分更加明了清晰。(还有挺多的不总结啦。。。)

譬如:int的边界直接定义在Integer中作为静态常量,long的边界直接定义在Long中作为静态常量;两者各司其职互不影响。

【Java咬文嚼字】关键字(二):八个基本数据类型的更多相关文章

  1. Java基础(二):基本数据类型和变量类型

    一.java基本数据类型: 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间.内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. Java 的两 ...

  2. 由java的八个基本数据类型说开去

    Java中定义了四类/八种基本数据类型: 布尔型----boolean 字符型----char 整数型----byte,short,int,long 浮点型----float,double 这八种基本 ...

  3. JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用

    JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据 ...

  4. Java入门(二):注释和基本数据类型

    上次通过eclipse在控制台输出了hello world,是不是有点小激动啊,今天接着介绍Java基础知识. 一.Java注释 1.Java注释语句不会被编译器运行,不用担心代码因为许多注释语句显得 ...

  5. java 八种基本数据类型之初始值、取值范围、对应的封装类

      CreateTime--2017年12月6日10:03:53 Author:Marydon 一.java数据类型之基本数据类型 (二)八种基本数据类型的特征 import java.math.Bi ...

  6. java 八种基本数据类型之与对应的封装类之间的相互转化

      迁移时间--2017年5月26日17:47:37 Author:Marydon 一.java数据类型之基本数据类型 UpdateTime--2017年1月9日17:31:14 (三)格式转换 1. ...

  7. Java学习笔记四:Java的八种基本数据类型

    Java的八种基本数据类型 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. Java基本类型共有八种,基本类型可以分为三类,字符类型char,布 ...

  8. Java四类八项基本数据类型

    一. 四类八项基本数据类型 1. 整数类型(byte.short.int.long) 三点注意事项: a. Java各整数类型有固定的表示范围和字段长度,其不收操作系统的影响,以保持Java的可移植性 ...

  9. 【转】Java八种基本数据类型的比较及其相互转化

    java中有且仅有八种基本数据类型,记住就行,共分为四类: 第一类:整型-->byte     short      int     long 第二类:浮点-->float    doub ...

随机推荐

  1. HW3.28

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  2. CodeForces Round #179 (295A) - Greg and Array

    题目链接:http://codeforces.com/problemset/problem/295/A 我的做法,两次线段树 #include <cstdio> #include < ...

  3. leptonica使用问题

    想要使用leptonica编写一个图像处理程序,或者调用leptonica/prog下例子程序,出现类似错误: leptTest ./test Error in pixReadStreamJpeg: ...

  4. [delphi技术]Delphi常见图象格式转换技术

    TJPEGScale = (jsFullSize, jsHalf, jsQuarter, jsEighth);//图片大小(全部,1/2,1/4,1/8)TBitmap.pixelFormat:=pf ...

  5. Altium Designer 多通道设计

    转chenzelin2009的csdn博客:http://blog.csdn.net/chenzelin2009/article/details/5751251# Altium Designer的多图 ...

  6. hdu 3724 Encoded Barcodes

    Trie模板.把所有单词都用字典树存起来,然后给每个节点赋权值表示前缀到该节点出现了几次.然后直接查询就可以了. #include <algorithm> #include <ios ...

  7. bootstrap折叠修改hover

    $('div.panel-collapse').on('shown.bs.collapse hidden.bs.collapse', function() { $(this).dequeue('col ...

  8. ios8 关于UIAlertController 代替UIActionsheet

    self.alertController=[UIAlertController alertControllerWithTitle:@"请选择\n\n\n\n\n\n\n\n\n\n\n\n\ ...

  9. 【转】C++中多重继承的二义性及解决办法

    转自:http://www.cnblogs.com/lintong/archive/2012/07/28/2613002.html 1. 什么是多重继承的二义性 class A{ public: vo ...

  10. Mac下安装cocos2d-x环境

    安装后xcode之后,下载cocos2dx压缩包,解压 通过中断cd到cocos2dx文件夹内 输入下行命令 sudo ./install-templates-xcode.sh 执行成功后打开xcod ...