当前位置: 首页 > 科技观察

教妹妹学Java:Java中的数据类型

时间:2023-03-17 19:48:44 科技观察

妹妹(弟弟)今年上了大学,学的是计算机编程,没想到她的一位老师竟然是我的读者。妹妹惊喜惊慌,惊奇的是她哥和我的读者还挺广泛,惊慌的是她要是学不好,岂不是给她哥丢脸?但我相信她能学好!”二哥,上一节提到Java变量的数据类型是不是通过指定类型来限制变量的取值范围?”三妹喝了一口麦香可可奶茶对我说。你进步很大。你学会了推理和判断。Java是一种静态类型的编程语言,这意味着所有的变量在使用之前必须先声明,即必须先指定。类型和名称。”Java中的数据类型可以分为两种:1)基本数据类型。基本数据类型是Java语言数据操作的基础,包括boolean、char、byte、short、int、long、float和double,一共8种类型。2)引用数据类型,除了原始数据类型之外的类型就是所谓的引用类型,常见的有数组(没错没错,数组就是引用类型),类(也就是类),和接口(指向实现接口的类的对象)。来一张思维导图感受一下。通过上一节的学习,我们知道变量可以分为局部变量、成员变量和静态变量。当variable是局部变量,必须先初始化,否则编译器不允许你使用。以int为例,见下图。当变量是成员变量或静态变量时,不需要要初始化,它们会有一个默认值,仍然以int作为example,看代码:/***@作者微信搜索“沉默之王2”,回复关键字PDF*/publicclassLocalVar{privateinta;staticintb;publicstaticvoidmain(String[]args){LocalVarlv=newLocalVar();System.out.println(lv.a);System.out.println(b);}}看输出:00看,int作为成员变量或静态变量的默认值为0,不同的基本数据类型有不同的默认值和尺码,一起来看看表格吧。数据类型默认值大小booleanfalse1-bitchar'\u0000'2-bytebyte01-byteshort02-byteint04-bytelong0L8-bytefloat0.0f4-bytedouble0.08-bytethree妹子可能会问,比特和字节是什么鬼?你听说过比特币吗?你听说过字节跳动吗?当然,这些名字并不是随意的,确实和比特、字节有关。1)比特(bit)作为信息技术最基本的存储单位,比特很小,但著名的比特币就是以它命名的,它的缩写是小写字母“b”。众所周知,计算机是用二进制来存储数据的,二进制中的一位就是1位,也就是说一位不是0就是1。2)字节(byte)一般来说,一个英文字符就是一个字节,一个汉字是两个字节。字节和位的转换关系是:1字节=8位。上面的单位是KB,不是1000字节,因为计算机只懂二进制,所以是2的10次方,也就是1024字节。(终于知道1024和程序员的关系了?狗头救命)接下来我们来详细了解一下8种基本数据类型。01.Boolean布尔(boolean)只用来存储两个值:true和false,即真假,通常用于条件判断。代码示例:booleanflag=true;02,bytebyte的取值范围在-128到127之间,包括127。最小值为-128,最大值为127,默认值为0。在网络传输过程中,为了节省空间,通常使用字节作为数据传输方式。代码示例:bytea=10;byteb=-10;03,shortshort的取值范围在-32768到32767之间,包括32767。最小值为-32,768,最大值为32,767,默认值为0。代码示例:shorts=10000;shortr=-5000;04。intint的取值范围在-2,147,483,648(-2^31)到2,147,483,647(2^31-1)(含)之间,默认为0。如果没有特殊要求,整型数据使用int。代码示例:inta=100000;intb=-200000;05,longlong的取值范围在-9,223,372,036,854,775,808(-2^63)和9,223,372,036,854,775,807(2^63-1)(含)之间,默认值为0。如果int不能存储,使用long,整型数据使用int。代码示例:longa=100000L;longb=-200000L;为了区别于int,long型变量在声明末尾要加上大写的“L”。没有使用小写的“l”,因为小写的“l”很容易与数字“1”混淆。06.floatfloat是单精度浮点数,遵循IEEE754(二进制浮点数运算标准),取值范围无限制,默认值为0.0f。float不适用于精确值,例如货币。代码示例:floatf1=234.5f;为了区别于double,声明float型变量时,必须在末尾加上小写的“f”。不需要使用大写的“F”,因为小写的“f”很容易识别。07.doubledouble是双精度浮点数,遵循IEEE754(二进制浮点运算标准),取值范围也是无限的。默认值为0.0。double也不适合精确的数值,例如货币。代码示例:doubled1=12.3确切的数值表示是什么?最好使用BigDecimal,它可以完全准确地表示任意大小的浮点数。对于货币类型的值,也可以乘以100转换成整数进行处理。Tips:单精度为这种格式,1位符号,8位指数,23位小数,7位有效数字。双精度是格式,1位符号,11位指数,52位小数,16位尾数。取值范围取决于指数,计算精度取决于小数位(尾数)。小数位数越多,表示的数越大,计算精度越高。一个数由若干位数字组成,其中影响测量精度的数字称为有效数字,也称为有效数字。有效数字是科学计算中用来表示浮点数精度的数字。一般指以十进制形式表示的浮点数中从第一个非零数开始算起的所有数。例如,1.24和0.00124都有3位有效数字。08.charchar可以表示一个16位的Unicode字符,其取值范围在'\u0000'(0)到'\uffff'(65,535)(含)之间。代码示例:charletterA='A';//用英文单引号包裹。三姐可能会问,“既然char只有一个字符,为什么占2个字节呢?”“主要原因是Java使用的是Unicode字符集,而不是ASCII字符集。”为什么是这样?我们将其留给下一节中的更多内容。基本数据类型在用作成员变量和静态变量时都有默认值,引用数据类型也是如此。String是最典型的引用数据类型,所以我们以String类为例,看下面代码:publicstaticvoidmain(String[]args){LocalReflv=newLocalRef();System.out.println(lv.a);System.out.println(b);}}输出如下:nullnullnull是Java中的一个魔法存在,在你以后的编程生涯中,你会多次见到它,尤其是令人讨厌的“空指针异常”,也称为NullPointerException。即引用数据类型默认值为null,包括数组和接口。三姐是不是很好奇,为什么数组和接口也是引用数据类型?先来看数组:/***@作者微信搜索“沉默王二”,回复关键字java*/publicclassArrayDemo{publicstaticvoidmain(String[]args){int[]arrays={1,2,3};System.out.println(arrays);}}arrays是int类型的数组吧?打印结果如下:[I@2d209079[I表示数组是int类型,@后面是16进制的hashCode——这种打印结果太“人性化”了,一般人都说不行明白它!为什么会这样显示?看看java.lang.Object类的toString()方法就明白了。虽然数组没有明确定义为类,但它确实是一个对象,继承了祖先类Object的所有方法。那为什么数组不定义一个类来表示呢?就像String类?一个合理的解释是Java隐藏了它。如果有一个Array.java,我们也可以想象它真实的样子。它必须定义一个容器来存储数组的元素,就像String类一样。publicfinalclassStringimplementsjava.io.Serializable,Comparable,CharSequence{/**Thevalueisusedforcharactersstorage.*/privatefinalcharvalue[];}在数组里面定义一个数组?不需要!再看界面:/***@authorWeChat搜索“沉默之王二”,回复关键字Java*/publicclassIntefaceDemo{publicstaticvoidmain(String[]args){Listlist=newArrayList<>();System.out.println(list);}}List是一个非常典型的接口:publicinterfaceListextendsCollection{}而ArrayList是List接口的实现:publicclassArrayListextendsAbstractListimplementsList,RandomAccess,Cloneable,java.io.Serializable{}对于接口类型的引用变量,不能直接新建:只能新建一个实现它的类的对象——那么自然接口也是引用数据类型。让我们看看原始数据类型和引用数据类型之间的最大区别。基本数据类型:1、变量名指向具体的值。2.基本数据类型存放在栈中。引用数据类型:1.变量名指向栈上存储对象的内存地址。2.内存地址指向的对象存放在堆上。三妹见状又问:什么是堆,什么是栈?堆就是堆,栈就是栈。如果你看到一个“栈”,请不要怀疑自己。那是翻译的错。堆栈也是堆栈。反正我不是很喜欢stack这个名字,新人很容易掉坑。堆是程序运行时在内存中申请的空间(可以理解为动态进程);请记住,它不是在编译时;因此,Java中的对象都放在这里。这样做的好处是:当需要一个对象时,只需要通过new关键字写一行代码,当这行代码执行时,会自动在内存的“堆”区分配空间——这是非常灵活的。堆栈可以直接与处理器(CPU,即大脑)关联,因此访问速度更快。既然访问速度快,好好利用吧!Java将对象的引用放在堆栈上。为什么?因为参考文献的使用频率高?不行,因为Java在编译程序的时候必须清楚的知道栈中存放的东西的生命周期,否则无法释放旧的内存开辟新的内存空间存储引用——空间这么大,前浪要把后浪打死在沙滩上。这样可以理解吗?“好了,三妹,先说这么多Java中的数据类型,你懂了吗?”转过僵硬的脖子,我对三妹说道。“差不多了,二哥,我觉得我得再消化一遍。”本文转载自微信公众号“沉默王二”,可通过以下二维码关注。转载本文请联系沉默王二公众号。