• 动手动脑


    1、s和t引用的不是同一个对象,返回的为fasle。     

    2、原始数据类型有8种,byte(字节) short(短整型) int(整形) long(长整型) float(浮点型) double(双精度) 64 char(字符串) boolean(布尔型)所s.getClass().isPrimitive()会返回fasle;因为这个是enum type,s和u的值都为SMALL,所以返回true。

    3、enum Size{SMALL,MEDIUM,LARGE}是使用一个名为Size的enum类,其中元素有SMALL,MEDIUM,LARGE可看成其中类的对象。

    结论:

    1、枚举类型是引用类型

    2、枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。

    3、可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals()方法执行的结果是等价的。

    枚举的基本用法:

    1、for(Size value:Size.values()){
                System.out.println(value);

         }对枚举进行遍历,并且找出最大的。

    2、Size s=Size.SMALL 从字串转换为枚举

    3、System.out.println(s==u)判断s与u是否相同

    4、System.out.println()

    System.out.println(s); //运行结果:SMALL(枚举直接提供了toString的方法)

    System.out.println(s.name());//运行结果:SMALL(打印名字)

    System.out.println(s.ordinal());///得到枚举在序列中的位置

    System.out.println(s.getClass());//得到枚举类

    System.out.println(s.getDeclaringClass());//返回本类的申明处

    第一个“X+Y”是字符串在前,所以后面的加号会把X,Y变量转化为String类型,而这两个变量之间的+起连接作用。

    第二个X+Y,运算符先于字符串,所以先进行运算再与后面的字符串连接起来。

    使用double类型的数值进行运算,是不准确的。原因涉及到二进制与十进制的转换问题。N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4=1×10²+2×10+3×(10的0次幂)+4×(10的-1次幂);其它进制的也是同理,例如二进制数11.01=1×2+1×(2的0次幂)+0+1×(2的-2次幂)=十进制的3.25。double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。

    1. 原码

    原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

    [+1] = 0000 0001

    [-1] = 1000 0001

    第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

    [1111 1111 , 0111 1111]

    [-127 , 127]

    原码是人脑最容易理解和计算的表示方式.

    2. 反码

    反码的表示方法是:

    正数的反码是其本身

    负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

    [+1] = [00000001] = [00000001]

    [-1] = [10000001] = [11111110]

    可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.

    3. 补码

    补码的表示方法是:

    正数的补码就是其本身

    负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

    [+1] = [00000001] = [00000001] = [00000001]

    [-1] = [10000001] = [11111110] = [11111111]

    对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

    Java语言中的数字是以补码方式存储的

    同名变量的屏蔽原则

    作为一个通用规则,在一个作用域中定义的变量对于该作用域外的程序是不可见(即访问)的。因此,当你在一个作用域中定义一个变量时,你就将该变量局部化并且保护它不被非授权访问和/或修改

    1.Int          32位       取值范围为       -2的31次方到2的31次方减1之间的任意整数(-2147483648~2147483647);
    2.Short      16位       取值范围为       -32768~32767之间的任意整数;
    3.long        64位       取值范围为       -2的63次方到2的63次方减1之间的任意整数(-9223372036854774808~9223372036854774807);
    4.float        32位       取值范围为       3.402823e+38 ~ 1.401298e-45;
    5.double     64位       取值范围为       1.797693e+308~ 4.9000000e-324;

    6.char        8位       取值范围为         -128~127
    7.byte        8位       取值范围为         -128~127之间的任意整数

    结论:不同数据类型进行类型转换时可能会有精度的缺失,因此要注意各种类型的取值范围。

  • 相关阅读:
    beego 注解路由无效问题分析
    sync.Map实现分析
    由浅入深聊聊Golang的sync.Map
    Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型
    golang 的 channel 实现 生产者/消费者 模型
    Golang sync.NewCond条件锁的用法
    golang channel多生产者和多消费者实例
    Go语言的那些坑
    go语言标准库sync/atomic中的原子操作
    理解 Go 标准库中的 atomic.Value 类型
  • 原文地址:https://www.cnblogs.com/clueless/p/5936746.html
Copyright © 2020-2023  润新知