• 访问修饰符:(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:
1. int compareTo( String other )
2. boolean equals( Object other )
3. boolean startsWith( String prefix )
4. boolean endsWith( String String suffix )
5. int indexOf( String str )
6. int indexOf( String str, int fromIndex )
7. int lastIndexOf( String str )
8. int length()
9. String subString( int beginIndex, int endIndex )
10. String toLowerCase()
11. String trim()
• java.lang.StringBuilder:
12. StringBuilder()
13. int length()
14. StringBuilder append( String str )
15. void setChar( int i, char c )
16. StringBuilder insert( int offset, String str )
17. StringBuilder delete( int startIndex, int endIndex )
18. String toString()
• java.util.Scanner
19. Scanner( InputStream in )
20. String nextLine()
21. String next()
22. int nextInt()
23. boolean hasNext()
24. boolean hasNextInt()

 

  • 格式化输出:
1. System.out.printf方法
2. 静态的String.format方法

 

  • 控制流程:
  1. Java无goto语句
  2. break语句可以带标签
  3. 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:
1. BigInteger add( BigInteger other )
2. BigInteger subtract( BigInteger other )
3. ~  multiply(~)
4. ~ divide(~)
5. ~ mod(~)
6. int compareTo(~)
7. 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();
	}
}

 

  • 数组:
1. int[] a = new int[100] //初始化示例
2. Java中,允许数组长度为0,但数组长度为0与null不同
3. 数组拷贝:Arrays类的copyOf方法,用来拷贝数组或者增加数组的长度。多余的元素被赋值为0,若位置不足则只拷贝前面的元素。
4. Java中,没有指针运算,不能通过a+1得到数组的下一元素。
5. Java实际上没有多维数组,只有一维数组。多维数组被解释为“数组的数组”。
6.  int[][] odds = new int[NMAX+1][]; //不规则数组初始化
• java.util.Arrays:
7. static type copyOf( type[] a, int length )
8. static type copyOfRange( type[] a, int start, int length )
9. static void sort( type[] a )
10. static int binarySearch( type[] a, type v )
11. static int binarySearch( type[] a, int start, int end, type v )
12. static void fill( type[] a, type v )
13. 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();
		}
	}
}