Java核心技术——第3章

Posted xkf97

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java核心技术——第3章相关的知识,希望对你有一定的参考价值。

一个简单的Java应用程序

public class FirstSample
{
	public static void main(String[] args)
	{
		System.out.println("We will not use ‘Hello,World!‘");
	}
}
  • public:访问修饰符(access modifier),用于控制程序的其他部分对这段代码的访问级别

  • class:表明程序中的全部内容都包含在类中

  • FirstSample:类名

    命名规则:必须以字母开头,后面可以是字母数字的组合,但不能使用Java保留字

    命名规范:类名为以大写字母开头的单词,如果由多个单词组成,则每个单词第一个字母大写

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

  • Java区分大小写,main如果写成Main则错误

注释

三种方式

  1. 最常用://
  2. 长篇注释:/**/括起来,不能嵌套
  3. 自动生成文档:/**开始,*/结束

数据类型

一共8种数据类型:4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char

整型

技术图片

  • Java中,整型的范围与运行Java代码的机器无关,从而解决了移植带来的问题
  • 后缀L或l:长整型
  • 前缀0x或0X:十六进制
  • 前缀0:八进制,容易混淆,尽量别用
  • 0b或0B前缀:二进制
  • Java7开始,可以在数字间加下划线,方便阅读

注意:Java中没有无符号数

浮点类型

技术图片

  • 后缀F或f:float类型

  • 后缀D或d:double类型

  • 无后缀:double类型

  • 三个特殊的浮点数值:正无穷、负无穷、NaN(不是一个数字)

    检测:

    if(Double.isNaN(x))
    

char类型

  • 描述了UTF-16编码中的一个代码单元
  • 强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元,最后将字符串作为抽象数据类型处理

boolean类型

Java中整数与布尔值之间不能相互转换,区别于C!!!

例:

if(x=0)

在Java中会报错!!

变量

变量名必须是以字母开头由字母或数字构成的序列,不能出现空格

变量初始化

  • 声明一个变量之后,必须用赋值语句对变量进行显式初始化,千万别使用未初始化的变量
  • 可以将声明放在代码的任何地方,但尽可能靠近变量第一次使用的地方

常量

用关键字final指示常量,且只能被赋值一次

  • static final表示类常量,在该类的所有方法中可用
  • public static final表示其他类的方法也可使用该常量

运算符

  • 参与/操作的两个操作数都是整数时,表示整数除法,否则,表示浮点除法
  • 整数除以0会产生异常,而浮点数除以0则会得到无穷大或NAN

数值类型之间的转换

两个数值进行二元操作时,先要将两个操作数转换成同一种类型,然后计算

  • 若其中有一个为double,则转成double
  • 否则,若其中有一个float,则转成float
  • 否则,若其中有一个long,则转成long
  • 否则,都被转成int

图中实心箭头表示无精度丢失的转换,虚箭头表示可能有精度丢失

技术图片

强制类型转换

  • double转int:截断小数部分

  • double转int(舍入):

    double x=9.97;
    int nx=(int)Math.round(x);//round返回long类型
    

关系和boolean运算符

  • &&||按照短路方式来求值的:如果第一个操作数已经能确定表达式的值,第二个操作数就不必计算了
  • Java支持三目运算符

运算符优先级

技术图片

字符串

从概念上讲,Java字符串就是Unicode字符序列。Java中没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类String

子串

String类的substring方法:从一个较大的字符串中提取出一个子串

String greeting = "Hello";
String s = greeting.substring(0,3);
  • 第一个参数:开始的位置
  • 第二个参数:不想复制的第一个位置
  • 优点:便于计算子串长度

拼接

  • 使用+拼接两个字符串

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

    常用于输出System.out.println("The answer is "+answer);

不可变字符串

Java中的String类称为不可变字符串

  • 字符串内容不可修改
  • 字符串可以共享,如果复制一个字符串变量,则原始字符串和复制字符串共享相同的字符,字符串变量类似于c中的char*指针
  • 当字符串变量被赋予其他值时,Java的垃圾回收机制将把原始字符串回收

检测字符串是否相等

  • s.equals(t):若相等,则返回true,否则返回false,s和t可以是字符串变量,也可以是字符串字面量
  • s.equalsIgnore(t):忽略大小写

空串与NULL串

  • 空串""是长度为0的字符串,是一个Java对象
  • NULL串:String变量中存放一个特殊值null,表示目前没有任何对象与该变量关联

码点与代码单元

  • 码点:一个字符所占的空间,如一个UTF-16字符即为一个码点

    int cpCount = str.codePointCount(0,str.length());返回码点数量(实际长度)

    得到第i个码点:

    int index = str.offsetByCodePoints(0,i);
    int cp = str.codePointAt(index);
    
  • 代码单元:char类型是一个采用UTF-16编码表示Unicode码点的代码单元

    int n = str.length();返回代码单元的数量

    char first = str.charAt(0);返回某个位置的代码单元

String API

常用API:

技术图片

技术图片

构建字符串

  1. 先构造一个空的字符串构建器

    StringBuilder builder = new StringBuiler();
    
  2. 每当需要添加内容时,就调用append方法

    builder.append(ch);//添加一个char类型代码单元
    builder.append(str);//添加一个字符串
    
  3. 需要构建字符串时调用toString方法,得到一个String对象

    String completedString = builder.toString();
    

输入输出

读取输入

  1. 构建一个Scanner对象,并与”标准输入流“System.in关联

    Scanner in = new Scanner(System.in);
    
  2. 用Scanner对象实现输入操作

    String namee = in.nextLine();//读取输入的一行,包括空格
    String firstName = in.next();//读取一个单词(以空白符为分隔符)
    int age = in.nextInt();//读取一个整数
    
  3. 一定要在开头添加:

    import java.util.*;
    

格式化输出

System.out.printf();来实现格式化输出,同c语言中的printf用法

技术图片

技术图片

技术图片

控制流程

块作用域

  • 块:一对大括号括起来的若干简单的Java语句
  • 不能再嵌套的两个块中声明同名的变量,区别于C

确定循环

注意:在循环中检测两个浮点数是否相等需要格外小心

for (double x=0;x!=10;x+=0.1);

该循环永远不会结束,因为0.1无法用二进制精确表示

中断控制流程语句

Java中支持带标签的break语句,标签必须放在希望跳出的最外层循环之前,并且紧跟一个冒号,注意只能跳出语句块,不能跳入

技术图片

大数值

  • BigInteger类:实现任意精度的整数运算

    BigInteger a = BigInteger.valueOf(100);//将普通数值转换成大数值
    BigInteger c = a.add(b);//c=a+b;
    BigInteger d = c.mutiply(b.add(BigInteger.valueOf(2)));//d=c*(b+2);
    
  • BigDecimal类:实现任意精度的浮点运算

数组

创建数组

  • 声明数组变量时,需要指出数组类型(数组元素类型紧跟)和数组变量的名字,然后用new创建数组

    int[] a = new int[100];
    
  • 要想获取数组中元素个数,使用a.length

    for(int i=0;i<a.length;i++)
    
  • 创建一个数字数组时,所有元素初始化为0,boolean数组初始化为false,对象数组初始化为null

  • 一旦创建了数组就不能改变其大小了

for each循环

  • 可以用来依次处理数组中的每个元素,而不必为指定下标值而分心

  • 格式

    for(elementType x : collection) statment
    

    定义了一个变量x暂存集合中每一个元素,并执行相应的语句

    其中colletion必须是一个数组或是一个实现了Iterable接口的类对象

数组初始化以及匿名数组

int[] a = {1,2,3,4,5};//创建数组对象并赋予初始值,不需要调用new
a = new int[]{2,3,4,5,6,7,8};//创建一个匿名数组给原数组重新赋值

命令行参数

public Message{
	public static void main(String[] args){
		
	}
}

如果用下面的形式运行该程序

java Message -g cruel world

args[0] : "-g"
args[1] : "cruel"
args[2] : "world"

其中程序名并不存储在args数组中

多维数组

  • 声明多维数组

    int[][] a;
    a = new int[10][10];
    
  • 二维数组遍历

    //双重for循环
    for(int i=0;i<a.length;i++)
      for(int j=0;j<a[i].length;j++)
    
    //双重for each循环
    for(int[] row:a)
      for(int value:row)
    

不规则数组

二维数组相当于是一维数组指针的数组,其中的一维数组指针相互独立,可以自由确定其大小

如下图所示:

技术图片

以上是关于Java核心技术——第3章的主要内容,如果未能解决你的问题,请参考以下文章

从《Java核心技术》纵览Java全貌

Java核心技术卷阅读随笔--第7章异常断言和日志

从《Java核心编程》纵览Java全貌

PHP核心技术与最佳实践——全局浏览

编写高质量代码:改善Java程序的151个建议(第3章:类对象及方法___建议36~40)

[技术发展-5]:《区块链与加快推动区块链技术和产业创新发展》