Java核心技术学习--第一天

  • 第一章 Java程序设计概述
  • Java程序设计平台
  • Java"白皮书"的关键术语
  • 简单性
  • 面向对象
  • 分布式
  • 健壮性
  • 安全性
  • 体系结构中立
  • 可移植性
  • 解释型
  • 高性能
  • 多线程
  • 动态性
  • Java applet与Internet
  • 第二章 Java程序设计环境
  • 安装Java开发工具包
  • 使用命令行工具
  • 使用集成开发环境
  • 运行图形化应用程序
  • 构建并运行applet
  • 第三章 Java的基本程序设计结构
  • 一个简单的Java应用程序
  • 注释
  • 数据类型
  • 整型
  • 浮点类型
  • char类型
  • Unicode和char类型
  • boolean类型
  • 变量
  • 变量初始化
  • 常量
  • 运算符
  • 数学函数与常量
  • 数值类型之间的转换
  • 强制类型转换
  • 结合赋值和运算符
  • 自增与自减运算符
  • 关系和boolean运算符
  • 位运算符
  • 括号与运算符级别
  • 枚举类型
  • 字符串
  • 子串
  • 拼接
  • 不可变字符串
  • 检测字符串是否相等
  • 空串与Null串
  • 码点与代码单元
  • String API
  • 阅读联机API文档
  • 构建字符串

第一章 Java程序设计概述

Java程序设计平台

Java不只是一种语言,Java是一个完整的平台,有一个庞大的库,其中包含了很多可重用的代码和一个提供诸如安全性、跨操作系统的可移植性以及自动垃圾收集等服务的执行环境。

Java"白皮书"的关键术语

简单性

没有头文件、指针运算、结构、联合、运算符重载、虚基类等。
支持开发能够在小型机器上独立运行的软件。

面向对象

分布式

Java有一个丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络上的对象,其便捷程度就好像访问本地文件一样。

健壮性

Java投入大量的精力进行早期的问题检测、后期动态的检测,消除了容易出错的情况。

安全性

Java被设计成能够防范各种攻击,包括:

  • 运行时堆栈溢出。
  • 破坏自己进程空间之外的内存。
  • 未经授权读写文件。

体系结构中立

Java编译器生成与特定的计算机体系结构无关的字节码。
字节码不仅可以很容易在任何机器上解释执行,还可以动态地翻译成本地机器代码。

可移植性

基本数据类型的大小以及相关运算都做了明确的说明。

解释型

Java解释器可以在任何移植了解释器的机器上执行Java字节码。

高性能

字节码可以动态地翻译成对应运行这个应用的特定CPU的机器码。
性能就是“适用性更强”。

多线程

动态性

类中可以自由地添加新方法和实例变量,而对客户端却没有任何影响。

Java applet与Internet

在网页中运行的Java程序称为applet。要使用applet,需要启用Java的Web浏览器执行字节码。不需要安装任何软件。

第二章 Java程序设计环境

安装Java开发工具包

使用命令行工具

使用集成开发环境

运行图形化应用程序

构建并运行applet

第三章 Java的基本程序设计结构

一个简单的Java应用程序

命名规范:

  • 类名是以大写字母开头的名词。如果名字由多个单词组成,每个单词的第一个字母都应该大写(骆驼命名法)。
  • 源代码的文件名必须与公共类的名字相同。

注释

三种注释方法:

  • 使用//,注释内容从//开始到本行结尾。
  • 使用/*和*/,长篇注释。
  • 使用/**和*/,用于自动生成文档。

数据类型

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

整型


类型

存储需求

int

4字节

short

2字节

long

8字节

byte

1字节

长整型数值有一个后缀L或l,十六进制数值有一个前缀0x或0X,八进制有一个前缀0,二进制数值有一个前缀0b或0B。
在Java中,所有的数值类型所占据的字节数量与平台无关。
Java中int\long\short\byte都是有符号的。

浮点类型


类型

存储需求

float

4字节

double

8字节

float类型的数值有一个后缀F或f,没有后缀F的浮点数值默认double类型。
特殊的浮点数值:

  • 正无穷大,Float/Double.POSITIVE_INFINITY
  • 负无穷大,Float/Double.NEGATIVE_INFINITY
  • 不是数字,Float/Double.NaN,判断是否“非数值”使用Double.isNaN(x)

二进制系统中无法精确表示某些分数

char类型

范围从\u0000到\uffff
使用单引号,'A’是编码值65对应的字符常量,"A"是包含字符A的字符串
转义序列\u会在解析代码之前得到处理

Unicode和char类型

码点是指与一个编码表中的某个字符对应的代码值。
Unicode标准中,码点采用十六进制书写,加上前缀U+。

boolean类型

布尔类型有两个值:false和true,与整型值不能相互转换。

变量

每个变量都有一个类型。
变量名必须是一个以字母开头并由字母或数字构成的序列。字母包括’A’到’Z’、‘a’到’z’、’_’、'java核心技术pdf_Java是一个合法的字符,但是不要在自己代码中使用。
逐一声明每一个变量可以提高程序的可读性。

变量初始化

声明可以放在代码中的任何地方。尽可能靠近变量第一次使用的地方。

常量

利用关键字final指示常量。final表示这个变量只能赋值一次。常量名使用全大写。
类常量:常量在一个类的多个方法中使用。使static final设置。位于main方法的外部。

运算符

参与/运算的两个操作数为整数时表示整数除法,否则表示浮点除法。
整数除0会产生异常,浮点数除0会得到无穷大或NaN。

数学函数与常量

如果n是负数且为奇数,则n%2为-1,floorMod可以避免出现负数结果,但是对于负除数无效。
Math类提供常用的三角函数,还有指数函数以及它的反函数,常量PI和E。

数值类型之间的转换

  • 如果两个操作数中有一个是double类型,另一个操作数就会转化为double类型。
  • 否则,如果其中一个操作数是float类型,另一个操作数将会转化为float类型。
  • 否则,如果其中一个操作数是long类型,另一个操作数将会转化为long类型。
  • 否则,两个操作数都将被转换为int类型。
    int/long到float有精度损失,long到double有精度损失。

强制类型转换

round方法返回浮点数最接近的整数,但是是long类型。

结合赋值和运算符

二元运算符+=,*=,%=。
如果运算符得到的值与左侧操作数的类型不同,就会发生强制类型转换。

自增与自减运算符

关系和boolean运算符

位运算符

移位<<、>>、>>>,没有<<<,>>>使用0填充高位,>>用符号位填充高位

括号与运算符级别

&&优先级比||优先级高,+=是右结合运算符。

枚举类型

自定义枚举类型,然后声明这种类型的变量。

enum Size {SMALL, MEDIUM, LARGE, EXTRA_LARGE};
Size s = Size.MEDIUM;

Size类型的变量只能存储这个类型声明中给定的某个枚举值,或者null值。

字符串

在标准Java类库中提供一个预定义类,String。

子串

substring方法,第二个参数是不取的位置。

拼接

使用+拼接两个字符串。
将一个字符串与一个非字符串的值拼接时,后者被转换成字符串。
将多个字符串放在一起且使用定界符分隔,使用join方法。

String all = String.join("/", "S", "M", "L", "XL");
//all is the string "S/M/L/XL"

不可变字符串

不能修改字符串中的字符,将String类对象称为不可变字符串。
编译器让字符串共享。

检测字符串是否相等

使用equals方法

s.equals(t)

s与t可以是字符串变量,也可以是字符串字面量

"hello".equals(greeting)

检测字符串是否相等,而不区分大小写,使用equalsIgnoreCase方法

"Hello".equalsIgnoreCase("hello")

不能使用==判断字符串是否相等,==只能确定两个字符串是否放在同一个位置上。
字符串常量是共享的,但是+或substring等操作产生的结果不是共享的。

空串与Null串

空串""是一个Java对象,长度为0内容为空。
null表示没有任何对象与该变量关联。在null上调用方法会出现错误。

码点与代码单元

字符串由char值序列组成。char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元。
大多数Unicode字符使用一个代码单元,辅助字符使用一对代码单元。
返回给定字符串所需的代码单元数量

int n = greeting.length();

得到实际的长度,即码点数量

int cpCount = greeting.codePoinCount(0, greeting.length());

调用charAt(n)返回位置n的代码单元

char first = greeting.charAt(0);

得到第i个码点

int index = greeting.offsetByCodePoint(0, i);
int cp = greeting.codePointAt(index);

String API

  • char charAt(int index) 返回给定位置的代码单元
  • int codePointAt(int index) 返回从给定位置开始的码点
  • int offsetByCodePoints(int startIndex, int cpCount) 返回从startIndex代码点开始,位移cpCount以后的码点索引。
  • int compareTo(String other)
  • IntStream codePoints() 把字符串的码点作为一个流返回,调用toArray将他们放在一个数组中。
  • new String(int [] codePoints, int offset, int count) 用数组中从offset开始的count个码点构造一个字符串。
  • boolean equals(Object other)
  • boolean equalsIgnoreCase(Object other)
  • boolearn startsWith/endsWith(String prefix/suffix) 如果字符串以prefix/suffix开头或结尾,则返回true
  • int indexOf(String str) 返回与字符串str匹配的第一个子串的开始位置, 从索引0开始计算。
  • int indexOf(String str, int fromIndex) 返回与字符串str匹配的第一个子串的开始位置, 从索引fromIndex开始计算。
  • int indexOf(int cp) 返回与代码点cp匹配的第一个子串的开始位置, 从索引0开始计算。
  • int indexOf(int cp, int fromIndex) 返回与代码点cp匹配的第一个子串的开始位置, 从索引fromIndex开始计算。
  • int lastIndexOf(String str) 返回与字符串str匹配的最后一个子串的开始位置, 从索引0开始计算。
  • int lastIndexOf(String str, int fromIndex) 返回与字符串str匹配的最后一个子串的开始位置, 从索引fromIndex开始计算。
  • int lastIndexOf(int cp) 返回与代码点cp匹配的最后一个子串的开始位置, 从索引0开始计算。
  • int lastIndexOf(int cp, int fromIndex) 返回与代码点cp匹配的最后一个子串的开始位置, 从索引fromIndex开始计算。
  • int length() 返回字符串的长度。
  • int codePointCount(int startIndex, int endIndex) 返回startIndex和endIndex-1之间的代码点数量
  • String replace(CharSequence oldString, CharSequence newString) 用newString代替原始字符串中所有的oldString
  • String substring(int beginIndex) 返回一个新字符串,包含原始字符串从beginIndex到串尾的所有代码单元。
  • String substring(int beginIndex, endIndex) 返回一个新字符串,包含原始字符串从beginIndex到endIndex-1的所有代码单元。
  • String toLowerCase() 返回一个新字符串,将大写字母改成小写。
  • String toUpperCase() 返回一个新字符串,将小写字母改成大写。
  • String trim() 返回一个新字符串,删除了头部和尾部的空格。

阅读联机API文档

构建字符串

每次连接字符串都要构建新的String对象,耗时,又浪费时间。使用StringBuilder类。需要构建字符串时就调用toString方法。

StringBuilder类的重要方法:

  • StringBuilder() 构造一个空的字符串构建器
  • int length() 返回构建器中的代码单元的数量
  • StringBuilder append(String str) 追加一个字符串并返回this
  • StringBuilder appendCodePoint(int cp) 追加一个代码点,并将其转换为一个或两个代码单元并返回this
  • void setCharAt(int i, char c) 将第i个代码单元设置为c
  • StringBuilder insert(int offset, String str) 在offset位置插入一个字符串并返回this
  • StringBuilder insert(int offset, Char c) 在offset位置插入一个代码单元并返回this
  • StringBuilder delete(int startIndex, int endIndex) 删除偏移量从startIndex到endIndex-1的代码单元并返回this
  • String toString() 返回一个与构建器或缓冲器内容相同的字符串。

第三章未完