Java:常用语句
学习时可参考:
0、基本
0.1、导入某个Module
格式:import 包1.包2.类名
import java.util.List;
import java.util.ArrayList;
import 包.*:导入包中的所有类(不包含子包中的类)
一些注解所在的包:
- @WebServlet:javax.servlet.annotation.WebServlet
0.1、浮点值的相等判断
尽量不要用 ==,而要设置为小于某个精度时成立:
double r = Math.abs( x - y ) if(r < 0.00001){ //可以认为相等 } else{ //不相等的情况 }
0.2、类型判断:instanceof
变量 instanceof 类型
用于检查变量是否是某种类型,返回true或false;
boolean isDouble = n instanceof Double;
0.3、变量类型:var
用var作为类型定义某个变量时,可以实现动态类型(多态):
var sb = new StringBuilder(1024); var i = 5;
0.4、static与final
Java中用final来定义常量;static定义静态属性和方法,可以直接通过类名访问。
如果想在main()方法中直接访问某个函数,那么该函数除了需要在该public类中,还必须以static加以说明。
0.5、基本语句
①if
if (条件1){ //执行语句1 } else if (条件2){ //执行语句2 } else { //执行语句3 }
②switch
switch(表达式){ case v1: 语句1; break; case v2: 语句2; break; default: 语句n; }
其中表达式可以是一个字符串,这时比较的是表达式代表的字符串内容是否与v1、v2代表的字符串内容相同。
switch简化版本
switch(表达式){ case v1 -> {语句块1;} case v2 -> {语句块2;} default -> {语句块n;} }
这种写法不写break,也不会穿透到下一句中。
此外,这种写法可以返回一个值被某个变量承接:
int n = switch(表达式){ case v1 -> 1; //if 表达式==v1 return 1 case v2 -> 2; default -> 0; }
yield
大多数时候,在switch表达式内部,我们会返回简单的值。
但是,如果需要复杂语句,我们也可以写很多语句(在case之后的语句块中),放在{...}中,然后,用yield返回一个值作为switch语句的返回值:
yield:相当于一次return(return是函数中的,yield是switch专用)。
int n = switch (fruit) { case "apple" -> 1; case "banana" -> 2; default -> { int code = fruit.hashCode() yield code; } };
也就是说,相当于在其中嵌入了一段只有返回值(该返回值用yield承接)的函数。
③for
基本写法
for(初始条件;结束检测条件;计数器){ //循环体 }
访问一个List中的元素:for each
List <String> list = List.of("apple","pear","banana"); for(String s : list) System.out.println(s);
④while
while(条件表达式){ //循环体 }
⑤do while
do{ 循环体 } while (条件表达式) ;
注意最后的分号
0.6、?:选择运算符
System.out.println(exist ? "测试成功!" : "测试失败!");
0.7、或与非
逻辑
&&、||、!
按位
& | ~ ^(异或)
0.7*、判断变量A是否为null
if(A == null){ ... }
0.8、输入输出
输出
见Java:输入输出、格式化输出 - ShineLe - 博客园
输入——从控制台读取,或者用户输入
一个从控制台读取一个String和一个整数的例子:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Input your name:"); String name = scanner.nextLine();//读取一行输入并获取字符串 System.out.print("Input your age:"); int age = scanner.nextInt(); //读取一行输入并获取整数 System.out.printf("Hi,%s,you are %d\n", name, age); } }
①导入java.util.Scanner;
②创建Scanner对象scanner,创建时传入参数System.in。直接使用System.in读取用户输入虽然可行,但是需要更复杂的代码,而通过Scanner就可以简化后续代码
③输入;scanner.nextLine()接收用户输入的字符串,scanner.nextInt()接收用户输入的整数。Scanner会自动转换数据类型,因此不用手动转换。
0.9、命令行参数
Java程序入口是main方法,main方法接收一个命令行参数,它是一个String数组,写法是String[ ]args,该参数由JVM接收用户输入并传递给main方法。
访问该方法,在String数组args上使用for each循环:
for(string arg : args){ func(arg); }
命令行参数的传入时机:
①编译java文件; javac Main.java
②执行并传入命令行参数-version;java Main -version
1、字符串
1.1、字符串连接——+
1.2、各类型向字符串转化
""+val //val可以是任何类型的变量
1.3、字符串内容相等的判断
str1.equals(str2); "hello".equals(str2);
2、数组
和C中的用法类似,打印时只写数组名,那么对应的是数组首项的地址。
2.0、构造数组
①一维数组
三种方法:①是动态初始化,先定义后赋值;②③是静态初始化,在定义时就初始化。
//①先定义数组大小后初始化 int [] arr = new int [5]; arr[0]=1;
arr[1]=2
... //②定义时就进行初始化 //最常用 int [] arr = { 1,2,3,4,5 }; //③
int [] arr = new int [] {1,2,3,4,5};//不要写成 new int [5] {...}
②二维数组
//①先分配空间,后进行初始化 int [] ns = new int [8]; for(int i=0;i<8;i++) ns[i]=new int [8]; //②在定义时,直接初始化 int [][] ns ={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
二维数组实际上相当于数组元素为数组的一维数组。
这里每个元素数组的长度可以不一样:
int [] [] ns ={ {1,2,3,4}, {5,6}, {7,8,9} };
2.1、属性
数组长度:length
2.2、方法
1、判断List中是否包含某个元素o:contains( Obj o )
if ( list.contains( o ) ) return true;
2.3、访问数组元素
①最基本的方式
for(int i=0;i<8;i++) ...
②用for each结构访问数组中的每一个元素
for (n : arr){ //循环体 }
for(int [] i:ns){ for(int j : i){ //循环体 } }
2*、字符串
StringBuilder:字符串之间的拼接
StringJoiner:字符串数组中的字符串之间的拼接
不过以上两项用的还不算多,更多的是用String.join()方法,该方法可以通过灵活设置分隔符起到各种拼接的效果。
用法:
String.join(分隔符,字符串数组)
这里的第一项参数分隔符必须是String类型,而不能是char类型。
3、类、接口
3.1、类与对象
2021.4.26:类、继承、多态、抽象、面向抽象编程 - ShineLe - 博客园
函数覆写与函数重载
函数重载是指在某个类中,同时写两个同名函数,它们的参数不同;
函数覆写,则是子类中写一个与父类中某个函数同名函数,用以覆盖父类中的该函数。
3.2、接口
3.3、静态属性与静态方法
2021.4.27:静态属性与静态方法修饰符:static
这类属性和方法不是某个对象所有,而是这个类所拥有的,访问时可以直接用类名.xxx、类名.func(...)的方式调用。
4、异常
2021.5.5:异常/Exception、try...catch...finally
4.1、异常的捕获与处理
try { //可能出错的语句 } catch(Exception1 e){ //捕获到1类错误时的后续处理 } catch(Exception2 e){ //捕获到2类错误时的后续处理 } ....
如果存在异常而没处理,则必须在该异常所在的函数中手动throws该异常:
void func(...) throws xxxException{ //存在异常但没有用try捕获并处理的语句块 }
catch之后的打印:
e.printStackTrace();
11.2、手动抛出异常
人为手动抛出异常,要用throw,抛出的异常必须被上文捕获。
步骤:
①、创建某Exception的实例
②、用throw抛出
void process2(String s){ if(!s){ throw new NullPointerException(); } }
为了保证可以追踪到最初的异常,保留原始异常栈,在构造异常时,需要把原始的Exception实例传进去:
try { process2(s); } catch (NullPointerException e) { throw new IllegalArgumentException(e); }
11.3、NullPointerException
NullPointerException是最常见的RuntimeException,即空指针异常NPE。
如果对一个null调用属性、方法,就会产生NullPointerException,它是由JVM抛出的。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性