博主作为一名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字节) | Boolean | true或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方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。