数据类型
JAVA是一种强类型语言(python也是一种强类型语言),每个变量都有一个类型。JAVA一共有8种基本类型,其中有4种整型、2种浮点类型、1种用于表示Unicode编码[1]的字符单元的字符类型char以及一种表示真值的boolean类型。
整型
-
JAVA中的整型分为四种,int(4字节)、short(2字节)、long(4字节)以及byte(1字节)。
-
与C/C++不同,JAVA中的int和long类型的大小与目标平台无关。注意,Java中的整型都是有符号的。
浮点类型
- 浮点类型有两种,float型(4字节)和double型(8字节)。
- 当正整数除以0时,结果为正无穷,在Java中用Double.POSITIVE_INFINITY表示;当负整数除以0时,得到的结果是负无穷,用Double.NEGATIVE-INFINITY表示;当遇到计算0/0或者计算负数的平方根结果时,计算出错,结果用Double.NaN表示。
- 当我们检测一个给定值是否是NaN时,可以使用Double.isNaN方法。
- 浮点数值计算存在舍入误差,这是由于浮点数值是采用二进制系统表示的[2]。
char类型
- char类型的字面量值要用单括号括起来,'A’是编码值为65对应的字符常量,而"A"是一个包含字符A的字符串。
- Unicode=转义序列会在解析代码之前得到处理,如,"\u0022+\u0022"的输出结果并不是""+"",而是空字符串,因为\u0022被解析成了",因此该语句变成了拼接两个空字符串,结果还是空。
boolean类型
- boolean类型有两个值:false和true,用来判定逻辑条件。
- 与Python不同,整型值和布尔值直接按不能进行相互转换(python中大于0的整数可以看作是true,0看作是false)。
变量
变量初始化
在使用变量之前,需要先声明变量,再对变量进行初始化(赋值),或者将变量的声明和初始化放在一起。如下
int vacationDays;
vacationDays=7;
或者
int vacationDays=7;
注意,每个完整的Java语句都应该以;结束
在C/C++中,区分变量的声明和定义,而Java中不区分:
变量的定义
int i = 10;
变量的声明
extern int i;
常量
在Java中,利用关键字final指示常量。如:
final double CM_PER_INCH = 2.54;
关键字final表示这个变量只能被赋值一次,以后无法再次更改。一般我们把常量名全部大写。
如果我们希望某个常量可以在一个类中的多个方法中使用(通常将这些常量称为类常量),可以使用关键字static final,将类常量定义在main方法的外部,如:
public class Constants2
{
public static final double CM_PER_INCH=2.54;
public static void main(String[] args)
{
double paperWidth=8.5;
double paperHeight=11;
System.out.println("Paper size in centimeters:"+ paperWidth*CM_PER_INCH+"by "+paperHeight*CM_PER_INCH);
}
}
运算符
- 考虑到可移植的特性,Java使用关键字strictfp标记的方法来使用严格的浮点计算生成可再生的结果。如果不使用该关键字,则允许对中间计算结果采用扩展的精度(double类型使用64位存储一个数值,而有些处理器使用80位浮点寄存器,这些寄存器增加了中间过程的计算精度)。
在Math类中,为了达到最快的性能,所有的方法都使用计算机浮点单元中的例程。如果想要在所有平台上都相同的计算结果,应该使用StrictMath类。 - 强制类型转换时,可能会存在信息丢失现象。强制类型转换的语法与有所不同。
a = 123 #python中的强制类型转换
b = str(a)
double x = 9.618; //java中的类型转换
int y = (int) x;
- Java中,使用&&表示逻辑“与”运算符,使用||表示逻辑“或”运算符,使用!表示逻辑“非”运算符。&&和||运算符是按照“短路”方式来求值的,可以借助这个特性来减少计算量。
- Java中‘<<’表示左移,’‘5<<2’‘表示先将5表示为二进制,然后左移2位,低位补0;’>>‘表示右移,"5>>2"表示将5表示为二进制,然后右移2位,高位补0。’>>>‘为无符号右移,"5>>>2"表示先将5表示为二进制,然后右移2位,高位补0。’>>‘与’>>>‘的区别是’>>‘对正数进行右移,高位补0,而对负数进行右移,高位补1;而’>>>'无论正负数,右移均是在高位补0。不存在’<<<'运算符。
- 位与(&)、位或(|)、位异或(^)、位非(~)均是在对应位上进行各种操作
字符串
- String类可以借助substring方法提取字符串的子串。
- 与Python相同的是,Java也允许用’+'来拼接两个字符串;与python不同的是,在Java中,可以将一个字符串与非字符串进行拼接,后者会自动转换成字符串,在python中则不可以。
- Java中的字符串是不可改变的,可以通过提取字符串的子串和拼接方法完成修改。例如,想将字符串"Help!“修改位"Help me”,可以通过以下操作实现。
String greeting = "Help!"
greeting = greeting.substring(0,4)+'me'
- 可以通过equals方法判断两个字符串是否相等。
输入输出
System.out.print("What is your name?"); //打印输出到控制台窗口
Scanner in = new Scanner(System.in);
String name = in.nextline(); //读取输入的一行
String firstName = in.next(); //读取输入的一个词
int age = in.nextInt(); //读取输入的一个整数
System.out.printf("Hello,%s.Next year,you will be %d",name,age);//用法同C语言中的用法
Scanner in = new Scanner(Paths.get("myfile.txt"),"UTF-8");//读取文件
PrintWriter out = new PrintWriter("myfile.txt","UTF-8");//写入文件,如果文件不存在,则创建该文件。
控制流程
- 不能在嵌套的两个块中声明同名的变量。如下所示,这是错误的,无法通过编译。(在python中就不存在这种情况)
public static void main(String[] args)
{
int n;
{
int k;
int n;//编译时出错,会提示“error:variable n is already defined in method main(String[] args)”
}
}
- else子句与最邻近的if构成一组(Java不支持elif语句,需要使用else if)
- while循环有两种方式
do statement while(condition);//先执行一次后再判断循环条件
while(condition) statement;//先进行判断,有可能一次也不执行
- for语句与C语言中的for语句一样,for语句的3个部分应该对同一个计数器变量进行初始化、检测和更新。
- 在循环中,检测两个浮点数是否相等需要格外小心,由于浮点数有舍入的误差,最终可能得不到精确值,而导致循环体一直执行
- Java中的switch语句与C语言中的相同。
- Java提供带有标签的break语句,可以跳出多重循环。
Scanner in = new Scanner(System.in);
int n;
read_data:
while(...)
{
for(...)
{
System.out.print("Enter a number >=0:");
n = in.nextInt();
if (n<0)
break read_data;
}
}
//break read_data语句执行后,跳出双重循环,继续执行下面的语句。
- continue的用法与C语言中的用法相同
数组
- for each 循环对于遍历数组元素非常好用。
public class FirstSample
{
public static void main(String[] args)
{
if (true)
{
int[] a = {1,2,3,4,5,6,7,8};//数组初始化
for (int element:a)//遍历数组中的所有元素
System.out.printLn(element);
}
}
}
- copyOf方法可以进行数组拷贝
延伸阅读
[1].Unicode
Unicode是一个符号集,是为了统一字符的表示方法而出现的。在Unicode出现之前,不同的字符表示方法不同,比如,英文用ASCII编码方式,中文用GB2312编码方式。Unicode可以容纳100多万个符号,但是只规定了字符的二进制表示,却没有规定如何存储这些二进制。
UTF-8是我们常见的Unicode的实现方式之一,与此相似的,还有UTF-16(字符用两个字节或4个字节表示)、UTF-32(字符用4个字节表示)。UTF-8是一种变长的编码方式,它用1-4个字节来表示字符。UTF-8的编码规则如下所示:
- 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII
码是相同的。 - 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n +
1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
举例,汉字“严”的Unicode值为4E25(二进制为100111000100101),“严”的二进制值有15位,因此在UTF-8编码中需要三个字节来表示这个“严”(见UTF-8编码的第二条规则),“严”的二进制编码为11100100 10111000 10100101
[2]. 浮点数值计算
能用二进制系统精确表示的数值x应该能用以下表达式表示出来:
x = a*1/2+b*1/4+c*1/8+…,如果该数值不能用该公式表示出来,则说明二进制系统只能逼近该数值,存在误差。