运算符
用+、-、乘*、/表示四则运算,当参与/运算的两个操作数都是整数时,表示整数除法,否则,表示浮点除法。整数的求余操作(有时称为取模)用%表示。
更简单的写法:
例如:
x += 4;
等价于
x = x + 4;
通常将运算符放在赋值号的左侧
自增运算:
n++ 与 ++n的区别:运算符在后面,使用变量原来的值,运算结束后该值加一。运算符在前面,n先加1做运算
关系运算符与boolean运算符:
两个等号= = 检测是否相等,例如3 = = 7的值为false
使用 !=检测是否不相等,例如 3 != 7的值为true
经常使用的运算符还有<(小于)、>(大于)、<=(小于等于)、>=(大于等于)
逻辑运算符
&&表示“与” ||表示“或”
如果第一个操作数已经能够确定表达式的值,第二个操作数就不必计算了。
例如:
expression1 && expression2
如果第一个表达式值为false,结果不可能为真。
或者是
expression1 || expression2
如果expression1为真,结果自动为真。
三元操作符:
condition ? expression1 :expression2
当条件condition为真时计算第一个表达式,否则计算第2个表达式
例如:
x < y ? x : y
返回x和y中较小的那个值
位运算符:
&(“与”)、|(“或”)、^(“异或”)、~(非)
“&”和“|”应用于boolean值,但是在得到计算结果之前,一定要计算两个操作数的值
“>>”(右移)、"<<"(左移)
“>>>”将用0填充高位,“>>”用符号位填充高位,没有“<<<”运算符
数学函数和常量
在Math类中,包含了各种各样的数学函数。
计算一个数的平方根,用sqrt方法:
例如:
double x = 4;
double y = Math.sqrt(x);
System.out.println(y); //x的平方根的值赋值给y
幂运算:
double y = Math.pow(x,a) // y等于x的a次幂
Math提供常用的三角函数方法:
Math.sin、Math.cos、Math.tan、Math.atan、Math.atan2
指数函数和对数函数
Math.exp、Math.log、Math.log10
表示π和e常量的近似值:
Math.PI、Math.E
不用再数学方法名和常量名前添加前缀“Math.”,只要在源文件的顶部加上下面这行代码:
import static java.lang.Math.;
例如:
System.out.println(“The square root of \u03C0 is " + sqrt(PI));
数值类型之间的转换
大转小可能出现溢出的风险
byte>short>int>long; float>double; char>int; int>double
不同类型的数值要做二元操作时,要先把两个操作数转换为同一种类型。
转换规则:
如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型;
否则,如果其中一个操作数十float类型,另一个操作数就会转换成float类型;
优先级如下:
double>float>long>int
强制类型转换:
在java中,允许double类型转化为int类型
例如:
double x = 9.997;
int nx = (int) x;
括号里就是想要转换成的数值类型,得到nx的9。
如果想要进行舍入计算,以便得到最接近的整数,需要使用Math.round方法
double x = 9.997;
int nx = (int) Math.round(x);
得到nx的值为10.
当调用round方法时仍然需要强制转换的原因是因为round方法返回的结果为long类型。
如果强制转换的结果超出了目标类型的表示范围,结果就会截断成一个完全不同的值。
不要在boolean类型与任何数值类型之间进行强制转换,如果有必要,可以进行三元表达式b?1:0
括号与运算符优先级别:
如果不用圆括号,就按照给出的运算符优先级次序进行计算,同一个级别的运算符按照从左往右的次序进行计算。
&&比||的优先级高。
+=是右结合运算,所以 a += b += c等价于a += (b += c)
枚举类型
有时候,变量的取值只一个有限的集合内。
可以自定义枚举类型,例如:
enum Size {SMALL、MEDIUM、LARGE、EXTRA_LARGE}
现在可以声明这种类型的变量:
Size s =Size.MEDIUM;
Size类型的变量只能存储这个类型声明中给定的某个枚举值,或者null值。
字符串
String类
用双引号括起来的字符串都是String类的一个实例:
String e = “”; //空的字符串
String gretting = “hello”;
子串
String类的substring方法可以从一个较大的字符串提取出一个子串,例如:
String greeting = “hello”;
String s = gretting.substring(0,3);
s的值为“hel”
substring方法中参数的含义,从0号位置开始一直到3,但不包含3号位的字符,字符串的第一个位置是0号位,即:
0 1 2 3 4
h e l l o
substring方法的优点:容易计算子串的长度。
substring(a,b)的长度为b-a。
拼接
在java中,允许用“+”号连接两个字符串
例如:
String expletive = “Expletive”;
String PG13 = “deleted”;
String message = expletive + PG13;
message的值就等于Expletivedeleted
当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串,任何一个java对象都可以转换成字符串。
不可变字符串
String类没有提供用于修改字符串的呃方法。
但是可以用拼接的方法。
例如:
greeting = greting.substring(0,3) + “p!”;
gretting的值变为了Help!
检测字符串是否相等
equals()表达式,字符串可以是变量也可以是常量
如下的表达式是合法的:
“Hello”.equals(greeting)
想要检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法
“Hello”.equalsIgnoreCase(“hello”)
一定不能使用 “==”运算符检测两个字符串是否相等!
但如果字符串放置在同一个位置上,它们必然相等。
空串与Null串
空串“”是长度为0的字符串,可以用以下代码检测一个字符串是否为空。
if (str.length() == 0)或if (str.equals(”"))
Null串是字符串可以存放的一个特殊值,也有方法来检测
if (str == null)
检测一个字符串既不是null也不为空串,用一下语句:
if (str !=null && str.length() != 0)
代码点与代码单元
java字符串有char序列组成。
char数据类型是一个采用UTF-16编码表示Unicode代码点的代码单元,大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
length方法将返回给定字符串所需要的代码单元数量。
例如:
String greeting = “Hello”
int n = greeting.length();// n等于5
调用s.charAt(n)将返回位置n的代码单元,n取值在0与s.length()-1之间
例如:
char first = greeting.charAt(0); //first is “H”
遍历一个字符串并且依次查看每一个代码点,可以使用下列语句:
int cp = sentence.codePointAt(i);
if (Character.isSupplementaryCodePoint(cp))
i += 2;
else i++;
String类中包含了50多个方法,而且绝大部分都很有用,需要记忆。
构建字符串:
StringBuilder类的使用:
StringBuider builder = new StringBuilder(); //构建一个空的字符串构建器
当每次需要添加一部分内容时,就调用append方法
builder.append(ch);
builder.append(str);
在需要构建字符串时就调用toString方法,将可以得到一个string对象
String completedString = builder.toString();
输入和输出
读取输入
要想通过控制台输入,首先要构建一个Scanner对象,并与“标准输入流”System.in关联
Scanner in = new Scanner(System.in);
然后就可以使用Scanner类的各种方法实现输入操作了。
例如,nextLine方法将输入一行:
System.out.println(“What is your name?”);
String name = in.nextLine();
要想读取一个单词(以空白符作为分隔符),就调用
String firstName = in.next();
读取一个整数:
System.out.print(“how old are you?”);
int age = in.nextInt();
与此类似,想要读取浮点数,就调用nextDouble方法:
最后,记得在程序的最开始添上一行:
import java.util.*;
Scanner类定义在java.util包中,当使用的类不是定义在基本java.lang包中时,一定要使用import指示字将相应的包加载进来。
格式化输出:
用System.out.printf();进行格式化打印,并且有对用的转换符参照表
在printf中,可以使用多个参数。
每一个以%字符开始的格式说明符都用相应的参数替换,尾部的转换符将指示被格式化的数值类型:
f表示浮点数,s表示字符串,d表示十进制整数等等……
可以格式化输出各种数据,日期,时间,年月日等等,方法很多。
文件输入与输出
对文件进行读取,需要一个用File对象构造一个Scanner对象。
Scanner in = new Scanner(Paths.get(“myfile.txt”));
如果文件名中包含有反斜杠符,记住在每个反斜杠之前再加一个额外的反斜杠。
写入文件,就需要构建一个PrintWriter对象,在构造器中,只需要提供文件名;
PrintWrite out = new PrintWriter(“myfile.txt”);
但指定一个相对文件名时,文件位于java虚拟机启动路径的相对位置。
如果使用集成开发环境,那么启动路径将由IDE控制。
String dir = System.getProperty(“user.dir”);
也可以使用绝对路径。
在有可能找不到目标文件的情况下,需要在main方法中用throws子句标记。
例如:
public ststic void main(String[] args) throws FileNotFoundException{
Scanner in = new Scanner(Paths.get(“myfile.txt”));
}