python中常用数据类型,python常见变量数据类型

  python中常用数据类型,python常见变量数据类型

  Java变量的变量数据类型Java数据类型图:

  1.基本数据类型基本数据类型也称为内置类型,可以直接在堆栈上分配内存。Java保留基本数据类型的最大原因也在这里:性能。可以参考:Java为什么需要保留基本数据类型。

  另外需要注意的是,Java是基于JVM的,所以它的字节是固定的,不考虑机器平台,所有的地方都统一占用内存大小(布尔除外,使用byte/short/boolean数组时每个单元占用的内存由每个JVM实现)。

  有四个类别和八种基本数据类型(注1):

  1).整数:所有有符号类型。

  1.byte: 1字节(8bit),高位为符号位,其余7位为数据位,范围为-2的7次方到-1的7次方(1111,1111~0111,1111),即-128~127(以下计算方法相同);

  注意:虽然byte type在语义上(逻辑上)占用1个字节,但实际上在JVM中被视为int,即实际占用32位4个字节,所以其运算效率与int没有区别,也是短的。之所以会有byte/short类型,是因为这些范围类型要在某些地方显式使用。其次,在byte[]数组中,JVM存储real 1字节,short[]2字节。(但是,有些JVM也有4字节和16位的byte[]数组)2。Short: 2字节(16位),高位为符号位,其余15位为数据位,范围从-2到2到15 -1,即-32768到32767;

  3.int: 4字节(32bit),范围从-2的31次方到-1的31次方;Java的默认整数类型,即:

  long l=0xfffffffffff//0x表示这个数是十六进制,0表示八进制。//编译器报错,因为右边缺省是int,但是超出了范围(如果不超出int的范围,//编译器会隐式的把int转换成long),所以报错(float中也会出现同样的错误)。事实也是如此:

  短s=123//(这个123也是int类型,其中=operation编译器可以隐式转换)s=s 123//编译器报错,那是因为s 1是int类型(编译器先把S转换成int,再转换成1)。//这里运算编译器不能隐式转换(会提示失真,即精度可能受损)。正确的做法是:s=(short)(s 123)//注意,不是(short)s 123。有关类型转换的详细信息,请参阅:Java数据类型转换。

  4.Long: 8字节(64bit),范围从-2到2的63次方到-1;声明一个大型long方法:

  long l=0xfffffffffffL//就是在它后面加L或者L。//(cast:long l=(long)0x fffffffffff也没用)2)。浮点型

  5.FLOAT: 4字节(32bit),单精度,数据范围:(-2 128)~(-2(-23-126))-(0)-(2-149)~ 2 128。浮点数一般都是小数,但是这个需要精度,就是在这个区间内,float不能表示任何小数,但是在一定精度下,比如float有7~8个有效位(包括整数位和小数位,有效小数位是6~7,为什么这里是7~8(6~7)?参考:Java中float/double的范围和精度)。也就是0.123456789后面的9JVM是未知的(8可以识别,但是整数位是0,所以不是有效位。比如12.1234567后面的7是未知数,只有6位有效小数位(注意你看的是有效位,不是有效小数位,float有7~8位有效位),也就是:

  if(0.123456781 F==0.123456789 F){//注意后面加f/F,否则是double system . out . println( true );} else { system . out . println( false );}//打印结果:true//其实浮点值的比较不能直接用==来判断。这里,原因在于浮点数的内存结构。//浮点比较可以使用一个差值,但这种情况只是一个近似的比较。//如果要精确,可以使用bigdecimal system . out . println(float . min _ value);//1.4e-45=2-149//这里的“最小值”是指float能表示的最小十进制数。实际上float的最小值等于最大值,取负system . out . println(float . max _ value);////3.4028235 e38=2^128 6 . double:8:8字节(64位),双精度,范围:-2 1024 ~(-2(-1022-52))-0-(2-1074)~ 2 1024

  浮点f=1.23//编译报告了一个错误,因为float f=1.23f//或者float f=1.23F//默认为double,1.23(double)转换为float,做隐式转换。但是如果将double转换为float,精度会丢失,所以无法转换(详见Java数据类型转换)。//那为什么,int可以转换成byte和short,int的范围更大不是吗?//前面说了,byte和short在JVM上其实是int,所以编译器不会认为会损失精度。//但是int不能转换成boolean。虽然boolean也是4字节(一般JVM),但是在JVM中认为这些//完全是两个东西,当然不能转换(强制是不行的,不能强行把猫转换成鸟,完全是两个物种),而byte和short都是。

  7.char: 2字节(16位),代表一个字符(可以是汉字)。字符编码是Unicode(更准确的说,字符集(charset)是UCS-2,编码(encoding)是UTF-16),实际上是16位无符号整数。但是需要注意的是,随着发展,CHAR可以代表什么(更多信息,参考Unicode,UTF8/16: Unicode,UTF8和Java char。)

  char c=3 5;//正确,char是无符号整数,但不能这样。int a1=3;int a2=5;char c0=a1 a2//这里需要强制转换。char C1=-3;//编译错误,char不能表示负数,即使char C2=(char)-3;//编译正确,但无意义(乱码)char c3= 3//正确,输出字符3char c4= 3//编译错误,双引号,表示字符串char c5= 65//编译错误,这里65是两个字符4)。布尔代数学体系的

  8.boolean:逻辑上:1bit,但实际上对boolean并没有具体的规定。这完全取决于每个JVM的实现。但是《Java虚拟机规范》给出了4字节(用byte解释)和1字节布尔数组的定义。

  注1:

  (1).这种划分方法是一种流行的方法。其实应该是两种类型:数值型和布尔型。数值类型分为整型和浮点型。整数包括byte、short、int、long、char;浮点型:float,double;布尔布尔型。之所以认为char是整数,是因为char在JVM中是以无符号整数的形式存在的。

  (2).其实除了这八种类型和对象类型,Java中还有一种特殊的类型,就是Void。Java.lang.Void,占位类,不能实例化,持有Java关键字Void的类对象。为什么特别?明明是类,难道不是对象类型?那是因为虚空。Class.isPrimitive()(该方法用于判断一个类对象是否为基本类型)返回true,所以void是基本类型之一(错误),只不过它比较特殊,不是一种数据,而是一个符号。

  20160921改:以上是一个错误,混淆了虚空和虚空。其实我们可以简单的把两者的关系看成类似于包装类和基本类型的关系,像Integer和int的关系。java.lang.Void是一个未初始化的占位符类,用于保存引用java关键字Void的类对象:

  public static final class void TYPE=class . getprimitiveclass( void );和Integer有类似的说法:

  public static final class integer TYPE=(class integer)class . getprimitiveclass( int );不同的是,void只服务于Void,也就是所谓的占位符类,不用于其他用途。所以void类只是一个普通的类,Void可以看作是一个和int一样的基本类型。

  2.引用数据类型,也称为对象变量类型,是复合数据类型,包括类、接口和数组(除了基本类型,都是引用类型)。引用类型和基本类型的最大区别是:

  int a=5;//这里的A是一个对象(严格来说不是对象,只是一个符号),5是数值整数A=5;//这里A是引用,5是对象。比较形象常见的是:Object o=new Object();//o是引用(在堆栈中)new Object()是对象(在堆中)//在第二行代码中,5被自动包装为整数对象。这里的引用有点像C/C中的指针,但不像指针,你不能通过改变它的值来改变它所指向的值。也就是

  class a p=new class a();//C,这个时候可以这样做:p=p 1;//向前移动一个单位,Java不能//这种操作其实是对内存的直接操作。很明显,Java不允许程序员做这种操作。其本质是Java引用不支持对内存的直接操作,但指针可以。因此,Java使用起来更安全,但不够灵活。指针的自由度很大,但同时也要更加小心指针操作不当带来的各种内存问题。在Java中,任何对象都需要通过引用来访问。没有被引用指向的对象被视为垃圾对象,将被回收。

  引用本质上和指针一样(可以理解为受限指针),存储的是地址。是实例对象的地址还是指向句柄池的地址(这里可以参考:(3) Java内存结构)完全取决于每个JVM的实现。

  Java中的枚举类型都是Enum类的子类,Enum类是类之一,也是引用类型。

  引用类型也叫对象变量类型,是相对于基本数据类型(基本数据类型不是对象)而言的,也叫复合数据类型。可以理解为引用类型的数据最终是由基本数据类型组成的。和接口一样,接口是不能实例化的,最终的实现是通过类来实现的。JVM中数组的实现也是通过类来实现的。每种类型的一维数组和二维数组.是一个类,但这是一个特殊的类,它的对象头不同于一般对象(最重要的是数组对象头有对象长度)。

  另外,关于Java的引用,请参考:Java中的引用。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: