运算符详解
结合赋值和运算符
- 可以在赋值中使用二元运算符,这是一种很方便的简写形式.例如:
x+=4;
,等价于x=x+4;
.(一般的要把运算符放在=号左边,如*=,%=)
如果运算符得到一个值,其类型与左侧操作数的类型不同,就会发生强制类型转换,例如:如果x是一个int,则以下语句
x+=3.5;
是合法的,将把x设置为(int)(x+3.5)
自增与自减运算符
- 加一,减一是数值变量的最常见的操作.在Java中,借鉴了C++的做法,也提供了自增,自减运算符:n++将变量n的当前值加1,n–则将n的值减1,例如:
int n=12;
n++;
将n的值改为13,由于这些运算符会改变变量的值,所以他们的操作数不能是数值,例如:
4++
是不合法的.
- 实际上,这些运算符有两种形式,一种是"后缀"形式
n++
,还有一种是"前缀"形式++n
,"后缀"和"前缀"形式都会使变量值加一或减一,但用在表达式中时,二者就有区别,前缀形式会先完成加一,而后缀形式会使用变量原来的值.
int m = 7;
int n = 7;
int a = 2 * ++m; // now a is 16,m is 8
int b = 2 * n++; // now b is 14,n is 8
建议不要在表达式中使用++,因为这样代码很容易使人困惑.
关系式与boolean运算符
- Java包含丰富的关系运算符,要检测相等性,可以使用两个等号==,例如:
1==7
,返回值为false.另外可以使用!=检测不相等,例如:3!=7
,返回值为ture. - 最后,还有经常使用的
<
(小于),>(大于),<=
(小于等于),>=
(大于等于)运算符. - Java沿用了C++的做法,使用
&&
表示逻辑"与",使用||
表示逻辑或,使用!
表示逻辑非,&&
和||
运算符是按照"短路"的方式来计算,如果第一个操作数已经能确定表达式的值,第二个操作数就不必计算了.例如:条件一 && 条件二
.
如果条件一是false,那么结果不可能为true,因此第二个表达式不需要计算,可以利用这一点来避免错误.
- 类似的,
条件1 || 条件2
,如果条件1正确,则整个表达式返回true.
位运算符
- 处理整型类型时,可以直接对组成整型数值的各个位完成操作,这意味着可以用掩码技术得到整数中的各个位.位运算符包括:
&
(and),|
(or),^
(xor),~
(not). - 这些运算符按照位模式处理,例如:如果n是一个整数变量,而且用二进制表示的n从右边数第4个1,则
int fourBitFrom = (n & 0b1000) / 0b1000;
.会返回1,否则会返回0.利用&并结合使用适当的2的幂,可以把其他位掩掉,而只报了其中的某一位.
应用在布尔值上,&和|运算符也会得到一个布尔值,这些运算符与&&和||运算符很类似,不过&和|运算符不采用"短路"方式求值.
- 另外,还有>>和<<运算符将位模式左移或右移,需要建立位模式来完成位掩码时,这两个运算符会很方便使用.
- 最后,>>>运算符会用0填充高位,这与>>不同,它会用符号位填充高位,不存在<<<符.
移位运算符的右操作数要完成模32的运算(除非左操作数是long类型,在这样的情况下需要对右操作数模64).例如:1<<35的值等同于1<<3,都为8.
括号与运算符级别
- 运算的优先级(后面为结合性),由高到低排序
- [].()(方法调用):从左向右
- !,~,++,–,+,-,(),(强制类型转换),new:从右向左
- *,/,%:从左向右
- +,-:从左向右
- <<,>>,>>>:从左向右
- <,<=,>=,instanceof:从左向右
- ==,!=:从左向右
- &:从左向右
- ^:从左向右
- |:从左向右
- &&:从左向右
- ||:从左向右
- (
?:
):从右向左 - =,+=,*=,-=,/=,%=,&=,^=,<<=,>>=,>>>=:从右向左
枚举类型
- 有时候,变量的取值只在一个有限的集合内,例如尺寸大小在S,M,L,X之间.针对这种情况,可以自定义枚举类型,枚举类型包括有限个命名的值,例如:
enum Size { SMALL,MEDIUM,LARGE,EXTRA_LARGE};
- 声明这种类型的变量:
Size s =Size.MEDIUM;
- Size类型的变量只能存储这个类型中给定的某个枚举值,或者null值,null表示这个变量没有设置任何值.
字符串
- 从概念上讲,Java字符串就是Unicode字符序列,例如:串"Java"由4个Unicode字符J,a,v,a组成.Java中没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,为String类,每个用双引号括起来的字符串都是String类的一个实例.例如:
Stirng e = ""; //空串
Stirng greeting = "Hello";
子串
- String类中使用substring方法可以从一个较大的字符串提取一个子串,例如:
String greeting = "Hello";
String s = greeting.substring(0,3); //"Hel"
- substring第二个参数是不想复制的第一个位置,这里要复制0,1,2,在substring中从0开始计数,直到3为止,但不含3.
拼接
- Java允许使用+号拼接两个字符串.
String explotive="Hello";
String PGL3=" World";
String str=explotive+PGL3; //Hello World
- 当将一个字符串与一个非字符串的值进行拼接时,后者被转化为字符串.例如
int age=13;
String str = "age = " + age; //age = 13
不可变字符串
- String类中没有提供用于修改字符串的方法,例如:
String greeting = Hello
,如果希望将greeting的内容修改为’Help!",不能直接将greeting的最后两个位置的字符修改为’p’和’!’,在Java中采用的方式是先提取再拼接的方式.
greeting = greeting.substring(0,3)+"p!"; //Help!
- 由于不能修改Java字符串的字符,所以Java文档中将String类称为不可变字符串,如同数字3永远都是数字3,字符串"Hello"永远包含’H’,‘e’,‘l’,‘l’,'o’的代码单元序列.不能修改其中的任何一个字符.
- 这样效率确实不高,但是有一个好处,就是编译器可以让字符串共享.
- 工作方式:可以想象将各种各样的字符串存放到公共的存储池中,字符串变量指向存储池中响应的位置.如果复制一个字符串变量,原始字符串与复制的字符串共享的字符.
检测字符串是否相等
- 可以使用equals方法检测两个字符串是否相等,对于表达式
s.equals(t);
,如果字符串s与t相等,则返回true,否则,返回false,注意:s与t可以是字符串变量,也可以是字符串字面量.例如:"Hello".equals(greeting);
- 要想检测两个字符串是否相等,并且不区分大小写,可以使用equalsIgnoreCase方法.
"hello".equalsIgnoreCase("Hello");
. - 一定不能使用==运算符检测两个字符串是否相等,这个运算符只能确定两个字符串是否放置在同一个位置上,当然,如果字符串放在同一个位置,它们必然是相等的.但是,完全有可能将内容相同的多个字符串的拷贝放置到不同位置.
String greeting = "Hello";
System.out.println(greeting=="Hello");// true
String greeting_sub=greeting.substring(0,3);
System.out.println(greeting_sub=="Hel");// false
空串和null串
- 空串""是长度为0的字符串,可以调用以下代码检查一个字符串是否为空:
if(str.length()==0)
或者if(str.equals(""))
,空串是一个Java对象.有自己的串长度为0和内容空.不过,String变量还可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联.要检测一个字符串是否为null,使用如下代码:if(str==null)
,如果要检测一个字符串既不是空串也不是null串,即if( str != null && str.length() != 0 )
String常用的API
char charAt(int index)
:返回给定位置的代码单元.int codePointAt(int index)
:返回从给定位置的码点.- 代码点(Code Point):在 Unicode 代码空间中的一个值,取值 0x0 至 0x10FFFF,代表一个字符.
- 代码单元:在具体编码形式中的最小单位.
int offsetByCodePoints(int startIndex , int cPCount)
:返回从startIndex代码点开始,位移CpCount后的码点索引.int compartTo(String other)
:按照字典顺序,如果字符串位于other之前,返回一个负数,如果位于other后,返回一个整数,如果相等,返回0.IntStream codePoints()
:将这个字符串的码点作为一个流返回,调用toArray将他们放在一个数组中.boolean contains(CharSequence s)
:当且仅当此字符串包含指定的char值序列时才返回true.byte[] getBytes()
:使用平台的默认字符集将此String编码为字节序列,将结果存储到新的字节数组中.byte[] getBytes(String charsetName)
:使用命名的字符集将此 String编码为字节序列,将结果存储到新的字节数组中.int indexOf(int ch)
:返回指定字符第一次出现的字符串内的索引.boolean isEmpty()
:当且仅当length()为0,返回truechar[] toCharArray()
:将此字符串转换为新的字符数组.String toLowerCase()
:将所有字符转化为小写.String toUpperCase()
:将所有字符转化为大写.String valueOf(boolean b)
:返回boolean参数的字符串boolean形式.String valueOf(char c)
:返回char参数的字符串.String valueOf(char[] data,int offset,int count)
:返回char[]参数的字符串.String valueOf(double d)
:返回double参数的字符串.String valueOf(float f)
:返回float参数的字符串.String valueOf(int i)
:返回int参数的字符串.String valueOf(long l)
:返回long参数的字符串.String valueOf(Objet o)
:返回Object参数的字符串.