Java的基本程序设计结构《Java核心技术 SE8》

一个简单的Java应用程序

关键字:public class static void

public class FirstSample{
    public static void main(String[] args){
        System.out.println("Hello,World!");
    }
}

Java区分大小写;

关键字class表明类是构建java应用程序的构建块,Java程序中的全部内容都包含在类中。

分号作为语句的结束,{}划分程序块。

类名首字母大写,驼峰命名;

方法名首字母小写,驼峰命名;

.用于调用方法;

源文件的文件名必须与公共类的名字相同。

运行编译号的程序时,Java虚拟机将从指定类中的main方法开始执行。

注释

/**
 * JavaDoc文档注释
 */
public class FirstSample{
    /*
       长注释
    */
    public static void main(String[] args){
        // 行注释
        System.out.println("Hello,World!");
    }
}

数据类型

Java是一种强类型语言,必须为每一个变量声明一种类型。

Java一共有8种基本类型,4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean类型。

整型

整型允许是负数,一般int最常用。长整型long数值有一个后缀L,十六进制数值有一个前缀0X,八进制数值有一个前缀0,二进制前缀0B。可以为数字字面量加下划线,Java编译器会去除这些下划线(1_000_000,0B1111_0100)。

类型 存储需求 取值范围
long 8字节 正负2的64次方/2
int 4字节 正负2的32次方/2
short 2字节 正负2的16次方/2
byte 1字节 正负2的8次方/2

浮点类型

浮点类型表示小数,常用double,float类型的数值需要添加后缀F。

类型 存储需求 取值范围
float 4字节 大约±3.402 823 47E+38F有效位数6-7位
double 8字节 大约±1.797 693 134 862 315 70E+308有效位数15位

正整数除以0的结果是正无穷大Double.POSITIVE_INFINITY;

负整数除以0的结果是负无穷大Double.NEGATIVE_INFINITY;

计算0/0或者负数的平方根结果是Double.NaN,判断使用Double.isNaN(x)。

char类型

char类型(2字节)描述了UTF-16编码中的一个代码单元,除非必须使用UTF-16代码单元,不然使用字符串替代。

有些Unicode使用一个char值描述,有些Unicode使用两个char值描述。

字面量值使用单引号括起来,'A'是编码值为65的字符常量,char类型的值可以表示成十六进制从\u0000到\Uffff。

  • \u03C0表示希腊字母π;
  • '表示单引号
  • \u005B\u005D表示的是[和]。

码点是指与一个编码表中的某个字符对应的代码值,在Unicode标准中,码点采用十六进制书写,前缀U+,例如U+0041就是拉丁字母A的码点。

Unicode的码点可以分为17个代码级别,第一个代码级别称为基本的多语言级别,码点从U+0000到U+FFFF,其中包含经典的Unicode代码,其余的16个级别码点从U+10000到U+10FFFF,包括一些辅助字符。

UTF-16编码采用不同长度的编码表示所有Unicode码点,在基本的多语言基本中,每个字符用16位表示,通常被称为代码单元。而辅助字符采用一对连续的代码单元进行编码。

UTF8可变长编码,1-4字节,UTF-16是固定的2字节或4字节。

应用场景

因为历史遗留问题,MySQL 中的 utf8 编码并不是真正的 UTF-8,而是阉割版的,最长只有3个字节。当遇到占4个字节的 UTF-8 编码,例如 emoji 字符或者复杂的汉字,会导致存储异常。从 5.5.3 开始,MySQL 开始用 utf8mb4 编码来实现完整的 UTF-8,其中 mb4 表示 most bytes 4,最多占用4个字节。

排序规则选择常用的有utf8_general_ci , utf8_unicode_ci

utf8_unicode_ci 是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序 , 准确性比较好 , 但是性能相对比较低。utf8_general_ci 没有实现Unicode排序规则,在遇到某些特殊语言或字符是,排序结果可能不是所期望的。所以utf8_general_ci 的准确性较低 ,但是性能比较好。通常情况下 utf8_general_ci的准确性就够我们用的了。

布尔类型

boolean(布尔)类型有两个值:true和false,用来判断逻辑关系;

整型和布尔值之间不能进行相关转换。

强制类型转换通过截断小数部分将浮点值转换为整型。

double x = 9.97;
int nx = (int) x;//9

// 四舍五入
long lx = Math.round(x);//10
nx = (long) lx;//10

变量

声明变量后,必须进行赋值初始化。

变量的声明尽可能地靠近第一次使用的地方。

final修饰的变量为常量,只能被赋值一次,习惯上使用全大写,类常量常与static一起使用。

参与/运算的两个操作数都是整数时,表示整数除法(向下取整),否则是浮点除法,整数/0抛异常。

整数求余(取模)用%表示。

++n前缀先完成加1,n++会先使用变量原来的值

& | 逻辑运算,&& || 短路逻辑运算

位运算

& and
| or  
^   异或,不同是1,相同是0
~   取反
>> << 位模式右移、左移
>>>用0填充高位

字符串

字符串是Unicode字符序列。

String greeting = "Hello";

// Hel
String sub = greeting.substring(0,3);

//www.baidu.com
String baidu = String.join(".","www","baidu","com");

// 返回采用UTF-16编码表示的代码单元数量,因为辅助字符需要一对代码单元表示
int length = greeting.length();

//得到字符的实际长度,即码点数量
int cpCount = greeting.codePointCount(0,greeting.length());

// 生成int流,每个int值对应一个码点
int[] codePoints = str.codePoints().toArray();

// 返回的是代码单元的index
int index = str.indexOf("o");
char char = str.charAt(4);

// 返回的是码点
char codePoint = str.codePointAt(4);

字符串常量是虚拟机共享的,对于+或substring等操作产生的结果并不共享。

不可变字符串的优势:编译器可以让字符串共享。

JDK8中字符串是char数组,但在JDK11中字符串是byte数组。

构建字符串

避免每次连接字符串都构建一个新的String对象,耗时也浪费空间。

StringBuilder线程不安全;StringBuffer线程安全。

输入输出

打印到控制台窗口(标准输出流):System.out.println

读取控制台输入(标准输入流):构造Scanner对象,并与标准输入流System.in关联。

Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
	System.out.println(scanner.nextLine());
}

// 密码安全,一次只能读一行
Console console = System.console();
String username = console.readLine("Username:");
char[] passwd = console.readPassword("Password:");

格式化输出

用于System.out.printf和String.format,每一个以%字符开始得格式说明符都用响应得参数替换。

// 8个字符宽度,保留两位小数
System.out.printf("%8.2f",1000.0/3);
//00001,000
System.out.printf("%,08d",1000);


//f表示浮点数,s表示字符串,d表示十进制整数,b是布尔值

文件输入与输出

文件名包含反斜杠\,就在每个反斜杠前增加一个反斜杠。

读取文件,不指定编码得话,就会使用当前机器得默认编码

Scanner in = new Scanner(Paths.get("c:\\lenovo\\myfile.txt"),"UTF-8");

写入文件,文件不存在会创建文件

PrintWriter out = new PrintWriter("c:\\lenovo\\myfile.txt","UTF-8");

控制语句

boolean flag = false;
do{
    System.out.println("do...");
}while (flag);

for是确定循环,不确定循环while,至少一次dowhile。

swith-case标签可以说基本类型常量、枚举常量、字符串。

带标签的break(continue)语句,用于跳出多重嵌套的循环语句,标签必须放在希望跳出的最外层循环之前,并且必须紧跟一个冒号。

early_end:
while(...){
   for(int i = 0, i < 100, i++){
       ...
       if(...){
           break early_end;
           ...
       }
       ...
   }
}

增强for循环(for each):循环每一个元素。

for (variable : collection) statement

定义一个变量暂存集合中的每一个元素,并执行相应语句;collection集合必须是一个数组或者实现了Iterable接口的类对象。

大数值

当基本的整数和浮点数不能满足需求,可以使用java.math包中的BigInteger和BigDecimal类,这两个类可以处理包含任意长度数字序列的数值。

//使用静态方法转换
BigInteger a = BigInteger.valueOf(100);
BigInteger b = BigInteger.valueOf(200);
// 不能使用+-*/来处理大数值,应调用其方法处理
BigInteger c = a.add(b);

数组

数组是一种长度固定的数据结构,用来存储同一类型值得集合,通过一个整型下标可以访问、修改数组中的每个值。

// 指定长度
int[] ints = new int[5];
ints[0] = 1;

// 初始化
int[] ints = new int[]{1,2,3};
int a = ints[10];

//数组打印
System.out.println(Arrays.toString(ints));

//数组拷贝
Arrays.copyOf(ints, 2*ints.length);

//数组排序:使用的是优化的快速排序算法
Arrays.sort(ints);

// 多维数组
public static void main(String[] args) {

        final int MAX = 10;
        int[][] odds = new int[MAX][];
        for (int i = 0; i < MAX; i++) {
            odds[i] = new int[i + 1];
        }

        for (int i = 0; i < MAX; i++) {
            for (int j = 0; j < odds[i].length; j++) {
                int lott = 1;
                for (int k = 1; k <= j; k++) {
                    lott = lott * (i - k + 1) / k;
                }
                odds[i][j] = lott;
            }
        }
        
        for (int[] odd : odds) {
            for (int i : odd) {
                System.out.printf("%4d", i);
            }
            System.out.println();
        }
    }

命令行参数

javac Hello.java

// 对应main方法String[]参数 args[0]的是-Xms64M
java Hello -Xms64M -Xmx256M
posted @ 2022-12-07 18:38  苇草剑  阅读(81)  评论(0)    收藏  举报