(三)Java的基本程序设计
1. Java应用程序中的内容都必须放置在类中。命名为驼峰命名方法
2. 源代码的文件名必须与公共类的名字相同。
3. 4种整型:byte short int long
*(Java没有任何无符号类型)
| 类型 | 存储需求 | 最小值 | 最大值 | 
| byte | 1 字节 | -128 | 127 | 
| short | 2 字节 | -32768 | 32767 | 
| int | 4 字节 | -2 147 483 648 | 2 147 483 647 | 
| long | 8 字节 | -9 223 372 036 854 775 808 | 9 223 3712 036 854 775 807 | 
2种浮点类型:float double
*(float类型的数值有一个后缀F,没有后缀F的浮点数值默认为double类型,当然也可以在浮点数值后边添加后缀D),
* (一个正整数除以0的结果为无穷大,计算0/0或者负数的平方根结果为NaN)
| 类型 | 存储需求 | 最小值 | 最大值 | 有效位数 | 
| float | 4 字节 | -3.402 823 47E + 38 | 3.402 823 47E + 38 | 6-7位 | 
| double | 8 字节 | -1.791 693 134 862 315 70E + 308 | 1.791 693 134 862 315 70E + 308 | 15位 | 
char类型
| 类型 | 存储需求 | 最小值 | 最大值 | 
| char | 2 字节 | \u0000 | \uffff | 
    
boolean类型
*(false 或 true)
*(在Java中,if(x=0)这个表达式是不能通过编译的,其原因是整数表达式x=0不能转换为布尔值)
4. 关键字final表示变量只能被赋值一次,一旦赋值就不能再更改了,习惯上常量名使用全大写
5. 对于使用strictfp关键字标记的方法必须使用严格的浮点计算来产生理想的结果,如果将一个类标记为strictfp,这个类中所有的方法必须都要使用严格的浮点计算
6. >>>运算符用0填充高位,>>运算符用符号位填充高位,没有<<<运算符,对于移位运算符右侧的参数需要进行mo532de运算(除非左边的操作数是long类型,在这种情况下需要对右侧操作数模64),例如1<<35 和 1<<3 或8是相同的
7.
  
如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型
否则,如果其中一个数是float类型,另一个操作数就会转换为float类型
否则,如果其中一个操作数是long类型,另一个操作数会转换为long类型
否则,两个操作数都将被转换为int类型
8. 关于强制类型转换有可能会损失精度,如果将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断一个完全不同的值例如(byte)300的实际值为44.
9. 枚举类型包括有限个命名的值enum Size{SMALLL,MEDIUM,LARGE,EXRTA_LARGE};
10. 字符串相等使用equals,不区分大小写可以使用equalsIgnoreCase方法。
11. 判断一个字符串既不是null也不为空串,if(str != null && str.length() != 0)
12. 如果想遍历一个字符串,并且依次查看每一个代码点,可以使用下列语句:
int count = sentence.codePointCount(0,sentense.length());//获取字符串长度
int cp = sentence.codePointAt(i);
if(Character.isSupplementaryCodePoint(cp)) i+=2; //由于一个字符可能需要2个代码单元,因此需要判断一下,进行循环累加
else i++;
13. 使用+拼接字符串时,每次连接字符串都会创建一个新的String 对象,既耗时又浪费空间,此时使用StringBuilder类就可以避免这个问题的发生。
StringBuilder sb = new StringBuilder();
sb.append(str1);
sb.append(str2);
return sb.toString();
14. 从控制台获取输入:Console对象处理输入不如采用Scanner方便,每次只能读取一行输入,而没有能够读取一个单词或者一个数值的方法,但是对于密码等不适用于显示在控制台上的可以使用Sonsole对象,保存密码数组处理之安全起见需要用其他值填充覆盖
Scanner sc = new Scanner(System.in);
System.out,println("What is your name?");
String name = sc.nextLine();//读取一行
String firstName = sc.next();//读取一个单词,以空格作为分隔符,值得注意的是不论中间有多少个空格,都是区分两个单词的分隔符,比如Zhang san和Zhang san都可以使用两次next方法读取两个单词效果是一样的,如果没有三个单词而使用三次next,那么前两次也没有输出,输出的全是换行符
int age = sc.nextInt();
float weight = sc.nextDouble();
Console cons = System.console();
String userName = cons.readLine("User name:");
char[] passwd = cons.readPassword("Password:");
import java.util.*;//Scanner
import java.io.*;//Console
public class ScannerApp{
    public static void main(String[] args) throws Exception{
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入姓名:");
        String name = sc.nextLine();
        System.out.println("name---"+name);
        System.out.println("请输入年龄:");
        int age = sc.nextInt();
        System.out.println("age---"+age);
        System.out.println("请再次输入姓名:");
        String firstName = sc.next();
        System.out.println("您的姓氏---"+firstName);
        Console cons = System.console();
        String userName = cons.readLine("User name:");
        char[] psd = cons.readPassword("Password:");
    }
}
    
14. 使用静态的String.format方法创建一个格式化的字符串
String message= String.format("Hello, %s. Next year, you will be %d", name, age);
System.out.println(message);
15. for(double x = 0; x != 10;x+=0.1);由于舍入的误差,永远不会结束,可以在各自独立的不同的for循环体中定义同名的变量
16. 关于switch case 语句,从JavaSE 7 开始,case标签支持字符串判断,对于枚举类型不必在每个标签中指明枚举类型,可以由switch的表达式确定,例如
enum Signal {
        GREEN, YELLOW, RED
    }
    public class TrafficLight {
        Signal color = Signal.RED;
        public void change() {
            switch (color) {
            case RED:
                color = Signal.GREEN;
                break;
            case YELLOW:
                color = Signal.RED;
                break;
            case GREEN:
                color = Signal.YELLOW;
                break;
            }
        }
    }
17. break只能中断最近的一层循环,要想跳出最大的循环,可以在最大的循环之前加标签: here:while{...}
然后再程序中使用break here;
18. continue语句与break语句一样,他将中断正常的控制流程返回当前循环体继续下一次执行,continue之后的代码将不再执行。
19. 如果基本的整数和浮点精度不能够满足需求,那么可以使用java.math包中的两个很有用的类:Biginteger 和 BigDecimal,这两个类可以处理包含任意长度数字序列的数值,分别实现了任意精度的整数运算和任意精度的浮点数运算。
20. 与C++不同Java没有提供运算符重载功能,程序员无法重定义+和*运算符,使其应用于BigInteger类的add和multiply运算。Java语言的设计者确实为字符串的链接重载了+运算符,但没有重载其他运算符,也没有给Java程序员在自己的类中重载运算符的机会。
|  |  | 
21. 推荐使用 int[] a = new int[100];
数组长度不能是变量。创建一个数字数组时所有元素初始化为0,boolean数组元素初始化为false,对象数组元素初始化为null。数组一经创建就不能改变其大小,越界使用会抛出array index out of bounds的异常。
22. for each循环体,可以用来依次处理数组中的每个元素而不必为指定下标值而分心。
for(variable:collection) statement;
for(int element:a);//a 是数组
collection这一集合表达式必须是一个数组或者是一个实现了Iterale接口的类对象(例如ArrayList)
23. 尽管foreach做的很好,但是在很多场合下,还是需要使用传统的for循环,例如不希望便利集合中的每个元素,或者在循环内部需要使用下标值,其实配合计数器还有break以及continue语句也可以实现这一功能。另外可以使用Arrays.toString(array);来打印数组"[0,0,0,0,0...]"
24.在java中允许数组长度为0,在编写一个结果为数组的方法时,如果碰巧结果为空,则这种语法形式就显得非常有用
25. 数组拷贝:
int[] copiedArray = Arrays.copyOf(originArray, originArray.length);//完全拷贝
int[] copiedArray = Arrays.copyOf(originArray, 2*originArray.length);//增加数组长度,前面的元素完全拷贝,后面的元素初始化为0
int[] copiedArray = Arrays.copyOf(originArray, originArray.length / 2);//长度不够,则部分拷贝
26. public static void main(String[] args)命令行参数存以空格作为分隔符。保存在数组String[] args中
27. 数组排序Arrays.sort(array);//使用了优化的快速排序算法,快速排序算法对于大多数数据集合来说都是效率比较高的
28. 彩票抽取
import java.util.*;
public class LotteryDrawing{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一共有多少张彩票:");
		int total = sc.nextInt();
		System.out.println("请输入需要抽取多少张:");
		int need = sc.nextInt();
		System.out.println("一共有 "+total+"张彩票,"+"需要抽取 "+need+"张");
		System.out.println("正在初始化彩票数组...");
		int[] lottery = new int[total];
		for(int i  = 0;i < total; i++){
			lottery[i] = i + 1;
		}
		System.out.println("彩票数组初始化完毕");
		System.out.println("开始抽取彩票...");
		int[] result = new int[need]; 
		for(int i = 0; i < need; i++){
			int r = (int)(Math.random() * total);
			result[i] = lottery[r];
			lottery[r] = lottery[total-1];
			total --;
		}
		System.out.println("抽取彩票完毕");
		System.out.println("抽取结果为:");
		Arrays.sort(result);
		for(int element:result){
			System.out.println(element);
		}
	}
}
  
29. 打印杨辉三角:使用二维数组,
A.输入要生成的行数
B.每行的第一个数是1,对角线上的数是1
C.从第三行开始,从第二列开始,每个位置的数值是上一行的两个数的和
D.打印时,打印到对角线时停止,打印完一行时换行。
import java.util.*;
public class YangHui{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要生成多少行:");
        int row = sc.nextInt();
        System.out.println("开始生成");
        int[][] array = new int[row][row];
        for(int i = 0; i < row; i++){
            array[i][0] = 1;
            array[i][i] = 1;
            if(i >= 2){
                for(int j = 1; j < i; j++){
                    array[i][j] = array[i-1][j] + array[i-1][j-1];
                }
            }
        }
        for(int i = 0; i < row; i++){
            for(int j = 0; j <= i ;j++){
                System.out.print(array[i][j]);
                System.out.print("   ");
            }
            System.out.println();
        }
    }
}


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号