partOne
1.strictifp关键字用法
strictifp关键字用于标记方法,要求其使用严格的浮点计算来生成可再生的结果(严格按照JavaEE的规范进行运算,从而得到更加精确地浮点运算结果),即运算精度比未被标记的方法要高,同时运算速度也会相应变慢。
示例:
public static strctifp void main(String[] args){
....
}
2.floorMod方法
floorMod方法与%对照使用:
%:
求余运算,结果符号与被除数相同
floorMod:
求模运算,结果符号与除数相同,相当于求余结果加上除数。
代码示例;
import static java.lang.Math.floorMod;
public class test {
public static void main(String[] args){
System.out.println("-52对10取余结果:"+-52%10);
System.out.println("-52对10取模结果:"+floorMod(-52,10));
System.out.println("52对-10取余结果:"+52%-10);
System.out.println("52对-10取模结果:"+floorMod(52,-10));
}
}
运行结果:
-52对10取余结果:-2
-52对10取模结果:8
52对-10取余结果:2
52对-10取模结果:-8
3.数值类型转换
代码示例:
public class test {
public static void main(String[] args){
int n = 1234567899;
float f =n;
double d = n;
System.out.println("f:"+f);
System.out.println("d:"+d);
}
}
运行结果:
f:1.23456794E9 ;float可以精确到6~7位
d:1.234567899E9 ;double可以精确到15~16位
4.位运算符(与、或、异或、非)
(1)&("and)
public class test {
public static void main(String[] args){
System.out.println(82&78); //01010010 & 01001110 = 01000010
System.out.println(0b101010&0b11111111); //101010 & 11111111 = 00101010
System.out.println(-71&56); //-1000111(真) & 111000 = 10111001(补) & 111000 = 00111000
System.out.println(-0b101001&0b11101110); //-101001(真) & 11101110 = 111010111(补) & 011101110 = 011000110
}
}
运行结果:
66
42
56
198
(2)|(“or”)
public class test {
public static void main(String[] args){
System.out.println(82|78); //01010010 | 01001110 = 01011110
System.out.println(0b101010|0b10000000); //101010 | 10000000 = 10101010
System.out.println(-71|56); //-1000111(真) | 111000 = 10111001(补) | 111000 = 10111001(补) = -1000111(真)
System.out.println(-0b101001|0b11101110); //-101001(真) | 11101110 = 111010111(补) | 011101110 = 111111111(补) = -000000001(真)
}
}
运行结果:
94
170
-71
-1
(3)^(“xor”)
public class test {
public static void main(String[] args){
System.out.println(82^78); //01010010 ^ 01001110 = 00011100
System.out.println(0b101010^0b10000000); //101010 ^ 10000000 = 10101010
System.out.println(-71^56); //-1000111(真) ^ 111000 = 10111001(补) ^ 111000 = 10000001(补) = -1111111(真)
System.out.println(-0b101001^0b11101110); //-101001(真) ^ 011101110 = 111010111(补) ^ 011101110 = 100111001(补) = -11000111(真)
}
}
运行结果:
28
170
-127
-199
(4)~(“not”)
public class test {
public static void main(String[] args){
System.out.println(~82); //~01010010 = 10101101 = -1010011
System.out.println(~-71); //~10111001 = 01000110
System.out.println(~0b101010); //~0101010 = 1010101 = -101011
System.out.println(~-0b101001); //~1101001(原) = ~1010111 = 0101000
}
}
运行结果:
-83
70
-43
40
位运算总结:
(1)无论输入的数值是何种进制形式,机器均识别为真值,之后根据符号添加符号位(有“-”则符号位设为1,否则为0)转为补码形式储存。
(2)在进行多操作数之间的逻辑运算时,机器首先将操作数转为补码形式储存,并将各操作数统一为最长的操作数的位数,例如计算0b101010^0b10000000时,将两数位数统一并以补码形式储存:000101010、010000000,再进行逻辑运算,最终结果也为补码形式。
(3)在进行含负操作数的逻辑运算时,需注意符号位对应的位置,例如计算-0b101001^0b11101110时,位数较大的操作数的补码形式为:011101110,机器为了统一二者位数,便将位数较小的操作数补码形式写为:111010111(对应原码形式:100101001)。
(4)理解各种数制下的操作数间的逻辑运算过程对于掌握机器进行数值运算的底层逻辑很有帮助。
5.移位运算符<<、>>、>>>
三则运算符分别对应逻辑/算术左移、算术右移(带符号右移)、逻辑右移(无符号右移)。
以10101010为例:
10101010 << 1得到 0101010[0];
10101010 >> 1得到 [1]1010101(算术移位实际是用符号位填充新高位,即重复符号位);
10101010>>>1得到 [0]1010101;
可得:
算术左/右移实现对有符号数的倍增/减半,逻辑左/右移实现对无符号数的倍增/减半(Java中并无无符号数据类型,因此事实上只需算术移位),与汇编语言指令相对应:算术左移SAL、算术右移SAR、逻辑左移SHL、逻辑右移SHR。
代码示例;
public class test {
public static void main(String[] args){
System.out.println(10<<1); //01010->10100
System.out.println(10>>>1); //01010->00101
System.out.println(10>>1); //01010->00101
System.out.println(-10<<1); //10110->01100
System.out.println(-10>>>1); //>>>仅可进行无符号数的移位,因此出现异常
System.out.println(-10>>1); //10110->11011->-0101(真)
}
}
运行结果:
20
5
5
-20
2147483643
-5
6.字符串的截取与拼接
(1)String类中的substring方法适用于截取指定部分的字符串,返回目标子串,例如:
public class test {
public static void main(String[] args){
String str = "email:123456789@qq.com";
System.out.println(str.substring(6));
System.out.println(str.substring(6,15));
}
}
substring()方法根据参数类可分为两类:
substring(int beginInsex)
substring(int beginIndex,int endIndex)
;beginIndex为目标子串的首位字符的下标,endIndex为目标子串的下一位字符的下标。
(2)与绝大多数的程序设计语言一样,Java语言允许使用+号连接(拼接)两个字符串,例如:
public class test {
public static void main(String[] args){
String str1 = "Her age is ";
int age = 18;
String str2 = " and her height is ";
double height = 172.5;
String str3 = str1 + age + str2 + height;
System.out.println(str3);
}
}
运行结果:
Her age is 18 and her height is 172.5
当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串(任何一个Java对象都可以转换成字符串)。
7.StringBuilder类(构建字符串)
有些时候,需要由较短的字符串构建字符串,例如,按键或来自文件中的单词。采用字符串连接的方式达到此目的效率比较低。每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间。使用StringBuilder类就可以避免这个问题的发生。
代码示例:
public class test {
public static void main(String[] args){
//构建StringBuilder类对象
StringBuilder builder = new StringBuilder();
//append()方法添加内容至StringBuilder类对象
builder.append("Hello ");
builder.append(345);
builder.append('.');
//修改指定下标处代码单元为特定字符
builder.setCharAt(7,'6');
String str = builder.toString();
System.out.println(builder.length());
System.out.println(str);
}
}
运行结果:
10
Hello 365.