爱吃鱼饵

 

Java的基本程序设计结构

知识点

关键字public 称为访问修饰符(access modifier):用于控制程序的其他部分对这段代码的访问级别;

关键字class 表明Java程序中的全部内容都包含在类中;类是构建所有Java应用程序和applet的构建块。

类名:驼峰命名法;

源代码的文件名必须与公共类的名字相同,并用.java作为扩展名。

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

根据Java语言规范,main方法必须声明为public

java中任何方法的代码都用“{”开始,用“}”结束;

关于打印字符串的语句:System.out对象并调用了它的println方法;

注释

// 单行

/* … */ 多行注释

/**… */ 文档注释,可用于自动生成文档。

数据类型

Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在Java中,一共有8种基本类型(primitive type),其中有4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char(请参见论述char类型的章节)和1种用于表示真值的boolean类型。

1、整形

byte 是 整形变量!!

byte a = 17;
        System.out.println("a = " + a);
        a = -127;
        System.out.println("a = " + a);
        a = 127;
        System.out.println("a = " + a);
        a = 128; // 报错

byte和short类型主要用于特定的应用场合,例如,底层的文件处理或者需要控制占用存储空间量的大数组。

在Java中,整型的范围与运行Java代码的机器无关。

长整型数值有一个后缀L或l(如4000000000L)。十六进制数值有一个前缀0x或0X(如0xCAFE)。八进制有一个前缀0,例如,010对应八进制中的8。

int x = 0x12;  //18
        System.out.println("x = " + x);
        byte y = 010;  // 8
        System.out.println("y = " + y);

2、浮点类型

绝大部分应用程序都采用double类型

float类型的数值有一个后缀F或f(例如,3.14F)。没有后缀F的浮点数值(如3.14)默认为double类型。

可以使用十六进制表示浮点数值;其中尾数采用十六进制,指数采用十进制;

所有的浮点数值计算都遵循IEEE 754规范。

常量Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY和Double.NaN(以及相应的Float类型的常量)分别表示这三个特殊的值;

System.out.println(Double.POSITIVE_INFINITY); // Infinity
        System.out.println(Double.NaN); // NaN
        System.out.println(Double.NEGATIVE_INFINITY); // -Infinity

所有“非数值”的值都认为是不相同的 —》 使用Double.isNaN(x)来检查x是否为一个数。

浮点数值不适用于无法接受舍入误差的金融计算中,如果希望数值计算中不允许有任何误差,就可以使用BigDecimal类。

3、char类型

Unicode字符可以用一个char值描述,另外一些Unicode字符则需要两个char值;

char类型的字面量值要用单引号括起来。

char类型的值可以表示为十六进制值,其范围从\u0000\uffff

\u表示转义序列,可以出现在加引号的字符字面量中或字符串中,其他表示在特殊字符的转义序列如下:

特殊: 转义序列\u还可以出现在加引号的字符常量或字符串之外

警告: Unicode转义序列会在解析代码之前得到处理!!!

Unicode和char类型:
Unicode1.0设置16位的Unicode字符集,但不能满足描述所有Unicode字符的需要;
在Java中,char类型描述了UTF-16编码中的一个代码单元。
最好不要在程序中使用char类型,最好将字符串作为抽象数据类型处理;

4、boolean类型

boolean(布尔)类型有两个值:false和true,用来判定逻辑条件。

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

变量

变量名必须是一个以字母开头并由字母或数字构成的序列;

不能使用一个未初始化的变量;

在java中,不区分变量的声明与定义;

常量

利用关键字final指示常量;关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。

常量名习惯上使用大写。

类常量:希望某个常量可以在一个类中的多个方法中使用。关键字 static final用来设置类常量;

类常量的定义位于main方法的外部。在同一个类的其他方法中也可以使用这个常量。而且,如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。

在Math类中,包含了各种各样的数学函数;

求余数时,当被除数为负数时,余数为负数,可以采用((position+adjustment)% 12+12)%12方法来使得余数恒定为正数,其中12表示除数;

被除数为正时,余数恒为正;

import static java.lang.Math.*  // 导入包,直接使用Math的静态函数,不需要在方法名和常量名加“math"前缀

在Math类中,为了达到最快的性能,所有的方法都使用计算机浮点单元中的例程。如果可预测的结果更加重要的话,fdlibm用来实现算法,保证在所有平台上得到相同的结果。

将boolean类型和数值类型进行转换时:使用条件表达式b?1:0;

Note: 位运算符应用在布尔值上,也会得到一个布尔值。这些运算符与&&和||运算符很类似,不过&和|运算符不采用“短路”方式来求值,也就是说,得到计算结果之前两个操作数都需要计算。

算术运算符:>> 和 <<

逻辑运算符:>>> 和<<<

枚举类型

变量的取值只在一个有限的集合内,可以自定义枚举类型。枚举类型包括有限个命名的值。

字符串

从概念上讲,Java字符串就是Unicode字符序列。

Java没有内置的字符串类型,而是在标准Java类中提供了一个预定义类,很自然地叫做String。

每个用双引号括起来的字符串都是String类的一个实例。

当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串;

String.join使用分隔符连接个字符串。

不可变字符串

由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,如同数字3永远是数字3一样,字符串“Hello”永远包含字符H、e、l、l和o的代码单元序列,而不能修改其中的任何一个字符。

可变字符串“:当然,可以修改字符串变量greeting,让它引用另外一个字符串,这就如同可以将存放3的数值变量改成存放4一样。

可变的方式通过拼接效率不高,但是不可变字符串可以使得:编译器可以让字符串共享(各种字符串存放在公共的存储池中)。

如果将字符串变量赋予另外一个字符串常量,不会产生内存泄漏,原始字符串放在堆中,垃圾回收机制会将不适用的内存进行回收。

只有字符串常量是共享的,而+或substring等操作产生的结果并不是共享的;

空串与Null串:
检查空串:if (str.length() == 0)或者 if (str.equals(“”))
String变量还可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联;
检查一个字符串既不是null也不为空串: if (str != null && str.length != 0),首先要检查str不为null;

码点与代码单元

在Java中,char类型描述了UTF-16编码中的一个代码单元。

码点(code point)是指与一个编码表中的某个字符对应的代码值。

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

​ char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。

length()方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量
想得到实际的长度,即码点数量,使用codePointCount方法。

返回位置n的代码单元, s.charAt(n)。
返回第i个码点,greeting.codePointAt(index)

码点数组和字符串可相互转换!

String API

查看文档。

创建字符串:

  • 采用字符串连接的方式,效率低,浪费空间(每次连接都会构建一个新的String对象)。
  • 使用StringBuilder类(这个类的前身是StringBuffer,其效率稍有些低,但允许采用多线程的方式执行添加或删除字符的操作)。单线程情况下可以使用StringBuilder类替代。

String API

查看文档。

创建字符串:

  • 采用字符串连接的方式,效率低,浪费空间(每次连接都会构建一个新的String对象)。
  • 使用StringBuilder类(这个类的前身是StringBuffer,其效率稍有些低,但允许采用多线程的方式执行添加或删除字符的操作)。单线程情况下可以使用StringBuilder类替代。

输入输出

获取输入:要想通过控制台进行输入,首先需要构造一个Scanner对象,并与“标准输入流”System.in关联。

当使用的类不是定义在基本java.lang包中时,一定要使用import指示字将相应的包加载进来。

因为输入是可见的,所以Scanner类不适用于从控制台读取密码;

读取密码使用Console类实现;

使用printf格式化输出;

可以使用s转换符格式化任意的对象。对于任意实现了Formattable接口的对象都将调用formatTo方法;否则将调用toString方法,它可以将对象转换为字符串。

以使用静态的String.format方法创建一个格式化的字符串;

时间转换格式符,查表。

文件输入与输出

以使用静态的String.format方法创建一个格式化的字符串

要想对文件进行读取,就需要一个用File对象构造一个Scanner对象;读取一个文本文件时,要知道它的字符编码;类似从控制台输入

要想写入文件,就需要构造一个PrintWriter对象。

当采用命令行方式启动一个程序时,可以利用Shell的重定向语法将任意文件关联到System.in和System.out:

java Myprog < myfile.txt > output.txt

根据给定的路径名构造一个Path: Paths.get(“文件uri”);

> 大数值

如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。

Java语言的设计者确实为字符串的连接重载了**+运算符**,但**没有重载其他的运算符**,也没有给Java程序员在自己的类中重载运算符的机会。

数组

数组是一种数据结构,用来存储同一类型值的集合。

一旦创建了数组,就不能再改变它的大小(尽管可以改变每一个数组元素);

for each循环:Java有一种功能很强的循环结构,可以用来依次处理数组中的每个元素;

for (var : collection) statement;

collection这一集合表达式必须是一个数组或者是一个实现了iterable接口的类对象(例如ArrayList)。
如果不希望遍历集合中的每个元素,或者在循环内部需要使用下标值,还是需要使用传统的方法。

利用Arrays类的toString方法,调用Arrays.toString(a),返回一个包含数组元素的字符串;

数组初始化以及匿名数组

  • int[] a = {1,2},注意不需要使用new
  • x = new int[] {1,2,3}.匿名数组。

在Java中,允许数组长度为0。在编写一个结果为数组的方法时,如果碰巧结果为空,则这种语法形式就显得非常有用。

拷贝所有值:Arrays.copyOf(), 这个方法通常用来增加数组的大小,用来扩容!!

命令行参数
带String arg[]参数,表示main方法,接受一个字符串数组,命令行中,每个字符串用空格分隔开。

在Java应用程序的main方法中,程序名并没有存储在args数组中。

数组排序:Arrays.sort(), 数组原地排序。

Arrays API 包含很多对数组操作的函数。

多维数组将使用多个下标访问数组元素,它适用于表示表格或更加复杂的排列形式;

不规则数组

  • Java实际上没有多维数组,只有一维数组。多维数组被解释为“数组的数组。”

posted on 2021-07-18 15:24  爱吃鱼饵  阅读(74)  评论(0编辑  收藏  举报

导航