-
访问修饰符:(access modifier) 用于控制程序的其他部分对这段代码的访问级别。
-
Java应用程序中的全部内容都必须放置在类中。(纯面向对象)
-
源代码的文件名必须与公共类的名字相同,并用 .java 作为扩展名。
-
Java编译器将字节码文件自动命名为 XXX.class ,并与源文件存储在同一目录之下。
-
main方法必须是public的,每个Java应用程序都必须有一个main方法。运行已编译的程序时,Java虚拟机将从指定类中的main方法开始执行。
- 注释:注释类型有三种。1.//... 2. /*...*/ 3./**...*/。 P.S.:其中第三种注释方式便于生成文档,注释不能嵌套。
- Java中,有8种基本数据类型(primitive type)。分别是4种整型、2种浮点型、1种布尔型、1种Unicode编码的char型。
- 4种整型:int(4字节,范围约:±2e9)、short(2字节,范围约: ±3e4)、long(8字节,范围约:±9e18)、byte(1字节,范围:-128-127)。以上范围可以做算法题目的时候作为粗略的参考。
- 2种浮点型:double(8字节,有效数字15位)、float(4字节,有效数字6~7位)。
- Java中,整型的范围与运行Java代码的机器无关。(基本数据类型的大小是固定的)
- 从Java7开始,可以为数字字面量加下划线(可读性)。编译器会自动除去。如:1_000_000、 0b1111_0100_0100_0000等。
- char类型的值可以表示为16进制值, \0u0000 到 \Uffff (转义序列)。在Java中, char描述了 UTF-16编码中的一个代码单元。
- 码点:是指与一个编码表中的某个字符对应的代码值。一个码点代表一个特定的字符,但是一个码点可能需要两个char进行表示。故:尽量不要在程序中使用char, 除非真的需要处理UTF-16代码单元。
- boolean类型:true 或者 false 。 但注意: Java中,整型和布尔值不能相互转换。若真的需要“转换”,使用 b?1:0 的方法。
- Java中,必须使用final来定义常量。(关键字final)
- 关键字strictfp。
- Math类,floorMod方法。Math.floorMod(position+adjustment, x) ,当x为正时,以上总会得到0~x-1的数。
- 类型转化可能会丢失信息,这种情况下,需要进行强制类型转换。Math.round(x)方法。
- 与C/C++不同,Java不使用逗号运算符。
- 枚举类型,只能存储某个枚举值或null值(null值表示这个变量没有设置任何值)。
- String类对象:不可变字符串。String类没有提供用于修改字符串的方法。编译器可以让字符串共享。
- String的subString方法可以获取子串。
- 一定不要使用 == 来检测两个字符串是否相等(Java并没有重载==运算符)!!(使用equals方法)
- java.lang.String:
- int compareTo( String other )
- boolean equals( Object other )
- boolean startsWith( String prefix )
- boolean endsWith( String String suffix )
- int indexOf( String str )
- int indexOf( String str, int fromIndex )
- int lastIndexOf( String str )
- int length()
- String subString( int beginIndex, int endIndex )
- String toLowerCase()
- String trim()
- java.lang.StringBuilder:
- StringBuilder()
- int length()
- StringBuilder append( String str )
- void setChar( int i, char c )
- StringBuilder insert( int offset, String str )
- StringBuilder delete( int startIndex, int endIndex )
- String toString()
- java.util.Scanner
- Scanner( InputStream in )
- String nextLine()
- String next()
- int nextInt()
- boolean hasNext()
- boolean hasNextInt()
- 格式化输出:
- System.out.printf方法
- 静态的String.format方法
- 控制流程:
- Java无goto语句
- break语句可以带标签
- foreach循环
- 不能在嵌套的块中声明同名的变量。
- break只能跳出语句块,不能跳入语句块。
- 示例程序:(给出1到N的数字,从中抽到给定的x个数字即为中奖,那么中奖概率为多少?)
package coreJava_3_5;
import java.util.*;
/**
*@lastEdited 2020.7.16
*@author 迷途小书童
*/
public class Test3_5 {
public static void main( String args[] ) {
Scanner in = new Scanner( System.in );
System.out.println("How many numbers you need to draw?");
int k = in.nextInt();
System.out.println("What is the highest number you can draw");
int tot = in.nextInt();
int odds = 1;
for( int i = 1; i <= k; i++ ) {
odds = odds * (tot-i+1) / i; //这里不能用 *= ,涉及除法,运算顺序对结果有影响。
}
System.out.printf("Your odds are 1 / %d !%n", odds );
in.close();
}
}
- 大数值:
- 大数值在java.math包中,BigInteger类实现了任意精度的整数运算,BigDecimal类实现了任意精度的浮点数运算。
- java.math.BigInteger:
- BigInteger add( BigInteger other )
- BigInteger subtract( BigInteger other )
- ~ multiply(~)
- ~ divide(~)
- ~ mod(~)
- int compareTo(~)
- static BigInteger valueOf( long x )
- 示例程序:(给出1到N的数字,从中抽到给定的x个数字即为中奖,那么中奖概率为多少?任意大的数据都能给出正确答案)
package coreJava_3_6;
import java.util.*;
import java.math.*;
/**
*@lastEdited 2020.7.16
*@author 迷途小书童
*/
public class Test3_6 {
public static void main( String args[] ) {
Scanner in = new Scanner( System.in );
System.out.println("How many numbers you need to draw?");
int k = in.nextInt();
System.out.println("What is the highest number you can draw");
int tot = in.nextInt();
BigInteger odds = BigInteger.valueOf(1);
for( int i = 1; i <= k; i++ ) {
odds = odds.multiply( BigInteger.valueOf(tot - i + 1 ) );
odds = odds.divide(BigInteger.valueOf(i) );
}
System.out.println("Your odds are 1 / " + odds );
in.close();
}
}
- 数组:
- int[] a = new int[100] //初始化示例
- Java中,允许数组长度为0,但数组长度为0与null不同
- 数组拷贝:Arrays类的copyOf方法,用来拷贝数组或者增加数组的长度。多余的元素被赋值为0,若位置不足则只拷贝前面的元素。
- Java中,没有指针运算,不能通过a+1得到数组的下一元素。
- Java实际上没有多维数组,只有一维数组。多维数组被解释为“数组的数组”。
- int[][] odds = new int[NMAX+1][]; //不规则数组初始化
- java.util.Arrays:
- static type copyOf( type[] a, int length )
- static type copyOfRange( type[] a, int start, int length )
- static void sort( type[] a )
- static int binarySearch( type[] a, type v )
- static int binarySearch( type[] a, int start, int end, type v )
- static void fill( type[] a, type v )
- static boolean equals( type[] a, type[] b )
- 示例程序:(模拟抽奖,给定1~N的抽奖范围, 抽x个数,给出这x个不重复的随机数)
package coreJava_3_5;
import java.util.*;
/**
*@lastEdited 2020.7.16
*@author 迷途小书童
*/
public class Test3_7 {
public static void main( String args[] ) {
Scanner in = new Scanner( System.in );
System.out.println("How many numbers do you need to draw?");
int k = in.nextInt();
System.out.println("What is the highest number you can draw?");
int n = in.nextInt();
int[] res = new int[k];
int[] set = new int[n];
for( int i = 0; i < n; i++ )
set[i] = i + 1;
for( int i = 0; i < k; i++ ) {
//Math.random()可以产生[0,1)的随机浮点数。
int rdm = (int) ( Math.random() * n );
//下列代码是程序的关键。用坐标来映射号码,每选走一个号码就把它推到序列末尾。
set[rdm] = set[n-1];
n--;
res[i] = rdm;
}
Arrays.sort( res );
System.out.println("Bet the following combination, you will get rich:");
for( int e : res )
System.out.print(e + " ");
System.out.println();
in.close();
}
}
- 示例程序:(构造一个直接三角形序列,每行表示 组合数C0,r 到 Cr,r )
方法1:(按组合数定义求解)
package coreJava_3_5;
/**
*@lastEdited 2020.7.16
*@author 迷途小书童
*/
public class Test3_9 {
public static void main( String args[] ){
final int ROW = 10;
int[][] arr = new int[ROW+1][];
for( int i = 0; i <= ROW; i++ )
arr[i] = new int[i+1];
for( int i = 0; i < arr.length; i++ ) {
for( int j = 0; j < arr[i].length; j++ ) {
int odds = 1;
for( int k = 1; k <= j; k++ ) {
odds = odds*( i - k + 1 )/ k;
}
arr[i][j] = odds;
}
}
for( int[] row : arr ) {
for( int e : row ) {
System.out.printf("%4d", e );
}
System.out.println();
}
}
}
方法2:(DP解法:找规律,序列为直角三角形,且每个数都等于其 左上角的数 与 上方的数 之和 ,若这两个数不存在,则默认为0)
package coreJava_3_5;
/**
*@lastEdited 2020.7.16
*@author 迷途小书童
*/
public class Test3_9_2 {
public static void main( String args[] ) {
final int ROW = 10;
int[][] arr = new int[ROW+1][];
int[] dx = { -1, -1 };
int[] dy = { -1, 0 };
for( int i = 0; i <= ROW; i++ )
arr[i] = new int[i + 1];
arr[0][0] = 1;
for( int i = 1; i < arr.length; i++ ) {
for( int j = 0; j < arr[i].length; j++ ) {
int odds = 0;
for( int k = 0; k < 2; k++ ) {
int x = i + dx[k];
int y = j + dy[k];
if( x >= 0 && y >= 0 && y < i ) {
odds += arr[x][y];
}
}
arr[i][j] = odds;
}
}
for( int[] row : arr ) {
for( int e : row ) {
System.out.printf("%4d", e );
}
System.out.println();
}
}
}