2.Java程序基本程序设计结构
2.1. 数据类型
数据类型 | 基本类型(8种) | 备注 |
---|---|---|
整型 | int short long byte | 八进制前缀:0 十六进制:0x 二进制:0b |
浮点 | float double | 有舍入误差 |
字符 | char | ‘A’ 字符 “A” 字符串 |
布尔 | boolean | 不能与整型值相互转换 |
2.2. 变量
-
变量名
- 以字母或数字开头
- A-Z a-z _ $ 0-9
变量声明尽可能靠近变量第一次使用的地方
2.3. 常量
-
使用final指示
常量名使用全大写
类常量
-
可以在类中多个方法中使用
用static final指示
定义位于main方法外部
2.4. 运算符
-
逻辑与、逻辑或、与、或
-
&& || :短路运算
& | : 非短路
三元操作符: x > y ? x: y
异或:^ 非:~
移位运算符
-
“>>” 右移 用符号位填充高位(正数补0 负数补1)
11>>2 即1011>>2 得到0010 ∴11>>2=2
-
“<<” 左移 低位补0(不溢出时,左移n位即乘以2的n次方)
3<<2 即0011<<2 得到1100 ∴3<<2=12
数值之间合法转换
-
数值类型转换
-
强制类型转换
double x =3.45;
int nx = (int)x;
枚举
enum option{A,B,C,D};
option a = option.A;
2.5. 字符串
方法 | 功能 | 备注 |
---|---|---|
substring(int a,int b) | 取子串 | 提取(a,b] |
equals(String s) | 检测是否相等 | 可是字符串变量,也可是常量 |
equalsIgnoreCase(“Hello”) | 不区分大小写 | |
length() | 求长度 | |
trim() | 删除空格 | 只删除头部和尾部的空格 |
每次连接字符串,重新构建String耗时又浪费时间,可以使用StringBuilder
StringBuilder builder = new StringBuilder();
builder.append("Hello");
String completedString = builder.toString();
-
StringBuilder&StringBuffer
-
StringBuilder:使用单线程编辑;效率高
StringBuffer:可以多线程,是线程安全的;效率低
2.6. 输入输出
/* 读取输入 */
import java.util.*;
//构造Scanner对象,与标准输入流System.in关联
Scanner in = new Scanner(System.in);
//读取输入的一行(可能包含空格)
String line = in.nextLine();
String word = in.next(); //读取一个单词
int n = in.nextInt(); //读取一个整数
double num = in.nextDouble(); //读取一个浮点数
boolean flag = in.hasNext(); //检测是否还有其他单词
因为输入是可见的,Scanner类不适用于从控制台读取密码。
要想读取一个密码,可以采用下列代码:
/* 读取密码 */
//必须在控制台中运行
Console console = System.console();
char[] password = console.readPassword("Password:");
/* 格式化输出 */
float num = (float) -1031.5;
//8个字符的宽度,小数点后2个字符的精度
System.out.printf("%8.2f",num);
//用逗号分组
System.out.printf("%,.2f",num);
//把负数括在括号里
System.out.printf("%(.2f",num);
//使用静态方法String.format创建格式化的字符串
String message=String.format("Hello,%s.Next year you'll be %d.",name,age);
//日期的格式化从t开始,以转换符结束
//打印当前日期时间。c:完整的日期时间
System.out.printf("%tc",new Date());
// <表示格式说明中的参数将被再次使用
System.out.printf("%s %tB %<te %<tY","today:",new Date());
/* 文件输入与输出 */
//使用File对象构造Scanner对象,路径包含反斜杠时应该多加个反斜杠
Scanner in = new Scanner(Paths.get("D:\\file.txt"));
//直接使用Scanner in = new Scanner("D:\\file.txt");会被当做数据而不是文件名
//构造PrintWriter对象写入文件。如果文件不存在,则创建文件
PrintWriter out = new PrintWriter("new.txt");
当用一个不存在的文件构造Scanner对象,以及PrintWriter不能创建文件时,发生异常。需要异常处理。
2.7. 控制流程
-
块作用域
-
块(复合语句)是指由一对花括号括起来的若干条简单Java语句。
可嵌套,但不能在嵌套的两个块中声明同名的变量。
条件语句
- if(condition) statement1 else statement2 循环
-
while(condition) statement
do statement while(condition) 至少执行一次
确定循环
-
for(计数器初始化;循环条件;更新计数器)
应该对同一计数器变量初始化、检测、更新
/* switch语句 */
switch(today)
{
//case可以是char、byte、short、int、enum、string(since Java SE7)
case weekday:
System.out.println("Hello world!");
break;
case weekend:
System.out.println("Goodbye world!");
break;
default:
System.out.println("Error.");
break;
}
中断控制流程
不带标签 break; //用于switch、循环
带标签 break 标签放在希望跳出的最外层循环之外并紧跟一个冒号
getOut:
for(condition)
{
statement
break getOut;
}
continue 越过循环体剩余部分,立即跳到循环首部
2.8. 大数值
java.math包中的BigInteger类提供任意精度的整数运算,BigDecimal类提供任意精度的浮点数运算。
BigInteger a = BigInteger.valueOf(100); //转为大数值
BigInteger b = a.add(a); //加法
BigInteger c= a.multiply(a); //乘法
2.9. 数组
一种数据结构,用来存储同一类型值的集合
//数字数组元素初始化为0,boolean初始化为false
int[] a = new int[100];
数组一旦创建,大小不可变。需要扩展数组时,使用数组列表(array list)。
/* for each循环 */
//遍历数组中所有值,不需要使用下标,不易出错
//collection这一集合表达式必须是一个数组或实现了Iterable接口的类
//也可以Arrays.toString(a);
for(variable: collection) statement
/* 数组初始化&匿名 */
//直接初始化,不需要调用new
int[] smallPrimes={2,3,5,7,11,13};
//初始化匿名数组,调用new
new int[]{1,2,3,4,5};
//重新初始化,不创建新变量
smallPrimes=new int[]{1,2,5,7}
/* 数组拷贝 */
//引用同一数组(指向同一存储位置)
int[] nums=smallPrimes;
//拷贝值。第二个参数是新数组长度,可以用来扩展数组
int[] copy=Arrays.copyOf(smallPrimes,smallPrimes.length);
/* 数组排序 */
//使用了优化后的快速排序
Arrays.sort(smallPrimes);
/* 多维数组 */
int[][] a=new int[10][10];
int[][] b=
{
{1,1,2},
{3,5,8}
}; //这里有分号
//使用for each遍历。但for each是按照一维数组处理的,所以要使用两个嵌套的循环
for(int[] row: b)
for(int value:row)
statement
//可以快速打印一个二维数组的数据元素列表
System.out.println(Arrays.deepToString(b));
不规则数组
Java实际上没有多维数组,只有一维数组。多维数组被解释为“数组的数组”。所以在Java中可以单独地存取数组的某一行,也可以构造一个不规则的数组。
/* 不规则数组 */
int[][] irregular = new int[5][];
for (int i = 0; i <5; i++) {
irregular[i] =new int[i+1];
}
for (int i = 0; i < irregular.length; i++) {
for (int j = 0; j < irregular[i].length; j++) {
irregular[i][j]=1;
}
}
System.out.println(Arrays.deepToString(irregular));