Github代码链接: https://github.com/deyou123/corejava.git
第三章Java基本程序设计结构
3.2注释
1、//
2、/* */
3、自动生成文档
以 / ** 开始, */结束
3.3数据类型
8种基本类型,4种整形、2种浮点型、1种Unicode的char和1种boolean
3.3.1整形
int:正好超过20亿
long:900万亿 星球上居住人数 70亿
3.3.2 浮点类型
- 默认:double
- 正数 / 0 = 正无穷大,负数/0 = 负无穷大
- NaN(Not a number)
- x == Double.NaN : false
- Double.isNan(x): 检查x是不是一个数字
警告
浮点数值不适用于无法接受舍入误差的金融计算中。
- System.out.println(2.0-1.1)
得出0.8999999999999,而不是0.9。 - 原因是浮点数值采用二进制系统表示,无法精确表示1/10。
- 可以使用BigDecimal进行精确计算。
3.3.3char型
‘A’ : 65
转移字符
3.3.5boolean类型
- 不能用0/1表示真假值
后缀
长整型数值:L(400000000000L)
float:F | f (3.14f)
double:D | d (3.14D)
前缀
十六进制:0x | 0X(0xCAFE)
八进制:0(010 =》 8)
二进制:0b | 0B (0b1001 => 9)
下划线
1_000_000
只是更易读,编译器会去掉下划线
3.4变量
- 字母:‘A’~‘Z’, ‘a’ ~‘z’, ‘_’,’$’,或是表示字母的任何Unicode字符(Π等)
- 数字: ‘0’~‘9’,或是任何表示数字的任何Unicode字符
- Character.isJavaIdentifierStart()/isJavaIdentifierPart检查是否是java中的“字母”
- 不能使用Java保留字作为变量名
- 逐一声明每一个变量可以提高程序的可读性
3.4.1变量初始化
- 声明一个变量后必须用赋值语句对变量进行显示初始化;不能使用未初始化的变量。
- 变量可以在任何地方声明;变量的声明应尽可能地靠近变量第一次被使用的地方。
3.4.2常量
- final指示常量: 只能被赋值一次。
- 常量名全大写+下划线。
- 类常量[public] static final:可以在一个类中的多个方法中使用,public其他类也可以使用
3.5运算符
+、-、*、/、%
- /:
- 整除除法:两个数都是整数
- 浮点除法:一数是浮点
- 整数被0除将产生一个异常;浮点数被0除将会得到无穷大或NaN结果。
3.5.1 数学函数与常量
- Math.sqrt(x): 根号x
- Math.pow(x,a): x的a次方
- 三角函数:Math.sin、Math.cos、Math.tan、Math.atan、Math.atan2
- 指数函数:Math.exp、Math.log、Math.log10
- Π和e:Math.PI、Math.E
3.5.2数值之间的转换
- 如果两个操作数有一个是double,另一个就会转换为double
- 否则,float
- 否则, long
- 否则,int
3.5.2强制类型转换
- (desired)target:圆括号中给出想要的目标类型,后面紧跟带转换的变量名。
- 浮点-》整:
- 截断整数部分:(int)9.997
- Math.round,舍入运算
- boolean: express?1:0;通常不要进行强制转换。
3.5.4结合赋值和运算符
+=、-=、*=、/=
3.5.5自增与自减
++、–
- 要注意顺序:a++、++a。
3.5.6关系和boolean运算符
==、!=、<=、&&、||(短路)
x<y? x: y
3.5.7位运算符
&(nd)、|(or)、^(xor)、~(not)
移位操作符
<<(左移)、>>(右移,用符号填充高位)、>>>(右移,高位0填充)
3.5.8括号与运算符级别
3.5.9枚举类型
有限的集合。
enum Size{SAMLL,MEDIUM,LARGE,EXTRA_LARGE};
Size s = Size.MEDIUM;
3.6字符串
String str = "";
3.6.1字串
- str.substring(a,b): str下标 [a,b)的字符串,length = b - a;
3.6.2拼接
- +可以拼接字符串,String a = b + c;
- String.join(" / ",“S”,“M”) = > “S / M”:多个字符串用定界符分割链接。
3.6.3不可变字符串
优点:编译器可以让字符串共享。
各种字符串存放在公共的存储池中,字符串变量指向存储池中相应位置;如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。
总而言之,共享带来的高效率远远胜过于提取、拼接字符串所带来的低效率。
3.6.4检测字符串是否相等
s.equal(t);
s.equalsIgnoreCase(t):不区分大小写
== 只能确定两个自负床是否放在同一个位置。+或substring操作产生的结果并不是共享的。
3.6.5空串与null
- 空串: “”
- null,检查null : if(str == null)
- 检查: if(str != null && str.length() != 0)
3.6.6码点与代码单元
背景
而在设计Java时,当时的Unicode才发布1.0版本,字符连65536代码值一半都不到,为了方便后面增加,Java使用了16位的Unicode字符集。但是没想到,随着计算机的普及,各国计算机的发展,16位也放不下人类的集体文化财富。
码点是指一个编码表中的某个字符对应的代码值。Unicode的码点分为17个代码级别,第一个级别是基本的多语言级别,码点从U+0000——U+FFFF,其余的16个级别从U+10000——U+10FFFF,其中包括一些辅助字符。
基本的多语言级别,每个字符用16位表示代码单元,而辅助字符采用连续的一对连续代码单元进行编码。
- 码点数量:字符串实际长度
str.codePointCount(0,str.length()); - 第i个码点:
str.codePointAt(str.offsetByCodePoints(0,i));
3.6.7String常用API
char charAt(int index):返回给定位置的代码单元。
int codePointAt(int index):返回从给定位置开始的码点。
int offsetByCodePoints(int stratIndex,int cpCount):返回从startIndex代码点开始,位移cpCount后的码点索引。
int compareTo(String other):按字典顺序,str位于other之前返回负数;位于other之后,返回整数;相等,返回0;
IntStream codePotin():将str的码点作为一个流返回
new String(int[]codePoints,int offset,int count):用数组中从offset开始的count个码点构造一个字符串
boolean equals(Object other);
boolean equalsIgnoreCase(String other);
boolean startsWith(String prefix);
boolean endWith(String suffix);
int indexOf(String str);
int indexOf(String str,int fromIndex);
int indexOf(int cp);
int indexOf(int cp, int fromIndex);
返回与字符串str或代码点cp匹配的第一个字串开始为自,索引从0或者fromIndex开始计算;不存在返回-1;
int lastIndexOf(String str);
int lastIndexOf(String str,int fromIndex);
int lastindexOf(int cp);
int lastindexOf(int cp,int fromIndex);
返回与字符串str 或代码点cp匹配的最后一个子串的开始位置。这个位置从原始串尾端或fromlndex开始计算。
int length();
int codePointCount(int startIndex,int endIndex):返回startIndex和endIndex-1之间的代码点数量。
String replace(CharSequence oldString, CharSequence newString):返回一个新字符串,用newString代替原来字符串中所有的oldString。CharSequence:String、StringBuilder.
String substring(int beginIndex);
String substring(int beginIndex,int endIndex);
返回一个从beginIndex到串尾或endIndex-1的所有代码单元
String toLowerCase()
String toUpperCase();
String trim():删除str头部和尾部的空格
String join(CharSequence delimiter,...):返回给定定界符链接所有元素的字符串。
- CharSequence是一个接口,所有字符串都属于这个接口
3.6.8阅读联机API文档
- 浏览器指向JDK的 docs/api/index.html文件就可以看到API文档。
3.6.9构建字符串
StringBuilder builder = new StringBuilder();
builder.append(ch);
builder.append(str);
String str = builder.toString();
StringBuffer:允许多线程操作。
String Builder:效率高
StringBuilder();
int length();
StringBuilder append(String str);
StringBuilder append(char c);
StringBuilder appendCodePoint(int cp);
void setCharAt(int i, char c);:将第i个代码单元设为c
StringBuilder insert(int offset, String str/char c);:在offset位置插入一个代码单元/str并返回
StringBuilder delete(int startIndex, int endIndex);:删除从startIndex到endIndex-1的代码单元。
String toString();
3.7输入输出
3.7.1输入读取
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();//读取下一行
scanner.next();//读取一个单词,空格作为分割符
scanner.nextInt();
double nextDouble();
boolean hasNext();
boolean hasNextInt();
boolean hasNextDouble();
3.7.2格式化输出
- System.out.printf();
double x= 1000.0/3;
System.out.printf("%8.2f", x);
- String.format("");
3.7.3文件输入输出
后面再总结 IO流
3.8控制流程
3.8.1快作用域
- 块是指有一对大括号括起来的若干条简单的java语句
- 确定了变量的作用域
- 一个块可以嵌套再另一个块中
- 但是,不能再嵌套的两个块中声明同名变量。区别于c/c++:内层定义的变量会覆盖在外层定义的变量。
3.8.2条件语句
if(condition) statement1 [else statement2]
3.8.3循环
while(condition) statement
do statement while(condition);
for
增强 for
3.8.5switch
case标签可以是:
- 类型为char、byte、short、int的常量表达式
- 枚举变量
- JavaSE7开始,还可以是String字面量。
3.8.6中断控制流程语句
- goto作为保留字。
- break:
- 带标签的break:用于跳出多重嵌套循环语句,标签必须放在希望跳出最外循环之前,并且紧跟一个冒号(label:),break label;
- 可以将标签应用到任何语句中,if,或块语句,但只能跳出语句块。
- continue
3.9大数值
- BigInteger
BigInteger add(BigInteger other);
BigInteger subtract(BigInteger other);
BigInteger multiply(BigInteger other);
BigInteger divide(BigInteger other);
BigInteger mod(BigInteger other);
int compareTo(BigInteger other);
static BigInteger valueOf(long x);
- BigDecimal
BigDecimal add(BigDecimal other);
BigDecimal subtract(BigDecimal other);
BigDecimal multiply(BigDecimal other);
BigDecimal divid(BigDecimal ohter);
int compareTo(BigDecimal other);
static BigDecimal valueOf(long x)
static BigDecimal valueOf(long x,int scale);
3.10数组
int[] a;
int a[];
int[] a = new int[100];
3.10.1for each循环
- for(variable : collection) statement
- Arrays.toString(a)
3.10.2数组初始化和匿名数组
int[] array = {1,2,3,4,5};
new int[]{1,2,3,4,5}; //匿名数组
3.10.3数组拷贝
- 允许将一个数组变量拷贝给另一个数组变量,这是,两个变量将引用同一个数组。
- 拷贝值:
int[] array1 = Arrays.copyOf(array2, length);
多余的元素赋值为0;布尔型false;
3.10.4命令行参数
3.10.5数组排序
int[] a = new int[1000];
Arrays.sort(a); //优化的快速排序
static String toString(type[] a):返回包含a中数据元素的字符串,类型为int、long、short、char、byte、boolean、float、double
static type copyOf(type[] a, int length):
static type copyOfRange(type[] a,int start, int end);:返回和a类型相同的一个数组,长度为length或end-start。
static void sort(type[] a);
static int binarySearch(type[] a, type v);
static int binarySearch(type[] a, int start, int end, type v):采用二分搜索算法查找值v,成功返回下标值,否则返回一个负数。
static void fill(type[] a, type v):将a所有制设为v
static boolean equals(type[]a, type[] b):两个数组对应下标的值都相等,返回true。
3.10.6多维数组
- double[][] arrays;
- for each循环语句不能自动处理二维数组的每一个元素,它是按照行,也就是一维数组处理的。
for(double[] row : a)
for(double value: row)
do something with value;
- 快速打印二维数组:
System.out.println(Arrays.deepToString(a));
3.10.7不规则数组
- 交换数组的两行
double[] temp = balance[i];
balance[i] = balance[i + 1];
balance[i + 1] = temp;