public class FirstSample
{
public static void main(String[] args)
{
System.out.println("We will not use 'Hello, World!'"); // 在cmd中输出文本We will not use 'Hello, World!'
System.out.println("println方法,输出文本后会换行");
System.out.print("print方法,输出文本后不会换行");
}
}
main
不能写成Main
;public
是访问修饰符,用于控制程序的其他部分是否能对这段代码进行访问;class
后面紧跟类名,类名的命名遵循驼峰命名法,例如MyFirstClassName
;FirstSample.java
;main
方法;main
方法的访问修饰符,一定是public
;// 以下是Java的三种注释方法
public class FirstSample
{
public static void main(String[] args)
{
System.out.println("demo"); // 注释的第一种方法:单行注释
/*
注释的第二种方法:多行注释,而且不能嵌套
*/
}
}
/**
* 注释的第三种方法
* 可用于自动的生成文档
* 一般作为java源代码的头部注释
* /
int
,4字节;short
,2字节;long
,8字节;byte
,1字节;float
,4字节;double
,8字节;char
boolean
String
/ BigDecimal
/ BigInteger
等,不是基本数据类型,而是Java自定义的对象;int
,4字节,范围为[-2^31, 231);`short`,2字节,范围为[-215, 215);`long`,8字节,范围为[-264, 264);`byte`,1字节,范围为[-27, 2^7);float
,单精度浮点数,4字节;数值后有一个F或f后缀表示,例如3.14F
;double
,双精度浮点数,8字节;数值后有D或d后缀表示,也可以不用后缀,例如3.14D
/ 3.14
;Double.POSITIVE_INFINITY
表示正无穷大;Double.NEGATIVE_INFINITY
表示负无穷大;Double.NaN
表示NaN,即不是一个数字;Double.isNaN(3.14)
,用于判断3.14是否为数字;'A'
表示编码值65所对应的字符常量;而"A"
则是字符串;# 转义字符
\b 退格
\t 制表
\n 换行
\r 回车
\" 文本形式的双引号
\' 文本形式的单引号
\\ 反斜杠
boolean
,布尔值只有两种,true
/ false
;$
是一个合法的Java字符,但在个人编码中不要使用;它只用于Java编译器或其他工具生成的名字中;final
修饰;一旦被赋值之后,就不能再修改了;习惯上,常量名使用全大写,例如final double CM_INCH = 2.54
;static final
声明类常量;如果用public static final
修饰,那么该类常量也可以被其他类所使用;int a = 1;
int b = 3;
int result1 = a + b; // 加
int result2 = a - b; // 减
int result3 = a * b; // 乘
int result4 = a / b; // 除。两整数相除,输出整数;否则,输出浮点数
System.out.println(15 / 2); // 输出7
System.out.println(15.0 / 2); // 输出7.5
int result5 = a % b; // 求余,或成为取模
在java.lang.Math
类中,Java自带了很多数据函数,使用起来很广泛、很方便。
// 常用数学计算类:Math类
Math.sqrt(4); // 4的平方根
Math.pow(2, 5); // 2的5次方
Math.floorMod(); //
Math.sin(); // 三角函数
Math.cos();
Math.tan();
Math.atan();
Math.atan2();
Math.exp(); // 指数函数
Math.log();
Math.log10();
Math.PI; // π
Math.E; // 自然常量e
Math.round(9.99); // 对9.99进行四舍五入,输出10,且为long类型
// 也可以通过静态导入Math类,就不必再方法名和常量名前面添加前缀"Math"
import static java.lang.Math.*;
System.out.println(Math.sqrt(PI)); // 不使用静态导入
System.out.println(sqrt(PI)); // 使用静态导入
Java的8种数据类型之间的转换,可能存在数据精度缺失的情况。
// 类型转换demo
double x = 9.997;
int nx = (int)x; // 将float类型的x,强制转换为int类型;截断了小数点后的数字,因此输出为9
int nx2 = (int)(Math.round(x)); // 输出为10
x += 4;
x = x + 4; // 二者等价,但我更喜欢第二种写法,理解清晰
int x = 10;
x++; // 自增
x--; // 自减。一般这两种写法用于指针计算
int a = 3;
int b = 5;
System.out.print(a == b ? 1 : 0); // 相等运算符
System.out.print(a != b ? 1 : 0); // 不等运算符
System.out.print(a < b ? 1 : 0); // 小于运算符
System.out.print(a > b ? 1 : 0); // 大于运算符
System.out.print(a <= b ? 1 : 0);
System.out.print(a >= b ? 1 : 0);
System.out.print(a > 0 && b > 0 ? 1 : 0); // 逻辑与
System.out.print(a > 0 || b > 0 ? 1 : 0); // 逻辑或
& // and
| // or
^ // xor
~ // not
<< // 右移
>> // 左移
>>> // 左移,且用0填充高位
有时候,变量的取值仅在一个范围之内,例如,衣服的尺寸只有S/ M/ L;这种情况下,可以自定义枚举类型。枚举包括有限个命名的值。枚举一般用大写表示;
enum Size {SMALL, MEDIUM, LARGE};
System.out.println(Size.SMALL);
// Java不同数据类型的变量相互转换的方法,以下是伪代码展示
[String] = String.valueOf([int]); // int -> String,方法一
[String] = Integer.toString([int]); // int -> String,方法二
[String] = [int] + ""; // int -> String,方法三
[byte] = Byte.parseByte([String]); // String -> byte
[short] = Short.parseShort([String]); // String -> short
[int] = Integer.parseInt([String]); // String -> int
[long] = Long.parseLong([String]); // String -> long
[float] = Float.parseFloat([String]); // String -> float
[double] = Double.parseDouble([String]); // String -> double
[String] = "" + [double]; // double -> String
[String] = String.valueOf([double]); // double -> String
String str = String.format("%.2f", [double]); // 保留两位有效数字
String str = String.format("%02d", [int]); // 保留至少两位十进制整数
System.out.println(String.format("%02d", 5)); // 输出05
// 输出给定长度的字符串
System.out.println(String.format("%-10s", "test")); // 输出"test ",在右侧补足10位
System.out.println(String.format("%10s", "test")); // 输出" test",在左侧补足10位
// int变量的进制转换
int n = 100;
String str = Integer.toBinaryString(n); // 十进制转换为二进制字符串
String str = Integer.toOctalString(n); // 十进制转换为八进制字符串
String str = Integer.toHexString(n); // 十进制转换为十六进制字符串
String str = Integer.toString(n, [r]); // 十进制转换为r进制字符串
String str = Long.parseLong([String], [r]); // 将字符串代表的数字,从r进制转化为十进制
// 四舍五入
long round1 = Math.round(1.499);
long round2 = Math.round(1.5);
int a = (int)Math.ceil(1.1); // 向上取整,返回2
int b = (int)Math.floor(1.1); // 向下取整,返回1
从概念上说,Java字符串就是unicode字符序列。Java没有内置的字符串类型,而是在标准Java库中提供了一个预定义类,String
类,定义在java.lang.String
中。每个用双引号括起来的字符串,都是String类的一个实例;
str.substring(a, b)
函数截取str字符串,从而生成一个子串。其中,a是开始截取的位置,b是结束截取的位置,且为左闭右开;子串的长度为b-a
;
String str1 = "Hello";
String str2 = "H.e.l.l.o";
String str3 = str.substring(0, 3); // str3 = "Hel"
String[] arr1 = str2.split("\\."); // 将str2按.分割,生成数组;注意,.是正则表达式,因此这里要对.进行转义
String[] arr2 = str.split("[\\+\\-\\*\\/]"); // 将str2按+-*/分隔,生成数组;同样这里也要使用\\进行转义
Java允许使用+
拼接多个字符串,甚至可以将字符串和非字符串拼接起来,从而转换为字符串对象;
str1 = "a" + "b" // 拼接两个字符串,生成一个新字符串"ab"
str2 = "a" + 1 // 拼接字符串与int,生成一个新字符串"a1"
str3 = String.join(" / ", "a", "b", "c"); // 用定界符/,将abc串联在一起,生成一个新字符串"a / b / s"
java.lang.String
类中没有提供修改字符串的方法,因此String
类的对象被称为不可变字符串
;比较两个字符串对象是否相等,只能用str1.equals(str2)
函数,决不能用==
符号;
str1 = "hello";
str2 = "HELLO";
boolean bool1 = str1.equals(str2); // 字符串不相等,返回false
boolean bool2 = str1.equals("hello"); // 字符串变量与字符串字面值对比,返回true
boolean bool3 = str1.equalsIgnoreCase(str2); // 不区分大小写的条件下,判断两字符串是否相等,返回true
""
是长度为0的字符串;null
;if (str.length() == 0) // 判断str是否为空串
if (str.equals("")) // 判断str是否为空串
if (str == null) // 判断str是否为null串
Java的字符串由char值序列组成;
str = "Hello";
char first = str.charAt(0); // 返回str的位置0的代码单元
char last = str.charAt(4); // 返回str的位置4的代码单元
char charAt(int index)
int codePointAt(int index)
int offsetByCodePoints(int startIndex, int cpCount)
int compareTo(String other)
IntStream codePoints()
new String(int[] codePoints, int offset, int count)
boolean equals(Object other)
boolean equalsIgnoreCase(String other)
boolean startsWith(String prefix)
boolean endsWith(String suffix)
int indexOf(String str)
int indexOf(String str, int fromIndex)
int indexOf(int cp)
int indexOf(int cp, int fromIndex)
int lastIndexOf(String str)
int lastIndexOf(String str, int fromIndex)
int lastIndexOf(int cp)
int lastIndexOf(int cp, int fromIndex)
int length()
int codePointCount(int startIndex, int endIndex)
String str2 = str1.replace([oldString], [newString]); // 替换字符串对象str1中的某些字符,将[a]替换为[b]
String substring(int beginIndex)
String substring(int beginIndex, int endIndex)
String str2 = str1.toLowerCase(); // 将字符转换为小写
String str2 = str1.toUpperCase(); // 将字符转换为大写
String trim()
String join(CharSequence delimiter, CharSequence... elements)
String str = String.valueOf([char]); // 将char转化为String对象
boolean str.matches([reg]); // 判断str是否满足[reg],可使用正则表达式
boolean str.matches("[\u4e00-\u9fa5]"); // 判断str是否只由汉字组成
boolean str.matches("[A-Z][a-z]"); // 判断str中是否只由大写字母、或只由小写字母组成
boolean str.matches("[A-Za-z]"); // 判断str中是否由大写字母、及小写字母组成
boolean str.matches(".*[A-Za-z]+.*"); // 判断str是否包含字母
boolean str.contains([str1]); // 判断str是否包含str1
String类中常用的有50多个方法,而Java标准库中有上千各类,上万种方法。想要记住所有的类和方法是不可能的,因此要善于使用API文档。
StringBuilder
类可以有效规避这一问题;StringBuffer
类,与字符串构造器StringBuilder
类的API完全相同;前者效率稍低,但适用于多线程;后者则适用于单线程;ch = 'A';
str = "Hello";
StringBuilder builder = new StringBuilder();
builder.append(ch); // 插入字节
builder.append(str); // 插入字符串
String result = builder.toString(); // 将StringBuilder对象转化为String对象
// ----------------------------------------------------------
// StringBuilder类的常用API
StringBuilder()
int length()
StringBuilder append(String str)
StringBuilder append(char ch)
StringBuilder appendCodePoint(int cp)
void setCharAt(int i, char c)
StringBuilder insert(int offset, String str)
StringBuilder insert(int offset, Char c)
StringBuilder delete(int startIndex, int endIndex)
String toString()
Java程序可以从GUI等操作界面获取输入,也可以从控制台接受键盘的输入。
import java.util.Scanner; // 输入控制流相关类
import java.util.Console; // 用于读取不可见的控制台输入,例如输入密码;但使用不如Scanner类方便
public class Demo
{
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in); // 从控制台获取数据,例如键盘
scanner.hasNext(); // 返回布尔值;若有输入数据,则返回true;反之则返回false
scanner.hasNextInt(); // 检测是否还有int数值输入
scanner.hasNextDouble(); // 检测是否还有double数值输入
String str1 = scanner.nextLine(); // 读取键盘输入的每一行字符串
int a = scanner.nextInt(); // 读取键盘输入的整数
double b = scanner.nextDouble(); // 读取键盘输入的浮点数
String str2 = scanner.next(); // 以空白符、回车符作为分隔符,读取第一个单词
Console console = new Console();
String str3 = console.readLine("User name: ");
char[] str4 = console.readPassword("Password: "); // 为安全起见,将输入的密码存放在char中
}
}
System.out.print("Hello World"); // 简单输出,输出文本后不换行
System.out.println("Hello World"); // 简单输出,输出文本后换行
System.out.printf("Hello World"); // 简单输出
System.out.printf("Hello World %s Hello %d", "ABC", 100); // %是格式说明符,%s表示"ABC",%d表示100
。。。。待补充
// 读取文件
import java.util.Scanner; // 输入流的类
import java.nio.file.Paths; // 文件路径相关的类
import java.io.PrintWriter; // 输出流的类
Scanner scanner1 = new Scanner(Paths.get("file.txt"), "UTF-8");
Scanner scanner2 = new Scanner(Paths.get("C:\\MyDirectory\\file.txt"), "UTF-8"); // Windows系统文件路径的反斜杠前面,要再加个反斜杠
Scanner scanner2 = new Scanner(Paths.get("home/MyDirectory/file.txt"), "UTF-8"); // Linux系统文件路径
// 写入文件
PrintWriter printWriter = new PrintWriter("file.txt", "UTF-8"); // 若文件不存在,则直接创建
条件语句、循环语句、笨重的switch、foreach循环
if (yourSales > target)
{
System.out.println("result1");
} else if (yourSales = target)
{
System.out.println("result2");
} else (yourSales < target)
{
System.out.println("result3");
}
while (yourSales > target) // 简单while循环
{
System.out.println("result1");
target = target + 1; // 计数器
}
// --------------------------
do // do-while循环,至少执行一次
{
System.out.println("result1");
target = target + 1; // 计数器
}
while (yourSales > target)
for循环是while循环的简化形式
for (int i = 0; i <= 10; i++)
{
System.out.println("result1");
}
switch (choice)
{
case 1:
System.out.println("result1");
break; // 语句块的中止
case 2:
System.out.println("result2");
break;
case 3:
System.out.println("result3");
break;
case 4:
System.out.println("result4");
break;
default: // 默认值
System.out.println("result_detault");
break;
}
break
,用于退出循环语句;break
,跳转到带标签的语句块末尾;continue
,用于将控制转移到最内层循环的首部;break
和continue
也可以表达相同的逻辑含义,因此可以不适用;Java的基本数据类型,int和decimal是有范围限制的。int变量无法描述太大的数值,decimal变量无法描述小数位太多的数值,因此需要使用BigInteger BigDecimal
两个类实现任意精度的整数运算、浮点数运算
import java.Math.BigInteger;
import java.Math.BigDecimal;
int a = 100;
int b = 200;
BigInteger a1 = BigInteger.valueOf(a); // 将int变量a转化为BigInteger对象a1
BigInteger b1 = BigInteger.valueOf(b);
BigInteger c1 = a1.add(b1); // BigInteger对象相加
BigInteger c2 = a1.substract(b1); // BigInteger对象相减
BigInteger c3 = a1.multiply(b1); // BigInteger对象相乘
BigInteger c4 = a1.divide(b1); // BigInteger对象相除
BigInteger c5 = a1.mod(b1); // 返回BigInteger的和、差、积、商、余
int c6 = a1.compareTo(b1); // 若a1b1,则返回正数
// --------------------------------------------------------------------------
double x = 5.56;
double y = 8.12;
BigDecimal x1 = BigDecimal.valueOf(x); // 将long或double类型变量,转化为BigDecimal对象
BigDecimal y1 = BigDecimal.valueOf(y);
BigDecimal z1 = x1.add(y1); // 求和
BigDecimal z2 = x1.substract(y1); // 求差
BigDecimal z3 = x1.multiply(y1); // 求积
BigDecimal z4 = x1.divide(y1, RoundingMode.HALF_UP); // 以四舍五入方式返回商
int z5 = x1.compareTo(y1); // 若a1b1,则返回正数
BigDecimal z6 = x1.valueOf(x, [scale]); // 返回x/10^scale的BigDecimal对象
ArrayList
却可以改变其长度;foreach循环用于依次处理数组中的每个元素,而不必为指定下标值而分心,是一种强力的循环结构,也是for循环的简化
int[] a = {1, 2, 3, 4, 5};
for (i : a)
{
System.out.println(i);
}
Array
类,是Java中一种基本的数据结构,用于声明数组类,由于定义在java.lang.Array
中,属于Java的基础类,因此不需要import
也可以使用;Arrays
类,是静态类,用于对数组进行排序、搜索、转化等操作,需要import
才能使用;
import java.util.Arrays;
public class FirstSample
{
public static void main(String[] args)
{
int[] a; // 声明了一个整型数组a,常用
int b[]; // 声明了一个整型数组b,不常用
int[] c = new int[100]; // 创建一个可存储100个int的整型数组c
int[] d = {1, 2, 3, 4, 5}; // 创建数组对象
d = new int[] {1, 2, 3, 4}; // 使用匿名数组,重新初始化数组d
int[] e = d; // 数组拷贝,d、e两个变量引用同一个数组
int[] f = Arrays.copyOf(e, e.length); // 将数组e中的所有元素拷贝到数组f中,一般用于扩充数组或截断数组
int[] copyOfRange_e = Arrays.copyOfRange(e, 0, 10); // 返回一个与e类型相同的数组,起始下标为0,终止下标为10
Arrays.sort(d); // 对数组c进行排序,sort()方法使用的是优化后的快速排序算法
String str_d = Arrays.toString(d); // 将数组d转化为字符串
int x = Arrays.binarySearch(e, 1); // 在数组中查找元素1
Arrays.fill(e, 10); // 将数组e中所有元素值设置为10
boolean bool_x = Arrays.equals(a, b); // 比较两个数组,若相同,则返回true
float g = Math.random(); // 返回一个[0, 1)之间的随机浮点数
int h = (int) (Math.random() * 100); // 返回一个[0, 100)之间的随机整数
for (int i = 0; i < 100; i++) // 给数组赋值
{
a[i] = i;
}
for (int i : a) // foreach循环,更加简洁,且不需要关注数组的元素个数,从而避免了超出数组边界的问题,因此适用于数组、集合
{
System.out.println(i);
}
// 向数组中增加元素,方法一
List<Integer> list = new ArrayList<Integer>(); // 使用动态数组
list.add(1); // 增加元素
list.add(2, 0); // 在下标为2的位置增加元素
System.out.println(list);
// 向数组中增加元素,方法二
int[] f = Arrays.copyOf(e, e.length + 1); // 新建数组并扩充数组长度
f[e.length] = 10;
System.out.println(a.length); // 输出数组的元素个数。注意,这里的length不是方法,是数组的属性
System.out.println(Arrays.toString(a)); // 将数组转化为字符串,打印出来
ArrayList<Integer> arrayList = new ArrayList<Integer>;
arrayList = Arrays.asList(a); // 数组转化为动态数组
int[] a1 = arrayList.toArray(); // 动态数组转化为数组
}
}
java程序的命令行参数public static void main(String[] args)
,其实接收的也是一个字符串数组
二维数组用于描述表格类的数据,也成为矩阵。
double[][] a; // 声明一个二维数组,元素类型为double
int[][] b =
{
{1, 2, 3}
, {4, 5, 6}
, {7, 8, 9}
}; // 初始化二维数组
int c = b[2][1]; // 访问二维数组中的元素,下标为[2][1]
for (int[] x : a) // 遍历二维数组的每一个元素
for (int i : x)
{
System.out.println(i);
}
System.out.println(Arrays.deepToString(b)); // 快速打印二维数组
boolean x = Arrays.deepEquals(a, b); // 判断两个多维数组是否相等
Java实际上是没有多维数组的,只有一维数组;多维数组被解释为“数组的数组”;