赞
踩
标识符规则
两个重要的修饰符
Java中注释主要分为以下三种
//注释内容
;用的最多/*注释内容*/
;不推荐使用/**注释内容*/
;一般用在函数或者类上边需要注意
.class
文件中是不包含注释信息的/** 文档注释 @version v1.0.1 @deprecated 2024/02/19 @author fa 第一个HelloWorld,以供练习 */ public class HelloWorld { /* 1.main方法是Java程序的入口方法 2. main函数的格式是固定的,必须为public static void main(String[] args) */ public static void main(String[] args) { System.out.println是Java中标准输出,会将内容输出到控制台 System.out.println(10); } }
数据类型:数据类型是用来定义变量的,它规定了一个变量占用的空间大小,Java中的数据类型分为以下两类
基本数据类型见下表,需要注意
每个基本数据类型都会对应一个类类型,也即包装类
无论是16位还是32位系统,int都占用4个字节,long都占用8个字节
整型和浮点型都是有符号的(意思就是肯定有正负)
整型默认为int
,浮点型默认为double
计算机使用 二进制(bit) 表示数据
字节(Byte)是计算机中表示空间大小的基本单位,1B=8bit
在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如Employoyee、Puppy等。变量一旦声明后,类型就不能被改变了
变量及赋值:除常量外,生活中更多见的是变量(比如人的年龄就处在不断变化之中);可以把变量想象成一个箱子,这个箱子可以装特定的东西(例如苹果箱子规定只能装苹果),而箱子的大小则由数据类型决定,箱子的名字就叫做变量名,即数据类型 变量名=数值,在赋值时需要注意
需要注意
int
都是4个字节int
的包装类型为integer
int
范围为:-231~ 231-1integer
的MAX_VALUE
和MIN_VALUE
可以得到整型的最大和最小值int
范围,Java会直接报错public class TestDemo { public static void main(String[] args) { //case1:在定义时给出初值 int a = 10; System.out.println(a); System.out.println("---------------------------------------------"); //case2:先定义后赋值 int b; b = 20; System.out.println(b); System.out.println("---------------------------------------------"); //case3:输出最大和最小值 System.out.println("最大值"+Integer.MAX_VALUE); System.out.println("最小值"+Integer.MIN_VALUE); //case4:定义时未初始化或者超过范围,Java将直接报错,非常安全 /* int c = 9999999999999999999999999999999999;//error int d; System.out.println(d);//error
需要注意
long
都是4个字节long
的包装类型为Long
long
范围为:-263~ 263-1int
Long
的MAX_VALUE
和MIN_VALUE
可以得到长整型的最大和最小值public class TestDemo {
public static void main(String[] args) {
//case1
long a = 100;
System.out.println(a);
System.out.println("--------------");
//case2:初始化时为了进行区分,建议在后面加L
long b = 100L;
System.out.println(a);
System.out.println("--------------");
//case3:输出最大和最小值
System.out.println("最大值"+Long.MAX_VALUE);
System.out.println("最小值"+Long.MIN_VALUE);
}
}
需要注意
short
都是2个字节short
的包装类型为Short
short
范围为:-215~ 215-1Short
的MAX_VALUE
和MIN_VALUE
可以得到短整型的最大和最小值public class TestDemo{
public static void main(String[] args) {
//cas1:
short a = 10;
System.out.println(a);
//case2:
System.out.println("最大值"+Short.MAX_VALUE);
System.out.println("最小值"+Short.MIN_VALUE);
}
}
需要注意
byte
都是1个字节byte
的包装类型为Byte
byte
范围为:-128~127Byte
的MAX_VALUE
和MIN_VALUE
可以得到byte的最大和最小值public class TestDemo{
public static void main(String[] args) {
//cas1:
byte a = 10;
System.out.println(a);
//case2:
System.out.println("最大值"+Byte.MAX_VALUE);
System.out.println("最小值"+Byte.MIN_VALUE);
}
}
这里再补充一点,如下代码看似是没有错误的,因为变量b
的结果是11,并没有超过byte
的范围,但编译器却报出了错误
这是因为变量a
的确是byte
型的,但在Java中整型字面常量默认为int
,整型提升后变量a+1
自然就变为了int
型,类型不正确。正确写法如下
需要注意
float
都是4个字节float
存储遵守IEEE 754标准,更多可点击了解:(计算机组成原理)第二章数据的表示和运算-第三节2:IEEE754标准float
,因为其范围较小,常用的还是double
float
包装类型为Float
double
,所以在定义时后面必须加f
或F
,否则无法编译通过public class TestDemo{
public static void main(String[] args) {
//cas1:
float a = 3.14F;
System.out.println(a);
}
}
double
都是8个字节double
存储遵守IEEE 754标准,更多可点击了解:[(计算机组成原理)第二章数据的表示和运算-第三节2:IEEE754标准]double
包装类型为Double
int
与int
相除是不会得到double
的,除非两个都是double
(或者让其中一个暂时变为小数)public class TestDemo{ public static void main(String[] args) { //case1: double a = 3.14; System.out.println(a); //case2: int b1 = 1; int c1= 2; System.out.println(b1/c1);//不等于0.5,等于0 double b2 = 1; double c2 = 2; System.out.println(b2/c2);//等于0.5 System.out.println(b1*1.0/c1);//这样也是0.5 //case3: double d = 1.1; System.out.printf("%.20f", d*d); } }
需要注意
char
的包装类型为Character
char
范围为:0~65535
case1:计算机中的字符本质上是一个整数。在C语言中使用ASCII表示字符,而Java中使用Unicode表示字符。因此一个字符占用两个字节,表示的字符种类更多,包括中文(具体见((计算机组成原理)第二章数据的表示和运算-第一节3:字符与字符串在计算机中的表示详解))
case2:字符可以存放整数(显示时会显示为整数对应的字符;不能是负数)
public class TestDemo{
public static void main(String[] args) {
//case1
char a = 'a';
char b ='6';
System.out.println(a);
System.out.println(b);
//case2
char c = 97;
System.out.println(c);
}
}
需要注意
boolean
类型只有两种取值:ture
和false
(没有所谓的0是假非0是真的说法)boolean
的包装类型为Boolean
boolean
并没有规定它的大小public class TestDemo{
public static void main(String[] args) {
//case1
boolean flg = true;
System.out.println(flg);
}
}
类型转换:Java是一门强类型编程语言,在进行变量赋值时会有严格的类型检查,检查不通过编译也会失败,如下
warning
,很不安全public class TestDemo{
public static void main(String[] args) {
int a = 10;
long b = 100L;
b = a;//编译通过
a = b;//编译失败,4字节存不了8字节的
}
}
如果编译可以通过,那么当数据类型不一致时就会进行类型转换,分为两类
自动类型转换(隐式):即代码不需要经过任何处理,在编译时编译器自动进行转换;典型特征就是数据范围小的转数据范围大的
public class TestDemo{ public static void main(String[] args) { //case1: int a = 10; long b = 100L; b = a;//编译通过;4字节转向8字节 a = b;//编译失败;8字节转向4字节会丢失 //case2: float f = 3.14F; double d =5.12; d = f;//编译通过;4字节转向8字节 f = d;//编译失败;8字节转向4字节会丢失 //case3: byte b1 = 100;//编译通过;未超过byte范围,会将int下的100转化为byte byte b2 = 257;编译失败;超出范围,数据丢失 } }
强制类型转换(显式):操作时,代码需要一定的格式处理,一旦强转意味着程序员需要为此次转换负责;典型特征就是数据范围大的转数据范围小的
public class TestDemo{ public static void main(String[] args) { //case1: int a = 10; long b = 100L; b = a;//编译通过;4字节转向8字节 a = b;//编译失败;8字节转向4字节会丢失 a = (int)b;//强转 //case2: float f = 3.14F; double d =5.12; d = f;//编译通过;4字节转向8字节 f = d;//编译失败;8字节转向4字节会丢失 f = (float)d;//强转 //case3: byte b1 = 100;//编译通过;未超过byte范围,会将int下的100转化为byte byte b2 = 257;编译失败;超出范围,数据丢失 byte b3 = (byte)257;//强转 } }
if语句
public class TestDemo { public static void main(String[] args) { //格式1 int a = 10; if(a > 1){ System.out.println("不知道写啥"); } System.out.println("---------------------------------"); //格式2 int b = 3; int c = 5; if(b > c){ System.out.println("b比c要大"); }else{ System.out.println("b比c要小"); } System.out.println("---------------------------------"); //格式3 int score = 77; if(score >= 90){ System.out.println("优秀"); }else if(score >= 80 && score < 90){ System.out.println("良好"); }else if(score >= 70 && score < 80){ System.out.println("中等"); }else if(score >= 60 && score < 70){ System.out.println("及格"); }else if(score >= 0 && score < 60){ System.out.println("不及格"); }else{ System.out.println("错误数据"); } } }
Switch语句
case
后的常量值不可以重复long
、float
、double
、boolean
break
,否则switch
将失去“多分支选择”的效果public class TestDemo { public static void main(String[] args) { int day = 2; switch(day){ case 1: System.out.println("周一"); break; case 2: System.out.println("周二"); break; case 3: System.out.println("周三"); break; default: System.out.println("休息"); break; } } }
while循环
break
:结束循环continue
:跳过本次循环直接进入下一次循环public class TestDemo {
public static void main(String[] args) {
int i = 1;
while(i <= 10){
System.out.println(i++);
}
}
}
for循环
public class TestDemo {
public static void main(String[] args) {
for(int i = 1; i <= 10; i++){
System.out.println(i);
}
}
}
增强for循环
public class TestDemo{
public static void main(String[] args){
int[] a = new int[10];
for (int x : a) {
System.out.println(x);
}
}
}
do while循环
int num = 1;
do {
System.out.println(num);
num++;
} while (num <= 10);
Java中的方法是用来执行特定任务的一段代码块。方法可以接受参数,执行操作,并返回结果。在Java中,方法通常定义在类中,并且可以被该类的对象调用。以下是Java方法的一些基本特征和语法:
public
表示公共方法,可以从任何地方访问;private
表示私有方法,只能在同一类中访问;protected
表示受保护方法,可以在同一包或子类中访问;默认修饰符表示包私有方法,只能在同一包中访问void
下面是一个简单的Java方法示例: add
方法接受两个整数作为参数,并返回它们的和。main
方法是Java程序的入口点,在其中调用了add
方法,并输出了结果
public class Example {
// 方法声明
public static int add(int num1, int num2) {
// 方法体
int sum = num1 + num2;
return sum; // 返回结果
}
public static void main(String[] args) {
// 调用方法
int result = add(3, 5);
System.out.println("Result: " + result);
}
}
方法的重载(Overloading)是指在同一个类中可以定义多个同名的方法,但它们的参数列表必须不同(参数类型、参数个数或参数顺序不同)。在调用方法时,编译器会根据提供的参数类型和数量来确定调用哪个重载方法
下面是一个方法重载的示例: Calculator
类中定义了四个重载方法add
,分别用于执行整数相加、双精度浮点数相加、字符串连接等操作。在main
方法中,演示了如何调用这些重载方法
public class Calculator { // 重载方法1:两个整数相加 public int add(int a, int b) { return a + b; } // 重载方法2:三个整数相加 public int add(int a, int b, int c) { return a + b + c; } // 重载方法3:两个双精度浮点数相加 public double add(double a, double b) { return a + b; } // 重载方法4:两个字符串连接 public String add(String a, String b) { return a + b; } public static void main(String[] args) { Calculator calc = new Calculator(); // 调用重载方法1 System.out.println("Result 1: " + calc.add(3, 5)); // 调用重载方法2 System.out.println("Result 2: " + calc.add(3, 5, 7)); // 调用重载方法3 System.out.println("Result 3: " + calc.add(3.5, 2.5)); // 调用重载方法4 System.out.println("Result 4: " + calc.add("Hello, ", "world!")); } }
在Java中,类(Class)是一种用来描述对象的模板或蓝图,它定义了对象的属性和方法。而对象(Object)则是类的实例化,是类的具体实体,可以执行类中定义的方法,访问类中定义的属性。以下是关于Java类和对象的一些基本概念:
new
关键字来创建对象下面是一个简单的Java类和对象的示例:Car
类描述了汽车的属性(品牌、型号、年份)和行为(显示汽车信息)。在main
方法中,通过new
关键字创建了一个Car
对象myCar
,并调用了它的displayInfo
方法来显示汽车信息
// 定义一个类 public class Car { // 成员变量 String brand; String model; int year; // 构造方法 public Car(String brand, String model, int year) { this.brand = brand; this.model = model; this.year = year; } // 成员方法 public void displayInfo() { System.out.println("Brand: " + brand); System.out.println("Model: " + model); System.out.println("Year: " + year); } public static void main(String[] args) { // 创建对象 Car myCar = new Car("Toyota", "Camry", 2022); // 调用对象的方法 myCar.displayInfo(); } }
在Java中,接口(Interface)是一种抽象类型,它定义了一组抽象方法(没有方法体)以及常量(变量值不可改变)。接口提供了一种定义行为的方式,而不涉及具体的实现。类可以实现一个或多个接口,从而具备接口定义的方法和属性。以下是Java接口的一些基本特征和规则
①定义接口:使用interface
关键字来定义接口。接口中可以包含抽象方法、常量、默认方法和静态方法
public interface MyInterface { // 抽象方法 void abstractMethod(); // 常量 int CONSTANT_VALUE = 10; // 默认方法 default void defaultMethod() { System.out.println("Default method implementation"); } // 静态方法 static void staticMethod() { System.out.println("Static method implementation"); } }
②实现接口:使用implements
关键字来让一个类实现一个或多个接口。一个类可以同时实现多个接口
public class MyClass implements MyInterface {
// 实现接口中的抽象方法
@Override
public void abstractMethod() {
System.out.println("Implementation of abstractMethod");
}
// MyClass可以选择重写默认方法
}
③多继承:Java中允许类实现多个接口,这提供了一种弥补Java单继承限制的方式
public class MyOtherClass implements MyInterface, AnotherInterface {
// 实现接口中的抽象方法
@Override
public void abstractMethod() {
System.out.println("Implementation of abstractMethod");
}
// 实现AnotherInterface中的抽象方法
@Override
public void anotherMethod() {
System.out.println("Implementation of anotherMethod");
}
}
其他
extends
关键字static
关键字修饰的方法,可以通过接口名直接调用Java中向控制台输出信息主要有三种方式
System.out.println(msg);
//输出一一个字符串,带换行
System.out.print(msg);
//输出一个字符串,不带换行
System.out.printf(format, msg); // 格式化输出
其中格式化字符串如下
Java中需要输入信息时需要导入util
包
import java.util.Scanner;
导入之后,可以new
出一个Scanner
对象用于接收信息
Scanner sc = new Scanner(System.in);
接着可以调用该Scanner
对象的各种方法去接收各种类型的值(注意输入的值的类型一定要匹配)
如果最后不需要输入,记得关闭Scanner
Scanner.close()
这里举一些常见的例子
①:Scanner.nextLine()
:接收一行信息,使用String
接收按下回车时结束输入
Scanner.nextLine()
:接收一行信息,碰到空格时结束输入public class TestDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的姓名:");
String name =sc.nextLine();
System.out.println(name);
}
}
②:Scanner.nextInt()
:接收整型
Scanner.nextFloat()
/Scanner.nextDouble()
:接收浮点型public class TestDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的姓名:");
String name = sc.nextLine();
System.out.println(name);
System.out.println("请输入您的年龄:");
int age = sc.nextInt();
System.out.println(age);
}
}
③:使用如下方式处理循环输入
ctrl+D
public class TestDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int sum = 0; int num = 0; while(sc.hasNextInt()){ int temp = sc.nextInt(); sum += temp; num++; if(num == 10) { break; } } System.out.println(sum); } }
④:Scanner.next
:接收不带空格的字符串
字符串构造:构造一个字符串方法有很多,常用的有以下三种
newString
对象public class TestDemo {
public static void main(String[] args){
//使用常量字符串构造
String str1 = "Hello World1";
//直接newString对象
String str2 = new String("Hello World2");
//使用字符数组进行构造
char[] arr = {'H','e','l','l','o','W','o','r','l','d','3'};
String str3 = new String(arr);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
}
String是引用类型,但是其内部并不存储字符串本身,实际回报存在一个char类型的数组中
完整的关系应该是下面这样
public static void main(String[] args){
//s1和s2引用的不是同一个对象
//s1和s3引用的是同一个对象
String s1 = new String("hello");
String s2 = new String("world");
String s3 = s1;
}
①:==
用于比较是否引用的是同一个对象
public class TestDemo { public static void main(String[] args) { int a = 10; int b = 20; int c = 10; //对于基本类型,比较的是值 System.out.println(a == b); System.out.println(a == c); System.out.println("----------------------------------------------"); //对于引用类型,比较是否引用的是同一个对象 String s1 = new String("hello"); String s2 = new String("hello"); String s3 = new String("world"); String s4 = s1; System.out.println(s1 == s2); System.out.println(s2 == s3); System.out.println(s1 == s4); } }
②:boolean equals(Object anObject)
方法会按照字典序进行比较。如下,String类中重写了父类Object中的equals方法
public class TestDemo {
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = new String("hello");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
③:int compareTo(String s)
方法也会按照字典序进行比较,但与equals
有所不同的是,它返回的是int
。具体比较规则如下
public class TestDemo {
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("ac");
String s3 = new String("abc");
String s4 = new String("abcdef");
System.out.println(s1.compareTo(s2));//不同输出字符差值 -1
System.out.println(s1.compareTo(s3)); //相同为零
System.out.println(s1.compareTo(s4)); //前k个字符完全相同,输出长度差值 -3
}
}
④:int compareTolgnoreCase(String str)
方法:与compareTo方法相同,但是忽略大小写
public class TestDemo {
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("ac");
String s3 = new String("ABc");
String s4 = new String("abcdef");
System.out.println(s1.compareToIgnoreCase(s2));
System.out.println(s1.compareToIgnoreCase(s3));//相同
System.out.println(s1.compareToIgnoreCase(s4));
}
}
①:char charAt(inde index)
:返回index
位置上字符
index
为负数或者越界,抛出"indexOutofBoundsException
"异常public class TestDemo {
public static void main(String[] args) {
String s1 = new String("Hello");
String s2 = new String("World");
char c1 = s1.charAt(2);
System.out.println(c1);
System.out.println("-----------------------------------");
for(int i = 0; i < s2.length(); i++){
System.out.println(s2.charAt(i));
}
}
}
②:int indexOf(int ch)
:返回字符ch
第一次出现的位置
ch
这个字符则会返回-1public class TestDemo {
public static void main(String[] args) {
String s1 = new String("Hello");
String s2 = new String("World");
System.out.println(s1.indexOf('e'));
System.out.println(s2.indexOf('c'));
}
}
③:int indexOf(int ch, int fromIndex)
:从“fromIndex
”位置开始寻找字符“ch
”第一次出现的位置
ch
这个字符则会返回-1public class TestDemo {
public static void main(String[] args) {
String s1 = new String("Hello World!");
System.out.println(s1.indexOf('e', 1));
System.out.println(s1.indexOf('o', 5));
System.out.println(s1.indexOf('e', 5));
}
}
④:int indexOf(String str)
:返回字符串str第一次出现的位置
str
这个字符串则会返回-1public class TestDemo {
public static void main(String[] args) {
String s1 = new String("Hello World!");
System.out.println(s1.indexOf("World"));
System.out.println(s1.indexOf("Worls"));
}
}
⑤:int indexOf(String str, int fromIndex)
:从“fromIndex
”位置开始寻找字符串“str
”第一次出现的位置
str
这个字符串则会返回-1public class TestDemo {
public static void main(String[] args) {
String s1 = new String("one two three one four nine");
System.out.println(s1.indexOf("one", 4));
System.out.println(s1.indexOf("one", 15));
}
}
⑥:int lastIndexOf(int ch)
、int lastIndexOf(int ch, int fromIndex)
、int lastIndexOf(String str)
、int lastIndexOf(String str, int fromIndex)
:和前面类似,只不过是从后向前找
数字转换为字符串可以使用String.valueOf()
public class TestDemo {
public static void main(String[] args) {
String s1 = String.valueOf(123);
String s2 = String.valueOf(3.14);
String s3 = String.valueOf(true);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}
字符串转化为数字常用方法如下
public class TestDemo {
public static void main(String[] args) {
int num1 = Integer.parseInt("1234");
int num2 = Integer.parseInt("64", 8);//8表示八进制,八进制下的64对应十进制下的52
double num3 = Double.parseDouble("3.14");
System.out.println(num1);
System.out.println(num2);
System.out.println(num3);
}
}
字母大小写转换可以使用toUpperCase()
和toLowerCase()
。需要注意是,转换完成后,原来字符串的值并不会改变
public class TestDemo {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "HELLO";
//小写转换为大写
System.out.println(s1 + "->" + s1.toUpperCase());
//大写转换为小写
System.out.println(s2 + "->" + s2.toLowerCase());
}
}
可以使用String.toCharArray()
将一个字符串转为一个字符数组
public class TestDemo {
public static void main(String[] args) {
String str = "Hello!";
char[] ch = str.toCharArray();
for(int i = 0; i < ch.length; i++){
System.out.println(ch[i]);
}
}
}
使用String.format()
可以将一个字符串格式化为目标字符串
public class TestDemo {
public static void main(String[] args) {
String str = String.format("%d-%d-%d", 2000, 10, 12);
System.out.println(str);
}
}
①:String replaceAll(String regex, String replacement)
:将原字符串中regex
替换为replacement
public class TestDemo{
public static void main(String[] args) {
String s1 = "HelloWorld,Hello You";
String s2 = s1.replaceAll("Hello", "Bye"); //将Hello替换为Bye
String s3 = s1.replace('H', 'S'); //将H替换为S
System.out.println(s2);
System.out.println(s3);
}
}
②:String replaceFirst(String regex, String replacement)
:仅替换首次出现的regex
public class TestDemo{
public static void main(String[] args) {
String s1 = "HelloWorld,Hello You";
String s2 = s1.replaceFirst("Hello", "Bye"); //将第一个Hello替换为Bye
System.out.println(s2);
}
}
①:String[] split(String regex)
:以regex为分割标志,将原字符串拆分为多个字符串
public class TestDemo{
public static void main(String[] args) {
String str = "中国-北京市-东城区-长安街-天安门广场";
String[] ret = str.split("-");
for(String s : ret){
System.out.println(s);
}
}
}
②:String[] split(String regex, int limit)
:以regex
为分割标志,将原字符串拆分为limit
字符串
public class TestDemo{
public static void main(String[] args) {
String str = "中国-北京市-东城区-长安街-天安门广场";
String[] ret = str.split("-", 3);
for(String s : ret){
System.out.println(s);
}
}
}
③:一旦以"|
“、”*
“、”+
“等作为分割标志时,前面都得加上”\\
“,而且如果是”\
“,那么就得写上”\\\\
"
public class TestDemo{
public static void main(String[] args) {
String str = "www.baidu.com";
String[] ret = str.split("\\.");
for(String s : ret){
System.out.println(s);
}
}
}
④:如果第一次拆分出来的字符串中还需要进行拆分,那么就要使用下面这种多次拆分的写法
&
为分割标志拆分出name=zhangsan
和age=18
name
、zhangsan
、age
和18
public class TestDemo{
public static void main(String[] args) {
String str = "name=zhangsan&age=18";
String[] result = str.split("&");
for(int i = 0; i < result.length;i++){
String[] temp = result[i].split("=");
System.out.println(temp[1]);
}
}
}
使用String substring(int beginIndex, int endIndex)
可以截取[beginIndex, endIndex)
区间内的字符串
endIndex
,那么表示从beginIndex
开始一直截取到末尾public class TestDemo{
public static void main(String[] args) {
String str = "-Hello_World";
String str1 = str.substring(7);
String str2 = str.substring(1,6);
System.out.println(str1);
System.out.println(str2);
}
}
String
和StringBuilder
都是用于处理字符串的类,但它们之间有几个重要的区别:
不可变性:
String
是不可变的,即一旦创建了String
对象,就不能修改其内容。对String
对象进行任何操作(如拼接、替换等)都会创建一个新的String
对象。StringBuilder
是可变的,它允许对字符串进行动态修改,而不会创建新的对象。因此,对于频繁修改字符串内容的情况,使用StringBuilder
会更高效线程安全性:
String
是线程安全的,因为它的不可变性保证了多个线程同时访问一个String
对象时不会出现竞态条件StringBuilder
是非线程安全的,如果多个线程同时访问一个StringBuilder
对象并进行修改,可能会导致数据不一致或其他并发问题。如果需要在多线程环境下使用可变字符串,应该使用StringBuffer
,它和StringBuilder
功能类似但是线程安全的基于上述区别,我们可以得出以下结论:
String
是合适的,因为它的不可变性可以带来线程安全性和更简单的代码。StringBuilder
会更加高效常用方法如下
append()
: 用于在字符串末尾添加字符、字符串、基本类型数据或其他 StringBuilder
对象的内容insert()
: 用于在指定位置插入字符、字符串、基本类型数据或其他 StringBuilder
对象的内容delete()
: 用于删除从指定起始位置到指定结束位置的字deleteCharAt()
: 用于删除指定位置的字符replace()
: 用于将指定范围内的字符替换为新的字符或字符reverse()
: 用于颠倒字符串中字符的顺序charAt()
: 用于获取指定位置的字符length()
: 用于获取字符串的长度toString()
: 用于将 StringBuilder
对象转换为 String
对象indexOf()
和 lastIndexOf()
: 用于查找指定字符或字符串在 StringBuilder
中第一次和最后一次出现的位置StringBuilder sb = new StringBuilder(); // append() 示例 sb.append("Hello"); sb.append(" ").append("world"); sb.append(2024); // insert() 示例 sb.insert(5, ", "); sb.insert(0, "Greetings, "); // delete() 示例 sb.delete(6, 11); // deleteCharAt() 示例 sb.deleteCharAt(7); // replace() 示例 sb.replace(5, 11, "Java"); // reverse() 示例 sb.reverse(); // charAt() 示例 char c = sb.charAt(1); // length() 示例 int len = sb.length(); // toString() 示例 String str = sb.toString(); // indexOf() 和 lastIndexOf() 示例 int firstIndex = sb.indexOf("o"); int lastIndex = sb.lastIndexOf("o");
Java中的Math
类是一个包含了许多用于执行数学运算的工具方法的内置类。它提供了一系列静态方法来执行常见的数学运算,如取绝对值、取最大值、取最小值、求平方根、求幂运算等等。以下是Math
类中一些常用方法的介绍:
abs(double a)
:返回参数的绝对值。ceil(double a)
:返回大于等于参数的最小整数。floor(double a)
:返回小于等于参数的最大整数。round(float a)
:将参数四舍五入为最接近的整数。max(int a, int b)
:返回两个参数中的较大值。min(int a, int b)
:返回两个参数中的较小值。sqrt(double a)
:返回参数的平方根。pow(double a, double b)
:返回第一个参数的第二个参数次方。sin(double a)
:返回参数的正弦值(参数是以弧度表示的角度)。cos(double a)
:返回参数的余弦值(参数是以弧度表示的角度)。tan(double a)
:返回参数的正切值(参数是以弧度表示的角度)。random()
:返回一个介于0.0(包含)和1.0(不包含)之间的随机浮点数。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。