--记录容易出错或忽略的地方、小知识点等
1) Integer.parseInt(String s, int radix) 和 Long.parseLong(String s, int radix) 方法
这两个方法第一个参数接收要解析的字符串,该字符串必须是对应进制的数值,或者在数值之前添加+、- 符号表示正负的数值;需要注意的是,如果先将相应进制的负数转换成对应进制表示的字符串后再将该字符串以及相应进制作为参数去解析会抛出异常,因为负数转换成进制表示的字符串包含以数值表示的符号位,而不是用+、- 符号来表示正负。 以下使用8进制转换作为示例,其他非10进制转换与8进制相同。
Integer.parseInt(Integer.toOctalString(-Integer.MAX_VALUE), 8); //将负数转换成8进制表示的字符串后,再按8进制解析会出错
Integer.parseInt("-" + Integer.toOctalString(Integer.MAX_VALUE), 8); //将正数转换成8进制表示的字符串,然后在前面添加 '-'(负号,对应ASCII码是\u002D,上面将'-'号换成ASCII码效果一样)构成带符号字符串数值去解析才是正确的。
2) Arrays.asList(T... a) 方法
这个方法本质是接收一个对象数组。以下代码都是正确的:
List<String> ls = Arrays.asList("000,123,5366,342".split(",")); //传入字符串数组
List<Integer> li = Arrays.asList(8,9,1,3,5,6); //传入固定个数整数,每个参数自动转成Integer对象
List<Character> lc2 = Arrays.asList('a','b','9','8'); //传入固定个数字符,自动转为Character对象
Character[] ca = new Character[] {'a','b','9','8'}; //定义Character数组再作为参数传入
List<Character> lc = Arrays.asList(ca);
以下代码是有问题的:
Arrays.asList("1987654321".toCharArray()); //字符串的toCharArray()方法生成一个char[]数组,此时作为参数传入asList方法时,相当于传入单个对象,该对象是一个char[]数组,所以生成的是List<char[]>,而不是我们想要的List<Character>
3)字符串的反转
* 可以将字符串转成字节数组后反序拼接
* 也可以创建StringBuilder实例然后调用reverse()方法
4)输出整型或者长整型正数完整长度的二进制表示
调用Integer.toBinaryString(int i) 或者 Long.toBinaryString(long l)方法时,但传入参数是正数时,输出的不是对应数值类型长度的二进制字符串,而是省略了前面为0的部分,比如上面两个方法当传入数值都是99时(分别是99, 99L),得到的字符串都是“1100011”;那么如何输出正数完整长度的二进制字符串呢?可以采用以下两种方法:
1) "0" + (Integer.toBinaryString((Integer.MIN_VALUE)^n)).substring(1) ;
最小值二进制是第一位为1,后面部分全部为0的完整长度的二进制数值,和要转换的正数值进行按位与后,得到的二进制数值除了第一位是1外,其他位与要转换的正数值的二进制数值一样,那么用“0”拼接按位与后的二进制字符串的第2个字符起部分就构成要转换正数值的完整的二进制,长整型也是一样方法。
2)先得到正数的二进制字符串,然后在前面补充足够位数的0
String s = Integer.toBinaryString(n);
return String.format("%0" + (Integer.SIZE-s.length()) + "d",0) + s ;
长整型也是一样写法,注意换成Long.SIZE
* 当用八进制或者十六进制表示时,每位分别是8或者16,需要将SIZE除以3或4并向上取整。(这样计算得出结果是对的,原理是什么?)
5)异或
异或,英文为exclusive OR,缩写成xor; 异或(xor)是一个数学运算符,它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。
规则如下: 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
我们可以使用异或来交换两个数的值。
int m = 7, n = 9;
m = m^n; n=m^n; m = m^n;
这样操作之后,两数的值就互换了。
6) The boolean Type
虽然Java虚拟机定义了boolean类型,但只提供有限的支持,并且没有单独的专门用来操作布尔值的指令。取而代之的是,将java中使用操作布尔值的表达式编译成对int数据类型的操作。
不过Java虚拟机是支持布尔数组的,它使用newarray指令来创建布尔数组,并使用字节数组指令的baload和bastore来访问和修改。
Oracle的Java虚拟机实现里面,布尔数组被编码成字节数组,每个布尔元素占用8位,即一个字节,使用1表示true,使用0表示false。
Although the Java Virtual Machine defines a boolean type, it only provides very limited support for it. There are no Java Virtual Machine instructions solely dedicated to operations on boolean values. Instead, expressions in the Java programming language that operate on boolean values are compiled to use values of the Java Virtual Machine int data type.
The Java Virtual Machine does directly support boolean arrays. Its newarray instruction (§newarray) enables creation of boolean arrays. Arrays of type boolean are accessed and modified using the byte array instructions baload and bastore (§baload, §bastore).
In Oracle’s Java Virtual Machine implementation, boolean arrays in the Java programming language are encoded as Java Virtual Machine byte arrays, using 8 bits per boolean element.
The Java Virtual Machine encodes boolean array components using 1 to represent true and 0 to represent false. Where Java programming language boolean values are mapped by compilers to values of Java Virtual Machine type int, the compilers must use the same encoding.
7) 判断继承关系
* 使用 intanceof关键字判断某个实例是否是某个类的子类
* 使用ClassA.class.isAssignableFrom(ClassB.class)判断是否可以将ClassB转换成ClassA,如果结果为true则说明ClassB是ClassA的子类
--
网友评论