五、Operators (运算符)
算符优先级:
1、算术运算符 + 、- 、 * 、/ 。关于/号,整数/整数 = 整数 。取余数用%,而浮点数/浮点数 = 浮点数。另外,整数除0会产生一个异常,而如果浮点数除于0,则可能得到无穷大或错误的值。2、注意一点,就是在double类型进行运算的时候,有的机器会用80位来存中间的值,这样可能与64位算出来的不一样,所以可以用public static strictfp void main(String[] args)中的strictfp规定中间的数据也用64位来存放。所幸的是,这些机器在处理的时候只用于指数,而double类型发生溢出的可能性很小,所以两种差不多。3、自加、自减运算符,给个例子吧。int m = 7;int n = 7;int a = 2 * ++m; // now a is 16, m is 8int b = 2 * n++; // now b is 14, n is 84、关系运算符: == , != , < , > <= , >=5、逻辑运算符: && , || , !, 都是短路径优先的。6、条件运算符:?: 如x < y ? x : y,返回x,y中的小的一个。7、位运算符:& , | , ^ , ~ ,<< , >> , >>>。&、|,还有另外一个作用就是用于逻辑类型的变量进行逻辑判断的,但是它们不是短路径优先的。在移位运算符的时候,移动的位数是以32为模的,除非被移动的类型是long,则是以64为模的。比如1<<35 = 1<<3。8、有很多关于数学的函数,包括Math.sqrt(double) , Math.pow(double ,double) , Math.sin, Math.cos , Math.tan , Math.atanMath.atan2 , Math.exp , Math.log 和常数Math.PI , Math.E。9、如果使用了import static java.lang.Math.*; ,则可以直接使用sqrt(double)。10、在使用Math的时候,float运用的是本地的。如果要使用精确的值,请使用StrictMath。11、类型转换
实线表示安全的转换,而虚线表示回丢失精度。 自动转换原则 1、如果有一个是double,都转换为double 2、如果有一个是float,都转换为float 3、如果有一个是long, 都转换为long 4、其他都转换为int如果有丢失数据的情况,我们称为cast,必须写成double x = 9.997;int nx = (int) x; //nx = 9如果要取最接近的用rounddouble x = 9.997;int nx = (int) Math.round(x); // nx=10有时如果在转换的过程有超出范围的情况,会出现一些很奇怪的数据。如(byte) 300 = 44.(学过二进制的话也没什么好奇怪的。)boolean类型不能转换为任何类型,都可以用b ? 1 : 0。12、优先级顺序在Java中没有,号运算符。13、枚举类型:enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE };
Size s = Size.MEDIUM;
s只可以存上面列出的值,还有就是null。
六、String类型1、Code Unit和Code Point例如:string u = "/uD840/uDC08/u0041/uD835/uDD68"主要有几个函数需要注意:length():返回的是Code Unit的长度,上面返回5codePointCount():返回的是Code Point的长度int cpCount = greeting.codePointCount(0, greeting.length()); //得到code Point的长度 ,上面返回3
charAt(int index):返回的是index处的Code Unit,最好不要使用
//下面返回ith处的Code Pointint index = greeting.offsetByCodePoints(0, i);//offsetByCodePoints,返回从0处开始的第i个Code Point的位置int cp = greeting.codePointAt(index); //获取第index位置的Code Point
//用下面的函数来取到一个字符串中的所有的Code Pointint cp = sentence.codePointAt(i);if (Character.isSupplementaryCodePoint(cp)) i += 2;else i++;
i--;int cp = sentence.codePointAt(i);if (Character.isSupplementaryCodePoint(cp)) i--;
2、substring返回的是子字符串,返回的是Code Unit。3、对string的任何修改都是创建一个新的string,如果考虑到效率的话,可以使用StringBuilder。4、可以用+进行连接5、比较两个字符串的相等,可以用string1.equals(string2),如果忽略大小写的用string1.equalsIgnoreCase(string2)进行比较,因为==只比较两个字符串是不是放在一个位置的。也可以使用string1.compareTo(string2),但是equals更清楚。6、Java API的帮助文档在docs/api/index.html,很有用途的。