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’、’_’、'是一个合法的字符,但是不要在自己代码中使用。
逐一声明每一个变量可以提高程序的可读性。
变量初始化
声明可以放在代码中的任何地方。尽可能靠近变量第一次使用的地方。
常量
利用关键字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() 返回一个与构建器或缓冲器内容相同的字符串。
第三章未完