二进制与十进制的转换
二进制是01表示数字的数制,基数是2,逢2进1。
Java十进制及二进制表示对比:
十进制:0 1 2 3 4 5 6 7 8 9
二进制:0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
**规律:**除2取余并倒着写,直到被除数小于权值。比如 7 0111
十进制转换为二进制:位数上的数字*2的位数次方的和,比如 9 = 1X2的0次方+0X2的1次方+0X2的2次方+1X2的3次方 = 1+8 = 9;
程序实现如下:
public class DecimalUtils{
/**
* 十进制转换为二进制
* 正数:数字除2 取余倒着写,直到商为0
* 负数:正数的二进制取反 0-1 1-0 ,然后+1
*
* @return
*/
public static String decimal2Binary(int decimal){
String result = "";
if(decimal == 0){
return "0000";
}
if(decimal>0){
while(decimal!=0){
int i = decimal %2;
result = i+result;
decimal = decimal/2;
}
}
return result;
}
/**
* 二进制转化为十进制: 每个位数上的数字 * 2的(该位数-1)次方 ,也可以使用字符串实现
* 使用 字符串实现可以避免int类型的限制
* @param binary
* @return
*/
public static int binary2Decimal(int binary){
int decimal = 0;
int i = 0; //位数
while(true){
int temp = binary % 10;
decimal = temp * Math.pow(2,p);
binary = binary/2;
p++;
}
return decimal;
}
}
//Test
public class Test{
public static void main(String[] agrs){
System.out.println("二进制转换为十进制结果是:"+DecimalUtils.decimal2Binary(123)); //1111011
System.out.print("十进制转换为二进制结果是:"+DecimalUtils.binary2decimal(1111));//15
}
}
特殊的运算符记录:
<< 左移:向左移动两位 5<<2=20。 5:0101==》左移两位:10100==>20. >> 右移:向右移动两位 5>>2=1。 右移两位 0001===》1
:无符号移动两位(不区分正负),只对int类型有用。 5>>>2 = 1;
位运算符:应用于int long char short byte
& :如果对应的数字都为1 则是 1 ,否则是 0 例: 6 & 2 = 2 6: 0110 2: 0010;=》0010
| :如果对应的数字都是0 ,则是0 ,否则是1。例: 6|2 = 4
^ : 如果对应的数字相同则是0 ,否则是 1。 例:6^2 = 4
~:按位反转,即 0 变 1 ,1变 0 。 例:~6 = -7 0000 0000 0000 0110 ==》反转:1111 1111 1111 1001 高位 = 1 是负数。
- int 装箱拆箱的特殊性
public static void main(int args){
Integer i2 = new Integer(0);
int j = i2.intValue();
j+=3;
Integer b = new Integer(j);
System.out.print(b.intValue());
}
new Integer() 是对象地址,两个Integer对象不相等
Integer i1= new Integer(100);
Integer i2 = new Integer(100); i1=i2 -->false
int i3 = 100; i1=i3—>true ,i1 会自动拆箱,两个int比较
Integer i4= 100; i1 = i4 —>false,i1指向的是堆中的数据,i4指向的是常量池。
Integer i5 = 100; i4 = i5 —>true
但是如果是:
Integer i6 = 128 ;
Integer i7 = 128 ; i6=i7;—>false. 源码中 (超出 -127-128 )后拆箱操作会重新new 一个Integer,地址不一致。
-
常量池相等问题: String s1 = “hello”; String s2 = s1; String s3 = “hello”; s1=s2 —> true s1=s3–> true ,都是指向的常量池 。但是如果是 String s3 = new String(“hello”); 则为false. String s3 = new String(“hello”);创建的对象数量是 1个或2个,在堆中 创建s3 ,如果常量池有 “hello”则不创建,否则创建。
-
run()和start()方法的区别?如果在run()方法上加上synchronized调用顺序有什么变化?
Start()方法启动一个线程,使线程处于就绪状态,并没有执行,调用start()方法后不用等run方法执行完成即可继续执行下面代码。
run()方法,线程处于运行状态,等run()方法执行完毕后才可继续执行下面的代码。
在run()方法增加synchronize之后是防止多个线程争夺资源。
hashmap及hashtable的区别?
见链接:https://blog.csdn.net/MarinaTsang/article/details/84032109
final
,finally
,finalize
的区别?一个变量被 final
修饰,变量的初始化在该类的构造函数里面,这样写对吗?
final
:是一个修饰符,用于控制控制一个成员、方法或一个类是否被修改、重写或继承等功能。一个类被final声明时无法派生子类,不能被作为父类被继承。一个方法使用final修饰改方法无法被重写,一个成员使用final修饰。其初始化只能在两个地方,一是定义的时候,在定义的时候同时赋值,二是在构造函数的时候,二者只能选其一,在定义的时候没有赋值,可以在构造函数中赋值,但之后引用该成员变量,只能读取,不能修改。finally
:一般用于异常处理,一般在异常处理中,使用finally进行补充,实现清除操作。finally块的代码一定会被执行,不管有没有异常,所以finally可以维护对象的内部状态,并可以清理非内存资源。finally在try{}catch{}中可有可无,一般用于关闭文件流操作时,关闭数据库操作。finalize
:是一个方法,在Java中,允许使用finalize()方法在垃圾回收器清理对象之前做清理工作。这个方法是有垃圾回收器在确定一个对象没有引用时对这个对象调用。它是在object内定义的类,可以被所有类重写。