java小知识点

一、原码、反码和补码

  1. 原码:把原来的数化成2进制
    比如10的原码就是00001010,最高位的0代表 这个数是正数(最高位就是符号位);
    -10的原码就是10001010,最高位的1代表这个数是负数

  2. 反码:
    10的原码是00001010,那他的反码也是00001010,因为正数的原 反 补码相同 ;
    -10的原码是10001010,那他的反码是11110101,也就是符号位不变,其他位0变1,1变0.

  3. 补码:
    因为正数的原 反 补码相同,所以10的补码还是00001010
    而-10,它的补码是在反码的基础上,最低位加1,也就是11110110.

在java中,数值用补码来表示和存储。

二、数据类型转换原则

Java数据类型的转换原则,从低精度向高精度转换。
注意:两个char型运算时,自动转换为int型;当char与别的类型运算时,也会先自动转换为int型的,再做其它类型的自动转换

  • 基本类型与包装类型的转换

正向转换:在new一个包装类时,把基本类型数据作为参数传进去如下:

    Integer a= new Integer(8);

反向转换:把包装类转为基本类型,其实就是提取这个包装对象的值

    int b=a.intValue();
  • 包装类型、基本数据类型和字符串的转换

  • 正向转换:因为每个类都是object类的子类,而object类都有一个toString()函数.

  • 所以如果是包装类转为字符串就直接用toString()函数来转换即可,如下:

Integer a=new Integer(2);
String str=a.toString();
  • 如果是基本数据类型,其实也可以用上面的方法,先转为包装类,再装为字符串,不过也可以用下面的写法,原理其实是一样的,如下:
int i=1;
String str=Integer.toString(i);
  • 反向转换:把字符串转为基本数据类型

    将一个字符串转化成一个Integer对象,然后再调用这个对象的intValue()方法返回其对应的int数值。

int i=Integer.valueOf(“123”).intValue()
float f=Float.valueOf(“123”).floatValue() //如果转为其他数据类型,也可以采用类似手法

除了上面的方法之外,其实还可以用下面方法:

int i=Integer.parseInt("123");//这种方法直接就返回基本数据类型,不需要用intValue对包装类取值
float f=Float.parseFloat("123");//如果转为其他数据类型,也可以采用类似手法
  • int和char的转换

  • int转char

//利用char的unicode编码
int num1 = 5;
char ch1 = (char) (num1 + 48);
  • char转int
//1.通过先转为字符串,然后再把字符串转为int
char ch='5';
Character ch2 = new Character(ch); //先转为包装类
int i = Integer.parseInt(ch2.toString());//包装类转为字符串,再转为int
//2.通过unicode编码
char ch3 = '5';
int i2 = ch3 - 48;//在进行减法运算之前,char就先自动转为int,大小是对应的unicode码

三、包装类和基本数据类型的区别

别人总结的几点:

  1. Integer是int的包装类,int则是java的一种基本数据类型;
  2. Integer变量必须实例化后才能使用,而int变量不需要 ;
  3. Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 ;
  4. Integer的默认值是null,int的默认值是0。

Integer和int的一些注意点

  • 由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同);
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.print(i == j);   //输出false
  • 如果把Integer变量和int变量比较时,只要两个变量的值是相等的,则结果为true,当包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,其实就变为两个int变量的比较;
Integer i = new Integer(1);
int j = 1;
System.out.print(i == j); //输出为true

3、非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同,因为本来就不是在同一个地方;

Integer i = new Integer(1);
Integer j = 1;//包装类也可以这样子生成
System.out.print(i == j); //false

4、对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

Integer i = 120;
Integer j = 120;
System.out.print(i == j); //输出true
Integer i = 128;
Integer j = 128;
System.out.print(i == j); //输出false

为什么会这样子呢?原因如下:
java对于-128到127之间的数,会进行缓存,Integer i = 120时,会将120进行缓存,下次再有Integer j = 120时,就会直接从缓存中取,就不会new了,所以内存中的地址是相同的,当时超出127就不会缓存,每次都会new一个新的,所以就不等于了。其实,java在编译Integer i = 120 ;时,会翻译成为Integer i = Integer.valueOf(120)的,上面的一堆理由也就是由valueOf造成的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值