- 每个变量都有一个类型(type)。
- 变量必须以字母开头,以字母和数字组成,不能有空格,不能用保留字作变量名,大小写是敏感的,变量长度一般没有限制。
- 可以有int i j;的写法,但是不提倡,逐行书写可以提高可读性,有习惯把变量名写为类型名的变形。
- 变量必须初始化,可以定义和初始化同时进行如int vacationDays = 12.
- 可在程序中任意地方声明变量,尽可能在靠近变量第一次使用的地方声明变量。(JAVA中不区分变量的声明与定义)。
- JAVA中用final指示常量,即表示该变量只能被赋值一次,一般常量名全大写。
- JAVA中要在一个类的不同方法中使用同一常量,则要在main之外用static final设置一个类常量。
- +-*/% /的时候,操作数是整数时用整数除法or表示浮点除法,整数被0除会产生一个异常,浮点数被0除会得到无穷大或NaN;%称求余或取模。
- Math类,求一个数的平方根可用sqrt方法,求幂运算可用pow方法,pow中两个参数以及返回值都是double型。
- 常用的三角函数;指数函数以及自然对数和以10为底的对数;e和π的近似值。
- 数值的合法转换:
double float long int
复制代码
- 强制类型转换 cast
double x = 9.997;
int nx = (int) x;
这样是截断小数点数字。
若要得到最相近的整数则要调用Math.round方法
double x = 9.997;
int nx = (int) Math.round(x); - 强制类型转换有丢失信息甚至被截断为一个完全不同的值的风险。
- 二元运算符+= etc ,若是x是int,x += 3.5是合法的,会把x设置成(int)(x+3.5)
- ++n n++ 都会使n加一,前缀先加再使用,后缀先使用再加;不建议再表达式之中使用++ --,不易阅读且会有bug的风险。
- == != < > <= >= && || !
&& || 会有判断第一个之后不用判断第二个的情况(短路) - 三目运算符 ? :
condition ? expression1 : expression2
x<y ? x : y - 位运算符 ?????
- 优先级 P44
- 枚举类型。
- 字符串 预定义类String 每个用双引号括起来的字符串都是String的一个实例
子串 可用substring从一个较大的字符串中提取出一个子串
eg:
String greeting = "Hello";
String s = greeting.subsring(0 , 3);
substring中的第二个参数表示第一个不取的位置,用substring可以很方便的得到取出的子串的长度
如s.substring(a , b)的长度为b-a - 用+连接两个字符串 (简单的拼接,中间没有空格)
字符串与非字符串的值进行拼接时,后者被转换成字符串。 - JAVA中的Sring类对象是不可变字符串,要改变字符串可以用substring和+连用。 JAVA中的思想是共享提升的效率远大于提取拼接所降低的效率。
- equals 检测字符串是否相等。 equals允许字符串变量和字符串自变量进行比较。
"Hello".equals(greeting)
若要忽略两字符串的大小写,则用equalsIgnoreCase
千万别用==检测两字符串是否相等 - 空字符串和Null串是不一样的。
- 代码点/字符编码(找blog看)。
- 读取输入需要先构造一个Scanner对象且与System.in关联。
Scanner in = new Scanner(System.in)
Scanner类有各种方法实现输入操作。
用Console实现从控制台读取一个密码。 - System.out.printfln System.out.print System.out.printf
- 文件的输入与输出。
- 控制流程即判断,循环,switch。(JAVA中没有goto,但有break)
- 块(block)即复合语句,是由一堆大括号括起来的若干条简单的Java语句,决定了变量的作用域,一个块可以嵌套在另一个块之中。(不能再嵌套的块中声明同名变量,这与C++不同)
- 条件语句 if (condition) statement
期望在条件成真时执行多条语句,即用到块语句(block statement),即用{}。
if (condition1) statement else condition2
else也自动和最近的else配对。
if ... else if...交替出现的使用。
习惯把{}单独写一行以对齐。(个人习惯) - while (condition) statement
do statement while(condition)
while可能一次不做 do while必做一次 - P67两端代码未手敲。
- for循环(确定循环) 是支持迭代的通用结构,利用每次迭代之后更新的计数器或变量来控制迭代次数。
for循环第一部分用来对变量进行初始化,第二部分为每次迭代之后要检测的循环条件,第三部分指示如何更新计数器。
不成文的规定即三个部分应该对同一变量进行操作。
在for语句内部定义的变量的作用域仅为该for语句的循环体,不同for语句可定义同名的变量。
for循环与while循环可相互改写。 - P71未手敲。
- 多重选择语句switch语句(与C完全一样)。
特别注意的即为switch case语句为直通式(fallthrough)行为,即遇到break才跳出,于是不常使用switch语句。若无对应的case则执行default子句。
若要用switch语句,可在编译代码时加上-Xlint:fallthrough以达到若每个case之后少一个break,编译器就会给出一个警告。
case标签可以是char、byte、short、int的变量表达式,也可是枚举常量和字符串字面量。 - 中断控制流程语句break
JAVA把goto作为保留字,但不打算在语言中使用它,而增加了带标签的break语句来实现这种程序设计风格。
不带标签的break即与switch case中的break一样表示跳出当前循环。
带标签的break,break放在要跳出的循环体名称之前,可跳出多重循环。
只能跳出语句块不能跳入语句块。
一个需要区分的是continue语句,表示跳出当前这次循环而回到循环开头继续这个循环。 - 当整型和浮点型的精度无法满足要求时,可用java.math包中的两类:BigInteger和BigDecimal来分别处理任意长度的整数和浮点数。
用valueOf方法可把普通的数值转换成大数值:
BigInteger a = BigInteger.valueOf(100)
大数值不能用+ *处理,而只能用大数值类红的add和multiply方法
BigInteger c = a.add(b)//c = a + b
BigInteger d = c.multiply(b.add(Biginteger.valueOf(2)))//d = c * (b + 2) - P77代码未手敲。
- 数组是一种数据结构,用以存放同一类型值的集合。
Java中习惯用int[] a这种形式来声明一个数组。
使用new运算来创建数组 int [] a = new int[100]
数组一旦创建就不可改变其大小,只能改变其元素。如果要经常在运行过程中扩展数组的大小,要用到另一种数据结构——数组列表(array list)。
数组从0开始计数。
用for循环初始化数组,初始化为0,boolean数组初始化为false,对象数组的元素初始化为null,可用for循环将其也初始化为0
for ( i=0 ; i<10 ; i ++)
names[i] = " ";
可用array.length来获得数组中的元素个数 - for each循环
增强的for循环,不必为下标值而分心,会遍历每个元素。 - 创建数组对象且同时赋予初始值的简化书写形式
int[] smallPrimes = { 2, 3, 5, 7, 11, 13 };
枚举法定义数组时数组的大小即为初始值的个数。
Java中允许数组的长度为0.长度为0不是null。
new int [n] 创造一个长度为n的数组。 - Java中允许把一个数组的一个变量拷贝给另一个数组的一个变量
int[] luckyNumbers = smallPrimes;
luckyNumbers[5] = 12;
若要把一个数组的所有值拷贝到一个数组上去,则要用Array类的copyOf方法
int[] copiedLuckyNumbers = Array.copyOf(luckyNumbers, luckyNumbers.length);
常用此方法来增加数组的大小:
luckyNumbers = Array.copyOf(luckyNumbers, 2 * luckyNumbers.length)
若拷贝的数组长度长于原始数组,则多余的赋0,布尔值则多余的赋false,若短,则只拷贝前面的数据元素。 - 数组排序的程序。
创建两个数组,数组赋值,得到一个0到n-1的随机数,抽取,确保不会重复抽,输出结果。
P83未手打。 - 多维数组
要访问一个二维数组的所有元素,需要用嵌套的for循环来完成。
P87未手打。 - 不规则数组
实际上内存上没有多维数组的说法,只是数组的数组而已,故可以定义不规则的数组,即每行有着不同的长度。P89未手打。