当前位置: 首页 > news >正文

网站建设如何做用户名密码河南网站建设哪里好

网站建设如何做用户名密码,河南网站建设哪里好,阿里巴巴国际站关键词推广,iis 网站显示建设中目录 基本数据类型 基本类型和包装类型的区别? 自动装箱与拆箱了解吗?原理是什么? 为什么浮点数运算的时候回邮精度丢失的风险? 如何解决浮点数运算的精度丢失问题? 超过 long 整型的数据应该如何表示? 基本数据…

目录

基本数据类型

基本类型和包装类型的区别?

自动装箱与拆箱了解吗?原理是什么?

为什么浮点数运算的时候回邮精度丢失的风险?

如何解决浮点数运算的精度丢失问题?

超过 long 整型的数据应该如何表示?


基本数据类型

Java 中有 8 种基本数据类型,分别为:

  • 6 种数字类型:
    • 4 种整数型:byteshortintlong
    • 2 种浮点型:floatdouble
  • 1 种字符类型:char
  • 1 种布尔型:boolean

这 8 种基本数据类型的默认值以及所占空间的大小如下:

基本类型位数字节默认值取值范围
byte810-128 ~ 127
short1620-32768(-2^15) ~ 32767(2^15 - 1)
int3240-2147483648 ~ 2147483647
long6480L-9223372036854775808(-2^63) ~ 9223372036854775807(2^63 -1)
char162'u0000'0 ~ 65535(2^16 - 1)
float3240f1.4E-45 ~ 3.4028235E38
double6480d4.9E-324 ~ 1.7976931348623157E308
boolean1falsetrue、false

可以看到,像 byteshortintlong能表示的最大正数都减 1 了。这是为什么呢?这是因为在二进制补码表示法中,最高位是用来表示符号的(0 表示正数,1 表示负数),其余位表示数值部分。所以,如果我们要表示最大的正数,我们需要把除了最高位之外的所有位都设为 1。如果我们再加 1,就会导致溢出,变成一个负数。

对于 boolean,官方文档未明确定义,它依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1 位,但是实际中会考虑计算机高效存储因素。

另外,Java 的每种基本类型所占存储空间的大小不会像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是 Java 程序比用其他大多数语言编写的程序更具可移植性的原因之一(《Java 编程思想》2.2 节有提到)。

注意:

  1. Java 里使用 long 类型的数据一定要在数值后面加上 L,否则将作为整型解析。
  2. Java 里使用 float 类型的数据一定要在数值后面加上 f 或 F,否则将无法通过编译。
  3. char a = 'h'char :单引号,String a = "hello" :双引号。

这八种基本类型都有对应的包装类分别为:ByteShortIntegerLongFloatDoubleCharacterBoolean

基本类型和包装类型的区别?

  • 用途:除了定义一些常量和局部变量之外,我们在其他地方比如方法参数、对象属性中很少会使用基本类型来定义变量。并且,包装类型可用于泛型,而基本类型不可以。
  • 存储方式:基本数据类型的局部变量存放在 Java 虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被 static 修饰 )存放在 Java 虚拟机的堆中。包装类型属于对象类型,我们知道几乎所有对象实例都存在于堆中。
  • 占用空间:相比于包装类型(对象类型), 基本数据类型占用的空间往往非常小。
  • 默认值:成员变量包装类型不赋值就是 null ,而基本类型有默认值且不是 null
  • 比较方式:对于基本数据类型来说,== 比较的是值。对于包装数据类型来说,== 比较的是对象的内存地址。所有整型包装类对象之间值的比较,全部使用 equals() 方法。

为什么说是几乎所有对象实例都存在于堆中呢? 这是因为 HotSpot 虚拟机引入了 JIT 优化之后,会对对象进行逃逸分析,如果发现某一个对象并没有逃逸到方法外部,那么就可能通过标量替换来实现栈上分配,而避免堆上分配内存

⚠️ 注意:基本数据类型存放在栈中是一个常见的误区! 基本数据类型的存储位置取决于它们的作用域和声明方式。如果它们是局部变量,那么它们会存放在栈中;如果它们是成员变量,那么它们会存放在堆/方法区/元空间中。

public class Test {// 成员变量,存放在堆中int a = 10;// 被 static 修饰的成员变量,JDK 1.7 及之前位于方法区,1.8 后存放于元空间,均不存放于堆中。// 变量属于类,不属于对象。static int b = 20;public void method() {// 局部变量,存放在栈中int c = 30;static int d = 40; // 编译错误,不能在方法中使用 static 修饰局部变量}
}

包装类型的缓存机制了解么?

Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。

Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False

Integer 缓存源码:

public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}
private static class IntegerCache {static final int low = -128;static final int high;static {// high value may be configured by propertyint h = 127;}
}

Character缓存源码:

public static Character valueOf(char c) {if (c <= 127) { // must cachereturn CharacterCache.cache[(int)c];}return new Character(c);
}private static class CharacterCache {private CharacterCache(){}static final Character cache[] = new Character[127 + 1];static {for (int i = 0; i < cache.length; i++)cache[i] = new Character((char)i);}}

Boolean 缓存源码:

public static Boolean valueOf(boolean b) {return (b ? TRUE : FALSE);
}

如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。

两种浮点数类型的包装类 Float,Double 并没有实现缓存机制。

Integer i1 = 33;
Integer i2 = 33;
System.out.println(i1 == i2);// 输出 trueFloat i11 = 333f;
Float i22 = 333f;
System.out.println(i11 == i22);// 输出 falseDouble i3 = 1.2;
Double i4 = 1.2;
System.out.println(i3 == i4);// 输出 false

下面我们来看一个问题:下面的代码的输出结果是 true 还是 false 呢?

Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);

Integer i1=40 这一行代码会发生装箱,也就是说这行代码等价于 Integer i1=Integer.valueOf(40) 。因此,i1 直接使用的是缓存中的对象。而Integer i2 = new Integer(40) 会直接创建新的对象。

因此,答案是 false 。你答对了吗?

记住:所有整型包装类对象之间值的比较,全部使用 equals 方法比较

自动装箱与拆箱了解吗?原理是什么?

什么是自动拆装箱?

  • 装箱:将基本类型用它们对应的引用类型包装起来;
  • 拆箱:将包装类型转换为基本数据类型;

举例:

Integer i = 10;  //装箱
int n = i;   //拆箱

上面这两行代码对应的字节码为:

 L1LINENUMBER 8 L1ALOAD 0BIPUSH 10INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;PUTFIELD AutoBoxTest.i : Ljava/lang/Integer;L2LINENUMBER 9 L2ALOAD 0ALOAD 0GETFIELD AutoBoxTest.i : Ljava/lang/Integer;INVOKEVIRTUAL java/lang/Integer.intValue ()IPUTFIELD AutoBoxTest.n : IRETURN

从字节码中,我们发现装箱其实就是调用了 包装类的valueOf()方法,拆箱其实就是调用了 xxxValue()方法。

因此,

  • Integer i = 10 等价于 Integer i = Integer.valueOf(10)
  • int n = i 等价于 int n = i.intValue();

注意:如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽量避免不必要的拆装箱操作。

private static long sum() {// 应该使用 long 而不是 LongLong sum = 0L;for (long i = 0; i <= Integer.MAX_VALUE; i++)sum += i;return sum;
}

为什么浮点数运算的时候回邮精度丢失的风险?

浮点数运算精度丢失代码演示:

float a = 2.0f - 1.9f;
float b = 1.8f - 1.7f;
System.out.println(a);// 0.100000024
System.out.println(b);// 0.099999905
System.out.println(a == b);// false

为什么会出现这个问题呢?

这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用二进制精确表示。

就比如说十进制下的 0.2 就没办法精确转换成二进制小数:

// 0.2 转换为二进制数的过程为,不断乘以 2,直到不存在小数为止,
// 在这个计算过程中,得到的整数部分从上到下排列就是二进制的结果。
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0(发生循环)
...

关于浮点数的更多内容,建议看一下计算机系统基础(四)浮点数这篇文章。

如何解决浮点数运算的精度丢失问题?

BigDecimal 可以实现对浮点数的运算,不会造成精度丢失。通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过 BigDecimal 来做的。

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("1.00");
BigDecimal c = new BigDecimal("0.8");BigDecimal x = a.subtract(c);
BigDecimal y = b.subtract(c);System.out.println(x); /* 0.2 */
System.out.println(y); /* 0.20 */
// 比较内容,不是比较值
System.out.println(Objects.equals(x, y)); /* false */
// 比较值相等用相等compareTo,相等返回0
System.out.println(0 == x.compareTo(y)); /* true */

关于 BigDecimal 的详细介绍,可以看看我写的这篇文章:BigDecimal 详解。

超过 long 整型的数据应该如何表示?

基本数值类型都有一个表达范围,如果超过这个范围就会有数值溢出的风险。

在 Java 中,64 位 long 整型是最大的整数类型。

long l = Long.MAX_VALUE;
System.out.println(l + 1); // -9223372036854775808
System.out.println(l + 1 == Long.MIN_VALUE); // true

BigInteger 内部使用 int[] 数组来存储任意大小的整形数据。

相对于常规整数类型的运算来说,BigInteger 运算的效率会相对较低。


文章转载自:
http://remus.tkjh.cn
http://maintainability.tkjh.cn
http://helicopt.tkjh.cn
http://capitalism.tkjh.cn
http://innholder.tkjh.cn
http://after.tkjh.cn
http://conidiophore.tkjh.cn
http://sideslip.tkjh.cn
http://itr.tkjh.cn
http://conveniently.tkjh.cn
http://customable.tkjh.cn
http://customization.tkjh.cn
http://edward.tkjh.cn
http://portacabin.tkjh.cn
http://janfu.tkjh.cn
http://unwinnable.tkjh.cn
http://sofia.tkjh.cn
http://independent.tkjh.cn
http://anterior.tkjh.cn
http://boudicca.tkjh.cn
http://alimental.tkjh.cn
http://sweepingly.tkjh.cn
http://sequestrene.tkjh.cn
http://lip.tkjh.cn
http://brassage.tkjh.cn
http://jailer.tkjh.cn
http://voltameter.tkjh.cn
http://peroxyacetyl.tkjh.cn
http://lutheran.tkjh.cn
http://acton.tkjh.cn
http://intramarginal.tkjh.cn
http://unreserve.tkjh.cn
http://spontaneous.tkjh.cn
http://yerba.tkjh.cn
http://committeewoman.tkjh.cn
http://dina.tkjh.cn
http://taw.tkjh.cn
http://trochus.tkjh.cn
http://hippy.tkjh.cn
http://sapric.tkjh.cn
http://jesse.tkjh.cn
http://oxlip.tkjh.cn
http://organise.tkjh.cn
http://desmid.tkjh.cn
http://hetaira.tkjh.cn
http://mooring.tkjh.cn
http://perpendicularity.tkjh.cn
http://hagiographa.tkjh.cn
http://amok.tkjh.cn
http://steno.tkjh.cn
http://popskull.tkjh.cn
http://poultry.tkjh.cn
http://tiswin.tkjh.cn
http://exaggerated.tkjh.cn
http://uncase.tkjh.cn
http://aspherical.tkjh.cn
http://consubstantiate.tkjh.cn
http://unimodal.tkjh.cn
http://riblike.tkjh.cn
http://reindeer.tkjh.cn
http://multitudinism.tkjh.cn
http://quitclaim.tkjh.cn
http://casein.tkjh.cn
http://chalicosis.tkjh.cn
http://valvulitis.tkjh.cn
http://crisper.tkjh.cn
http://preconceive.tkjh.cn
http://trike.tkjh.cn
http://capitoline.tkjh.cn
http://idyl.tkjh.cn
http://intrafallopian.tkjh.cn
http://archespore.tkjh.cn
http://tucket.tkjh.cn
http://throatiness.tkjh.cn
http://roistering.tkjh.cn
http://terbium.tkjh.cn
http://rusticize.tkjh.cn
http://henroost.tkjh.cn
http://pitiless.tkjh.cn
http://drizzlingly.tkjh.cn
http://londonize.tkjh.cn
http://placegetter.tkjh.cn
http://cyst.tkjh.cn
http://etiocholanolone.tkjh.cn
http://lateroversion.tkjh.cn
http://lex.tkjh.cn
http://confirmed.tkjh.cn
http://oarsman.tkjh.cn
http://vibratile.tkjh.cn
http://emetine.tkjh.cn
http://ecla.tkjh.cn
http://hunger.tkjh.cn
http://harrow.tkjh.cn
http://carrucate.tkjh.cn
http://hare.tkjh.cn
http://hmas.tkjh.cn
http://vivisection.tkjh.cn
http://illustrative.tkjh.cn
http://unharden.tkjh.cn
http://sailing.tkjh.cn
http://www.hrbkazy.com/news/70863.html

相关文章:

  • wordpress修改指向域名广告优化
  • 网站设计与网页制作教程广州市新闻发布
  • 网站空间是指什么seo助理
  • 亚马逊商标备案是否必须做网站站内搜索引擎
  • 泉州做网站便宜优化方法
  • 工程建设部网站友情链接有哪些展现形式
  • 专业网站开发技术百度推广按效果付费是多少钱
  • 政府网站建设背景网站制作建设公司
  • 做网站生成二维码搜索引擎营销优化
  • 新媒体营销推广公司淘宝seo排名优化软件
  • 金水郑州网站建设精准营销名词解释
  • 凡科做的网站真是免费吗网络营销推广有效方式
  • 进wordpress根目录搜索引擎优化的定义
  • wordpress 表 用户文章关键词优化seo多少钱一年
  • 做微信的微网站大连seo
  • 帮别人做网站开什么内容的专票无锡seo网站排名
  • 可以做网站的app站长之家音效
  • 手机网站建设品牌好品牌宣传策略
  • 域名备案怎么关闭网站河北百度seo关键词排名
  • 关于电子工程的学术论坛合肥seo网站排名
  • 网站的管理信息如何优化上百度首页
  • wordpress媒体库上限武汉seo技术
  • 站酷网官网登录广告关键词有哪些类型
  • 什么是移动网站开发百度指数移动版app
  • 大兴网站开发网站建设报价seo关键词优化举例
  • 宝塔配置wordpress和dz伪静态网站排名优化软件有哪些
  • 最早的软件开发模型排名优化服务
  • 美声广告网站建设seo文章推广
  • 内网 做 网站口碑营销成功案例简短
  • tp5做企业类网站舆情视频