一、语言基础:
参考《Java语言程序设计基础篇第10版》总结
ctrl+f:常见错误
1..概述:
(1)Java语言规范,API(应用程序接口)。JavaSE、JavaEE、JavaME。JDK。
每个类都被编译成一个独立的.class文件)
(2)注释:// /**/ 文档注释:/** */ , javadoc命令提取成HTML文件,放在类或者方法头前面。
(3)二元操作符两边各加一个空格。
(4)文件名必须与公共类名完全相同。
(5)程序设计错误:语法错误,运行时错误,逻辑错误。
(6)Java 程序可以内嵌在HTML 网页内,通过Web 浏览器下载. 给Web 客户带来生动的动画和灵活的交互性。
2..基本程序设计:
(1)加号“+”:字符串连接符。字符串常量不能跨行,可用“+”。
(2)输入输出:
②不直接支持控制台输入:
Import java.util.Scanner;
Scanner input=new Scanner(System.in);
input.nextDouble();//(可以空格或者回车键分开 连续几个nextDouble()方法时)
(3)import:
import java.util.Scanner;
除非要在程序中使用某个类,否则关于被导人包中的这些类的信息在编译时或运行时是不被读入的。导人语句只是告诉编译器在什么地方能找到这些类。声明明确导人和声明通配符导人在性能上是没有什么差别的。
(4)标识符:
①字母、数字、下划线、美元符号($),不能以数字开头。(习惯上,$只用在机器自动产生的源代码中。)
②命名习惯:
变量和方法: 第一个单词的字母小写,而后面的每个单词的首字母大写。例如,变量radius 和area 以及方法print。
类名:每个单词的首字母大写。例如,类名ComputeArea 和System。
常量:所有字母大写,两个单词间用下划线连接。常童PI 和常量MAX_VALUE0。
(5)变量:
变量声明告知编译器根据数据类型为变量分配合适的内存空间。
(6)赋值语句、赋值表达式:
Java中赋值语句可以作为一个表达式。
表达式表示涉及值、变量和操作符的一个运算,它们组合在一起计算出一个新值。
赋值语句本质上:计算出一个值并将它赋给操作符左边变量的一个表达式。
(7)命名常量:
命名常量(named const),简称常量。Final。
final double PI=3.14159;
(8)数值数据类型和操作:
①byte short int long float double(双精度)
②%:只有当被除数是负数时,余数才是负的。例如:-7%3 结果是-1, -12%4 结果是0, -26%-8 结果是-2, 20%-13结果是7。
求余、余数运用例子:
如果今天是星期六,10天之后是星期几呢?是星期二
Math.pow(a,b) a^b
(9)数值型直接量:
一个直接量(literal) 是一个程序中直接出现的常量值。
①整形:默认为int,十进制
long:追加L或l
二进制:0b或0B开头
八进制:0开头
十六进制:0x或0X开头。
②浮点型:默认为double
float:追加f或F
double:追加d或D
③科学计数法:
浮点型直接量也可以用ax 10^b 形式的科学记数法表示。例如,1.23456 X 10^2 可以写成1.23456E2 或者l.23456E+2,而1.23456 x10^-2 等于1.23456E-2。E (或e) 表示指数,既可以是大写的也可以是小写的。
注:为了提高可读性,Java 允许在数值直接量的两个数字间使用下划线。
long ssn =232_45_4519;
longcreditCardNumber=2324 _4545_4519_3415L;
然而,45_和_45 是不正确的。
下划线必须置于两个数字间。
(10)自增、自减操作符:
i++ 后置自增操作符
++i 前置自增操作符
(11)数值类型转换:
拓宽类型(自动)、缩窄类型(显示完成)。(强制类型转换)
注:Java 中,x1 op= x2 形式的增强赋值表达式,执行为xl = (T)(x1 op x2), 这里T是x1 的类型。因此,下面代码是正确的。
int sum =0;
sum +=4.5;// sum becomes 4 after this statement
sum += 等价于sum = (int)(sum+ 4.5).
(12)技巧、常见错误:
①tax *100 是1185.3
(int)(tax * 100)是1185
(int)(tax * 100) / 100.0
②System.currentTimeMillis():返回从GMT 1970 年1 月1 日00:00:00 开始到当前时刻的毫秒数。(时间戳是时间开始计时的点,因为1970 年是UNIX 操作系统正式发布的时间,所以这一时间也称为UNIX 时间戳(UNIX epoch)。)
③整数溢出:
Java不会给出关于溢出的瞥告或者错误,,因此,当处理一个与给定类型的最大和最小范围很接近的数值时,要特别小心。
如果存储的浮点数很小(例如,接近于0 ),这会引起向下溢出。Java 会将它近似为0,所以一般情况下不用考虑向下溢出的问题。
④取整错误:
计算得到的数字的近似值和确切的算术值之间的不同。因为一个变量保存的位数是有限的,因此取整错误是无法避免的。涉及浮点数的计算都是近似的,因为这些数没有以准确的精度来存储。
,整数计算得到的是精确的整数运算结果。
⑤超出预期的整数除法:
Java 使用同样的除法操作符来执行整数和浮点数的除法。当两个操作数是整数时,/ 操作符执行一个整数除法,操作的结果是整数,小数部分被截去。
(13)软件开发过程:
3..选择:
(1)Boolean类型:true false(直接量)
(2)if if-else if-else if-else switch tiaojian?expression1:expression2;
在同一个块中,else 总是和离它最近的if 子句匹配
Switch:……
(3)常见错误:
①对布尔值的冗余测试 if (even == true) if(even)
②尝试:简化布尔变量賦值
③两个浮点数值的相等测试:
可以测试两个数的差距小于某个阈值,来比较它们是否已经足够接近。
(4)产生随机数:
①System.currentTimeMills()%10…… 产生一个整数,其他方法更好。
②Math.Random() 0.0~1.0之间double值,包括0.0,不包括1.0
(int)( Math.random()*10) 0~9之间整数
(5)System.exit(status)
调用这个方法可以终止程序。参数status 为0 表明程序正常结束。一个非0 的状态代码表示非正常结束。
(6)逻辑操作符:
! && || ^(异或)
产生布尔表达式
&&、|| :短路
(7)操作符优先级、结合性:
(8)调试:
4..数学函数、字符、字符串:
数学函数
Math类:java.lang包
常量:PI,E
方法:三角函数方法、指数函数方法、服务方法。
三角函数方法:
atan(a)返回值 -π/2~π/2,acos(a)返回值0~π。
指数函数方法:
服务方法:
min,max,abs :min(2.5,3)
字符数据类型和操作
(1)编码表:Unicode ASCII,Unicode码包括ASCII码,'\u0000'到‘\u007F’ 对应128个ASCII表
Java支持Unicode码,一个16位Unicode码占2字节,\u开头4位十六进制数表示,'\u0000'到'\uFFFF'。
Java中Unicode和ASCII都可使用。
(2)转义字符\
诸如\u03bl的转义符用于表示一个Unicode。转义序列中的序列号作为一个整体翻译,而不是分开翻译。一个转义序列被当作一个字符。
(3)char类型与数值类型 的转换:
0~FFFF 可隐式转成字符型,其他范围显式转换。
所有数值操作符都可以用在char 型操作数上。如果另一个操作数是一个数字或字符,那么char 型操作数就会被自动转换成一个数字;如果另一个操作数是一个字符串,字符就会与该字符串相连。
(4)方法:
> < ......
Character.isDigit(c);
String类型
(1)
这些方法为实例方法。
+(若要用加号实现连接功能,至少要有一个操作数必须为字符串) +=
空白字符。例如,"\t Good Night \n".trim()返回一个新字符串Good Night。
(2)控制台读取字符串、字符:
字符串:Scanner对象的next()方法。
next()方法读取以 空白字符结束的字符串(即 ' ' 、'\t'、'\f'、'\r'、或者'\n' )。
nextLine() 方法读取一整行文本,读取以按下 回车键为结束标志的字符串。
字符:调用nextLine()方法读取一个字符串,然后在字符串上调用charAt(0)来返回一个字符。
(3)字符串比较:
==:检测s1,s2是否指向同一对象,而不是它们内容是否相同。
(4)获得子字符串:
(5)获取子字符串中的字符或者子串:
(6)字符串和数字之间的转换:
Integer、Double 包含于java.lang中,是自动导入的。
Double.parseDouble(doubleString)
数值->字符串:+ string s=number+"";
格式化控制台输出:
System.out.printf() P124
默认情况下,浮点值显示小数点后6 位数字
默认情况下,输出是右对齐的。可以在格式标识符中放一个负号(-), 表明该条目在特定区域中的输出是左对齐的。
注:使用符号% 来标记格式标识符,要在格式字符串里输出直接量%, 需要使用%%。
5..循环
while do-while for
在循环控制中,不要使用浮点值来比较值是否相等。因为浮点值都是某些值的近似值,使用它们可能导致不精确的循环次数和不准确的结果。
while(true){……}
continue
break 立即终止包含break 的最内层循环;continue 只是终止当前迭代。
continue 语句总是在一个循环内。在while 和do-while 循环中,continue 语句之后会马上计算循环继续条件;而在for 循环中,continue 语句之后会立即先执行每次迭代后的动作,再计算循环继续条件。
Java语言中goto是保留关键字,没有goto语句,也没有任何使用goto关键字的地方。
输入输出重定向:
P141
最小数值化错误:
在循环继续条件中使用浮点数将导致数值错误。
float -> double
使用整数计数器
在较大数之前先增加较小数是减小误差的一种方法。
6..方法
(1)我们经常会说“定义方法” 和“ 声明变量”,这里我们谈谈两者的细微差别。定义是指被定义的条目是什么,而声明通常是指为被声明的条目分配内存来存储數据。
(2)方法名和参数列表一起构成方法签名。
(3)main方法是由Java虚拟机调用的。
void方法不需要return语句,但它 能用于终止方法并返回到方法调用者。语法为: return;
(5)重载方法:可以使用同样的名字来定义不同方法,只要它们的签名是不同的。
在一个类中有两个方法,它们具有相同的名字,但有不同的参数列表。Java 编译器根据方法签名决定使用哪个方法。
不能基于不同 修饰符或者 返回值类型来重载方法。
(6)变量作用域:
从声明变量的地方开始,直到包含该变量的块结束为止。局部变量都必须在使用之前进行声明和赋值。
for 循环头中初始动作部分声明的变量,其作用域是 整个for 循环。但是在for 循环体内声明的变量,其作用域只限于循环体内,是从它的声明处开始,到包含该变量的块结束为止。
(7)方法抽象与逐步求精:
自顶向下,自底向上。
7..一维数组
(1)声明、创建、初始化数组:
double[] a; (double a[]也可以)
只是创建一个对数组的引用的存储位置。 如果变量不包含对数组的引用,那么这个变量的值为 null。
double[] a=new double[10];
引用变量。
double[] a={ 1.2 ,3 , 4 , 5.2 };
(2)默认值:
a.length
默认值。数值型基本数据类型:0,char:'\u0000',boolean:false。
(3)处理数组:
对于char[] 类型的数组,可以使用一条打印语句打印。例如:
char[] city={ 'D','a','l','l','a','s' };
System.out.println(city);
(4)foreach循环:
for(double e:myList){
System.out.println(e);
}
对myList 中每个元素e 进行以下操作
(5)复制数组:
循环语句逐个复制;System.arraycopy;clone方法(13章讲)。
复制前必须创建目标数组以及分配给它的内存空间。复制完成后,sourceArray 和targetArray 具有相同的内容,但占有独立的内存空间。
垃圾回收)。
(6)将数组传递给方法、从方法中返回数组:
public static void printArray(int[] array){……}
printArray(new int[]{3,1,2,6,4,2});
new int[]{ 1,2,3,4 } 匿名数组
给方法传递引用
对象存储在一个称作 堆(heap)的内存区域中,堆用于 动态内存分配。
从方法中返回一个数组时,数组的引用被返回。
public static int[] reverse(int[] list){
……
return mylist;
}
(7)可变长参数列表:
具有同样类型的可变长度的参数可以传递给方法,并将作为数组对待。
只能给方法中指定一个可变长参数,同时该参数必须是最后一个参数。任何常规参数必须在它之前。
(8)二分查找(P227代码)、线性查找 ,选择排序
(9)Arrays类
java.util.Arrays 静态方法
①排序:
②查找:
binarySearch方法:数组要提前按升序排列好。返回值:不存在返回-(插入点下标+1),正常返回索引。
binarySearch(list,'a');
③检测相等:
equals方法:equals(list1,list2);
④填充整个或部分数组:
fill方法:下列代码将5 填充到 list1 中,将8 填充到元素 list2[1] 到 list2[5-1] 中
int[] list1={2,3,7,10};
int[] list2={2,4,7,7,7,10};
fill(list1,5);
fill(list2,1,5,8)//fill 8 to a partial array
⑤返回字符串:
toString方法:
int[] list={2,4,7,10};
System.out.println(Arrays.toString(list));
(10)命令行参数:
main方法可以从命令行接受字符串参数。
java TestMain arg0 arg1 arg2
java TestMain arg1 "arg have space" arg3
如果运行程序时没有传递字符串,那么使用new String[0]创建数组。此时,该数组是长度为0的空数组。args不为null,但args.length=0;
当符号* 用于命令行时表示当前目录下的所有文件。在使用命令 java Test * 之后,下面的程序就会显示当前目录下的所有文件。
8..多维数组
(1)二维数组:
①
int[][] matrix=new int[5][5];
int[][] a={ {1,2,3},{4,5,6},{7,8,9},{10,11,12} };
a[0].length
②锯齿数组
int[][] triangleArray={ {1,2,3,4,5},{2,3,4,5},{3,4,5},{4,5},{6} };
int[][] triangleArray=new int[5][];
triangleArray[0]=new int[5];
triangleArray[1]=new int[4];
注:使用语法new int[5][] 创建数组时,必须指定第一个下标。语法new int[][] 是错误的。
(2)多维数组:
double[][][] scores=new double[6][5][2];
二维数组由一个一维数组的数组组成,而一个三维数组可以认为是由 一个二维数组的数组 所组成。