帮助文档链接:https://docs.oracle.com/en/java/
javaSE:https://docs.oracle.com/en/java/javase/index.html
1.运算符
1.1 算术运算符
public class Main{
public static void main(String[] args){
int a=3,b=2; //int a,b=1是有歧义的,a未初始化
double c=1;
System.out.println("a/b="+a/b); //整数相除
System.out.println("a/c="+a/c); //整数除以浮点数
System.out.println("a%b="+a%b); //取余
System.out.println("a*c="+a*c); //相乘
}
}
1.2 数学函数
java中的数学函数使用Math类。常见Math函数如下表所示:
函数 | 含义 |
---|---|
Math.sqrt(x) | x \sqrt{x} x |
Math.pow(x,a) | x a x^{a} xa |
Math.floorMod(x,a) | x%a,无论x正负,大小总为0~a-1 |
Math.sin(x) | sin ( x ) \sin(x) sin(x) |
Math.cos(x) | cos ( x ) \cos(x) cos(x) |
Math.tan(x) | tan ( x ) \tan(x) tan(x) |
Math.atan(x) | a t a n ( x ) atan(x) atan(x),输出范围[-π/2, π/2] |
Math.atan2(x) | a t a n 2 ( x ) atan2(x) atan2(x),输出范围[-π, π] |
Math.exp(x) | e x e^{x} ex |
Math.log(x) | l n ( x ) ln(x) ln(x) |
Math.log10(x) | l o g 10 ( x ) log_{10}(x) log10(x) |
Math.PI | π \pi π |
Math.E | e e e |
public class Main{
public static void main(String[] args){
System.out.println("sqrt(4)="+Math.sqrt(4));
System.out.println("pow(2,2)="+Math.pow(2,2));
System.out.println("floorMod(23,12)="+Math.floorMod(23,12));
System.out.println("sin(PI)="+Math.sin(Math.PI));
System.out.println("cos(PI)="+Math.cos(Math.PI));
System.out.println("tan(PI)="+Math.tan(Math.PI));
System.out.println("atan(0)="+Math.toDegrees(Math.atan(0))); //Math.toDegrees函数用于将弧度转化为角度
System.out.println("atan2(1,1)="+Math.toDegrees(Math.atan2(1,1)));
System.out.println("exp(2)="+Math.exp(2));
System.out.println("ln(e)="+Math.log(Math.E));
System.out.println("log10(10)="+Math.log10(10));
System.out.println("PI="+Math.PI);
System.out.println("e="+Math.E);
}
}
值得注意的是:虽然Math类的方法输入输出参数都是double类型,但是也可以直接传入int类型。
public class Main{
public static void main(String[] args){
int x=4;
System.out.println("sqrt(4)="+Math.sqrt(x)); //虽然Math类的方法输入输出参数都是double类型,但是也可以直接传入int类型
}
}
1.3 数值类型之间转换
下图所示是数值类型的合法转换,实线表示无精度损失,虚线表示有精度损失。
1.4 强制类型转换
public class Main{
public static void main(String[] args){
char a='a';
System.out.println("a="+a);
System.out.println("a="+(int)a);
System.out.println("a="+(long)a); //实际上是先转化为int,再转化为long
double b=9.5;
System.out.println("(int)b="+(int)b); //直接截断小数变int
System.out.println("round(b)="+(int)Math.round(b)); //Math.round返回对b四舍五入的结果,类型为long,所以还需要强制转int
int c=128;
System.out.println("(byte)c="+(byte)c); //byte的范围为[-128,127]
}
}
值得注意的是,boolean类型不可以与任何数据类型进行强制转换,如果要将boolean类型转化为int,采用条件运算:
public class Main{
public static void main(String[] args){
boolean a=true;
int b=a?0:1;
System.out.println("b="+b);
}
}
1.5 赋值与表达式的值
java支持+=这样的符号。表达式也可以进行赋值,但不建议。
1.6 自增与自减
++前缀形式会先完成加 1; 而后缀形式会使用变量原来的值。实际中一般不会使用下面这种容易引起混淆的代码:
public class Main{
public static void main(String[] args){
int a=1;
int b=1;
int c=1;
int d=a*(++b); //注意常量是不可以使用++ --的
int e=a*(c++);
System.out.println("d="+d);
System.out.println("e="+e);
}
}
1.7 关系与boolean运算符
符号 | 含义 |
---|---|
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
&& | 与 |
|| | 或 |
其中,对于与或的用法,有一定的应用价值,如&&可以用来避免错误:
x!=0 && 1/x>2
,这个表达式中,首先判断x是不是0,如果不是0那么后面的1/x就不会出错,如果x是0,那1/x>2就不会被执行。
1.8 条件运算符
条件?表达式1:表达式2
1.9 switch表达式
switch表达式也是一个表达式,其返回一个值。
public class Main{
public static void main(String[] args){
//String类型的switch表达式,必须要有default,因为表达式必须要有返回值
int a=1;
String season=switch (a){
case 0 -> "Spring";
case 1 -> "Summer";
case 2 -> "Fall";
case 3 -> "Winter";
default -> "???";
};
System.out.println("season="+season);
//int类型的switch表达式,必须要有default,因为表达式必须要有返回值
String s="Spring";
int seasonCode=switch(s){
case "Spring"->0;
case "Summer"->1;
case "Fall"->2;
case "Winter"->3;
default -> 4;
};
System.out.println("seasonCode="+seasonCode);
//使用枚举常量作为操作值时,不必有default,因为表达式肯定有返回值
enum Size {S,M,L,XL};
Size size=Size.S;
int b=switch(size){
case S->0;
case M->1;
case L->2;
case XL->3;
};
System.out.println("b="+b);
}
}
1.10 位运算符
位运算符有4种:与&、或|、异或^、非~。另外还有>>、<<、>>>(没有<<<)。其中,>>和>>>是有区别的—— >>运算符会用0 填充高位,>>>会用符号位填充高位。
public class Main{
public static void main(String[] args){
int a=0b101;
//判断从右往做第三位是0还是1
//方法一
int b=(a&0b100)/0b100;
System.out.println("b="+b);
//方法二
int c=(a&(1<<2))>>2;
System.out.println("c="+c);
// >>> 与 >> 的区别
int d=-10;
System.out.println("d>>>2="+(d>>>2));
System.out.println("d>>2="+(d>>2));
}
}
2.字符串
java中没有内置的字符串类型,而是用String类来表示字符串。用""
括起来的就是一个String对象。
2.1 子串、拼接、重复
public class Main{
public static void main(String[] args){
String s="Hello World";
String ss="don't use ";
//取子串
String s1=s.substring(0,2);
//拼接
String s2=s+ss;
int a=666;
String s3=s+a; //与String进行拼接,不是String类型的对象会转化为String类型
String s4=String.join(",","a","b","c","d");
//重复
String s5="I love java!".repeat(3);
System.out.println("s1="+s1);
System.out.println("s2="+s2);
System.out.println("s3="+s3);
System.out.println("s4="+s4);
System.out.println("s5="+s5);
}
}
2.2 字符串的不可更改性
在 Java 中,不可变字符串(即 String 类的实例)具有一个很大的优点,即编译器可以让字符串共享。这种共享机制称为字符串常量池(String Pool)。不可变字符串意味着一旦 String 对象被创建,它的内容就不能被改变。任何对字符串的修改操作都会生成一个新的字符串对象,而不会改变原来的字符串。这样做的目的是:相同内容的字符串字面量(指直接写为"Hello"这样的对象)会被编译器优化,让它们在内存中共享同一个对象。这大大减少了内存使用,提高了性能。
public class Main{
public static void main(String[] args){
String s1="Hello World";
String s2="Hello World";
String s3="don't use";
// 打印s1和s2的identityHashCode,比较s1和s2是否是同一个对象
System.out.println("s1 identityHashCode: " + System.identityHashCode(s1)); //System.identityHashCode()是与内存地址相关的值
System.out.println("s2 identityHashCode: " + System.identityHashCode(s2));
System.out.println("s3 identityHashCode: " + System.identityHashCode(s3));
// 更改字符串的方法,将Hello World改为Hello Young woman
String s4=s1.substring(0,6)+"Young woman";
System.out.println("s4="+s4);
}
}
字符串池是 JVM 为了优化字符串的存储而设计的一个内存区域。它用于存储字面量字符串和字符串常量。对于同样的字符串字面量,JVM 会在字符串池中存储并重用这些字符串。但是,字符串池仅用于存储字符串字面量(例如 “hello”)和编译时常量表达式(如 “he” + “llo”)。对于运行时生成的新字符串(如通过 substring() 或 + 操作生成的字符串),这些字符串不会自动加入字符串池,而是直接在堆内存中创建。
public class Main{
public static void main(String[] args){
String s1="Hello";
if(s1=="Hello"){
System.out.println("s1==\"Hello\"");
}
else{
System.out.println("s1!=\"Hello\"");
}
if(s1.substring(0,2)=="He"){ //通过substring、+等操作得到的字符串是没有共享的
System.out.println("s1.substring(0,2)==\"He\"");
}
else{
System.out.println("s1.substring(0,2)!=\"He\"");
}
}
}
2.3 字符串比较
从2.2节可以知道,比较字符串用==
的话,其实比较的是地址,想要比较字符串内容的话,千万不能用==
,而是要用String.equals()
public class Main{
public static void main(String[] args){
String s1="Hello";
if(s1.substring(0,2).equals("He")){ //通过substring、+等操作得到的字符串是没有共享的
System.out.println("s1.substring(0,2)==\"He\"");
}
else{
System.out.println("s1.substring(0,2)!=\"He\"");
}
}
}
2.4 空串与null串
空串:长度为0,内容为空的String对象。
null串:表示没有对象与改变量关联。
public class Main{
public static void main(String[] args){
String s1="";
//检查空串的第一种方法
if(s1.equals("")){
System.out.println("s1 is \"\"");
}
else{
System.out.println("s1 isn't \"\"");
}
//检查空串的第二种方法
if(s1.length()==0){
System.out.println("s1 is \"\"");
}
else{
System.out.println("s1 isn't \"\"");
}
//检查null的方法
String s2=null;
if(s2==null){
System.out.println("s2 is null");
}
else{
System.out.println("s2 isn't null");
}
String s3="I love you";
//判断不是null和空串的方法
if(s3!=null && s3.length()!=0){ //对于null的String变量,该变量不能调用任何的String方法,所以必须s3!=null在前,s3.length()!=0在后
System.out.println("s3 isn't null or \"\"");
}
}
}
2.5 码点与代码单元
public class Main{
public static void main(String[] args){
String s="🍺好喝";
//获取代码单元个数
int codeUnitNum=s.length();
System.out.println("codeUnitNum="+codeUnitNum);
//获取码点个数
int codePointNum=s.codePointCount(0,codeUnitNum);
System.out.println("codePointNum="+codePointNum);
//获取指定位置处的字符,1字节的char类型数据不足以表示辅助代码单元
char c1=s.charAt(0);
char c2=s.charAt(1);
char c3=s.charAt(2);
char c4=s.charAt(3);
System.out.println("c1="+c1);
System.out.println("c2="+c2);
System.out.println("c3="+c3);
System.out.println("c4="+c4);
for (int i = 0; i < codePointNum; i++) {
int a = s.codePointAt(s.offsetByCodePoints(0, i));
String str = String.valueOf(Character.toChars(a));
System.out.print(str);
}
}
}
所以还是不要使用char类型了,直接使用String类。更多关于String的API查看https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/String.html
2.6 文本块
文本块特别适合包含用其他语言编写的代码,如 SQL 或 HTML 可以直接将那些代码粘贴到一对三重引号之间。如果一个文本块中包含非 Java 代码,实际上最好沿 左边界放置。这样可以与Java 代码区分开,而且可以为长代码行留出更多空间。
public class Main{
public static void main(String[] args){
//内容为"""之间的内容,但是第一个"""后面的换行符不包括
String block= """
I
love
young
woman
""";
String s="I\nlove\nyoung\nwoman\n";
System.out.println("block="+block);
System.out.println("s="+s);
System.out.println(block.equals(s));
}
}