leetcode汉明距离的基础回顾

博主作为一名Java初学者,决定先从最简单直接的方法做起,并从中加强基础,之后再用其他更简单的方法。

求两个整数x,y的汉明距离

思路

大多数编程语言中,都存在各种内置计算等于 1 的位数函数。如果这是一个项目中的问题,应该直接使用内置函数,而不是重复造轮子。

class Solution {
    public int hammingDistance(int x, int y) {
        return Integer.bitCount(x^y);
    }
}

基础回顾

汉明距离的return语句

	return Integer.bitCount(x^y);

基本数据类型与包装类

基本类型包装类基本类型的范围
short(2字节)Short-32768~32767
int(4字节)Integer-2147483648~2147483647
float(4字节)Float-3.4E38~3.4E38
long(8字节)Long-9223372036854775808 ~ 9223372036854775807
double(8字节)Double-1.7E308~1.7E308
boolean(1字节)Booleantrue或false
byte(1字节)Byte-128~127
char(2字节)Character从字符型对应的整型数来划分,其表示范围是0~65535

基本类型转换成包装类

public class WTest {
    @Test
    public void test1() {
        int i = 10;
        //System.out.println(i.toString);报错
        Integer i1 = new Integer(i);
        System.out.println(i1);

        Integer i2 = new Integer("123abc");
        //System.out.println(i2.toString);报错,数字和字符串不能一起

        Boolean b1 = new Boolean("true123");
        System.out.println(b1);
    }
}

包装类转换成基本类型

    public void test2(){
        Integer in1 = new Integer(12);
        int i1 = in1.intValue();
        System.out.println(i1 + 1);
    }

JDK5.0后能够自动装箱和自动拆箱

        int num2 = 10;
        //Integer in1 = new Integer(10);
        Integer in1 = num2;//自动装箱
        
        int num3 = in1.intValue();
        int num3 = in1;//自动拆箱

经典题

    public void test3(){
        Object o1 = true ? new Integer(10) : new Double(2.0);
        System.out.println(o1);
    }
问o1的输出?	
由于三目运算符的类型一致,Integer自动提升了类型,o1 = 10.0

    public void test4(){
        Integer i = new Integer(1);
        Integer j = new Integer(1);
        System.out.println(i == j);
        
        Integer m = 1;
        Integer n = 1;
        System.out.println(m == n);
        
        Integer x = 128;
        integer y = 128;
        System.out.println(x == y);
    }
问三个语句的输出?
false;true;false
第一个语句 == 比较的地址值,两个对象肯定不一样,为false
第二个语句为true,第三个语句为false是因为Integer在源码中定义了一个缓存数组,这个数组范围是-128~127,超出范围才会new一个新的对象,未超出范围就存在这个缓存中,用的时候不用new对象,地址相同。
//Integer部分源码    
private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];
       ···

“==” 和 “equals” 的区别?

  “ == ” 是比较运算符,可以比较基本数据类型,比较的就是值是否相同。也可以比较引用数据类型,比较的就是地址值是否相同。

 equals()方法默认情况下,比较的是地址值。它的底层就是用 “ == ” 做比较,传入的是引用数据类型。

//euqals部分源码

    public boolean equals(Object obj) {
        return (this == obj);
    }
   
···
  • 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
  • 引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。
  • equals方法的初始默认行为是比较对象的内存地址值,一般来说,意义不大。所以,在一些类库当中这个方法被重写了,如String、Integer、Date。在这些类当中equals有其自身的实现(一般都是用来比较对象的成员变量值是否相同),而不再是比较类在堆内存中的存放地址了。
  • 所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值