Java细节知识点整理

上学期Java期末考试前整理的一些不怎么会注意到的细节知识点,结果考试考的挺实在的,基本没有用到。不过既然整理了就发出来吧。

数值数据类型

整数
byte 8位带符号数 
short 16位带符号数
int 32位带符号数
long 64位带符号数
浮点数
float 32位,标准IEEE754,单精度
double 64位,标准IEEE754,双精度

char和string

char letter = 'a';
String s = "a";
'a'是一个字符
"A"是字符串

特殊字符转义序列

\b 退格键
\t Tab键
\n 换行符号
\f 换页
\r 回车键
\\\ 反斜杠
\' 单引号
\" 双引号

简易GUI界面

1
2
3
4
5
6
7
8
9
10
11
12
import javax.swing.JOptionPane;
//接收字符串GUI界面
String s = JOptionPane.showInputDialoge("Please enter an input","Title",JOptionPane.QUESTION_MESSAGE);
//选择是否的GUI界面
int a = JOptionPane.showConfirmDialog(null,"Continue");
/*
JOptionPane.YES_OPTION = 0
JOptionPane.NO_OPTION = 1
JOptionPane.CANCEL_OPTION = 2
*/
//显示信息的GUI界面
JOptionPane.showMessageDialog(null,"The Message!");

字符串转化为数字

1
2
3
4
5
int intValue = Integer.parseInt(intString);
double doubleValue = Double.parseDouble(doubleString);
long longValue = Long.parseLong(longString);
byte byteValue = Byte.parseByte(byteString);
short shortValue = Short.parseShort(shortString);

数字转化为字符串

1
String.valueOf();//各种类型的变量都可以用这个方法转化

switch用法

1
2
3
4
5
6
7
8
char ch = 'a';
switch(ch)
{
case 'a':System.out.print(ch);
case 'b':System.out.print(ch);
case 'c':System.out.print(ch);
default:System.out.print(ch);
}

运行结果为:aaaa

三元运算符

y = (x > 0) ? 1 : -1

格式化输出

常用的标识符
%b 布尔值
%c 字符
%d 十进制整数
%f 浮点数
%e 标准科学计数法
%s 字符串
指定宽度和精度
%5c 指定宽度为5
%6b 指定宽度为6
%10.2f 指定宽度为10 精度为2

浮点数来控制循环

不要使用浮点数来控制循环,因为浮点数通常是用近似值表示的,无法得到像整数一样精确的值,比如以下循环是无限循环

1
2
3
4
5
6
7
double item = 1;
double sum = 0;
while(item != 0)
{
sum += item;
item -= 0.1;
}

输入和输出重定向

在终端运行java程序时,可以通过文本文件完成输入和输出
java MyClass < input.txt  通过txt输入数据
java MyClass > output.txt  将运行结果输出到txt
java MyClass < input.txt > output.txt 也可连用

for循环

for( ; ; ) 等价 for( ;true; ) 等价 whlie(true)

最小化数值误差

涉及浮点数的数值误差是不可避免的,如:计算0.01到1.0的数列之和

1
2
3
4
double sum = 0;
for(double i = 0.01;i <= 1.0;i += 0.01)
sum += i;
System.out.println(sum);//结果为49.50000000000003,(精确结果应为50.50)

在大数之前先加小数是减小误差的方法,因为例如,100000000.0+0.00000001的精确结果是100000000.0
所以在本例中,以(0.01,0.02。。。0.99,1.0)的顺序求和,结果会更精确

蒙特卡罗模拟

利用随机数和概率解决问题
例如:求π
(1)随机生成正方形内的一点(2)计算落入内接圆的概率,从而求得PI。

1
2
3
4
5
6
7
8
9
10
int inNum = 0;
int testNum = 10000000;//测试的次数
for(int i=0;i<testNum;i++)
{
double x = Math.random();
double y = Math.random();
if(Math.sqrt( (Math.pow(x-0.5,2) + Math.pow(y-0.5,2)) ) <0.5)//记录在圆内的个数
inNum++;
}
System.out.println("PI = " + inNum*4/(double)testNum);

方法的重载

被重载的方法必须具有不同的参数列表。不能基于不同修饰符号或返回值类型来重载方法,但并不意味着不能修改修饰符号或返回值。例如下面这个例子。

1
2
3
public void m1(int x){}
private int m1(int x,int y){return 12;}
//public String m1(int x){return "12";} //error!Duplicate method m1(int)

有时调用重载的方法时,会有多个匹配,此时会产生歧义调用的错误

1
2
3
4
5
public static void main(){
double m = max(1,2); //error 无法识别与哪个方法匹配
};
static double max(int num1,double num2){};
static double max(double num1,double num2){};

声明数组的方法

1
2
3
elementType[] arrayRefVar = new elementType[arraySize];
elementType arrayRefVar[] = new elementType[arraySize];
elementType arrayRefVar[] = {,,,};

与类的实例化不同,分开写会报错,如

1
2
double[] myList;
myList = {1.9,2.9,3.4};//error

char[]

对于char[]类型的数组,可以用一条语句打印。
如:

1
2
char[] city = {'D','a','l','l','a','s'};
System.out.print(city);

for-each循环

针对数组使用的循环
for(double u : myList){}

数组复制

list2 = list1;
该语句并不能将list1复制到list2,只会将数组list1的引用传递给list2
复制数组的方法:
1) 使用循环逐个复制数组的元素。
2) 使用System类中的静态方法arraycopy(注意:该方法违背了Java的命名习惯)

System.arraycopy(sourseArray, src_pos, targetArray, tar_pos, length);

3) 使用clone方法复制数组

匿名数组

new int[]{3,1,2,3,1}

没有变量名显式地引用变量,这样的数组称为匿名数组

方法传递数组

对于数组类型的参数,参数值是数组的引用,给方法传递的是这个引用.
例:

1
2
3
4
5
6
7
8
public static void main(String arguments[]){    
int[] as = {1,2,3};
m(as);
System.out.println(as[0]); //输出为100
}
public static void m(int[] array){
array[0] = 100;
}

array虽然是参数,却成功修改了as[0]的值

可变长参数列表

1
2
3
4
5
public static void main(){
m(1.2);
m(new double[]{1,232,1.2});
}
public static void m(double... numbers){}

numbers是可变长参数,所以既可以传double类型的数或者double类型的数组

Arrays类

1
2
3
4
5
6
java.util.Arrays.sort(array);//Sort the whole array
java.util.Arrays.sort(array,1,3);//Sort part of array
java.util.Arrays.binarySearch(list,12);//利用二分法查找列表中某个元素的位置,列表必须排好序
java.util.Arrays.fill(list1,5);//Fill 5 to the whole array
java.util.Arrays.fill(list1,1,3,8);//Fill 8 to a partial array
java.util.Arrays.equals(list1,list2);//判断列表1和列表2的内容是否相同

二维数组构建

使用语法 new int[5][]创建数组时,必须指定第一个下标.语法new int[][]是错误的

基本类型变量和引用类型变量

int double 等属于基本类型变量
数组 各种类的实例化后的变量 属于引用类型变量

Have a nice day!