java基础
一、基本语法
Java修饰符
像其他语言一样,Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:
- 访问控制修饰符 : default, public , protected, private
- 非访问控制修饰符 : final, abstract, static, synchronized
在后面的章节中我们会深入讨论 Java 修饰符。
非访问修饰符
为了实现一些其他的功能,Java 也提供了许多非访问修饰符。
static 修饰符,用来修饰类方法和类变量。
final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
abstract 修饰符,用来创建抽象类和抽象方法。
synchronized 和 volatile 修饰符,主要用于线程的编程。
static
-
静态变量:
static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
-
静态方法:
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
对类变量和方法的访问可以直接使用 classname.variablename 和 classname.methodname 的方式访问。
实例
Test.java
package 面向对象.StaticTest;
/*
static 修饰变量,变量随着类加载而加载 可以使用 类.变量 调用变量 ,例如Person.naive
static 修饰方法 ,方法随着类加载,可以使用 类.方法调用方法
1.类可以调用静态方法,但是不能直接调用非静态方法和非静态变量
2. 对象可以调用静态和非静态
3. 静态方法只能调用静态变量,非静态变量可以调用静态变量和非静态变量
4. 静态方法中不能使用this和super 关键字
5. 开发中如何确定一个属性是否需要用static修饰?
>属性可以被多个对象共享的,不会随着对象的改变而改变
开发中如何确定一个方法是否需要用static修饰?
>操作静态属性的方法一般用static修饰
>工具类的方法: 习惯上声明为static的 比如:Math,Arrays,Collections
*/
public class Test {
public static void main(String[] args) {
Person person1 = new Person();
person1.setNaive("中国");
Person person2 = new Person();
System.out.println("person1.getNaive() = " + person1.getNaive());
System.out.println("person2.getNaive() = " + person2.getNaive());
System.out.println(Person.naive);//中国
Person.print();//我是一个静态方法
}
}
Person.java
package 面向对象.StaticTest;
public class Person {
static String naive;
private String name;
private String sex;
private int age;
public static void print() {
System.out.println("我是一个静态方法");
}
public static void eat() {
System.out.println("吃----person");
}
public Person() {
}
public Person(String name, String sex, int age,String naive) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setAge(int age) {
this.age = age;
}
public static String getNaive() {
return naive;
}
public static void setNaive(String naive) {
Person.naive = naive;
}
}
final
final 变量:
final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。
final 修饰符通常和 static 修饰符一起使用来创建类常量。
final 方法
父类中的 final 方法可以被子类继承,但是不能被子类重写。
声明 final 方法的主要目的是防止该方法的内容被修改。
final 类
final 类不能被继承,没有类能够继承 final 类的任何特性。
final 局部变量
形参:一但赋值,不能重新赋值
abstract
抽象类:
抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
抽象类可以包含抽象方法和非抽象方法。
抽象方法
抽象方法是一种没有任何实现的方法,该方法的具体实现由子类提供。
抽象方法不能被声明成 final 和 static。
任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。
抽象方法的声明以分号结尾,例如:public abstract sample();。
注意点
1.不能用来修饰属性、构造器
2.不能修饰私有方法、静态方法、final方法、final的类
Java 变量
Java 中主要有如下几种类型的变量
- 局部变量
- 类变量(静态变量)
- 成员变量(非静态变量)
赋值顺序
1.默认初始值
2.显式初始值、代码块中赋值
3.构造器中初始化
4.有了对象之后,可以通过属性或者 “对象.方法” 的方式赋值
Java 关键字
下面列出了 Java 关键字。这些保留字不能用于常量、变量、和任何标识符的名称。
| 类别 | 关键字 | 说明 |
|---|---|---|
| 访问控制 | private | 私有的 |
| protected | 受保护的 | |
| public | 公共的 | |
| default | 默认 | |
| 类、方法和变量修饰符 | abstract | 声明抽象 |
| class | 类 | |
| extends | 扩充,继承 | |
| final | 最终值,不可改变的 | |
| implements | 实现(接口) | |
| interface | 接口 | |
| native | 本地,原生方法(非 Java 实现) | |
| new | 新,创建 | |
| static | 静态 | |
| strictfp | 严格,精准 | |
| synchronized | 线程,同步 | |
| transient | 短暂 | |
| volatile | 易失 | |
| 程序控制语句 | break | 跳出循环 |
| case | 定义一个值以供 switch 选择 | |
| continue | 继续 | |
| default | 默认 | |
| do | 运行 | |
| else | 否则 | |
| for | 循环 | |
| if | 如果 | |
| instanceof | 实例 | |
| return | 返回 | |
| switch | 根据值选择执行 | |
| while | 循环 | |
| 错误处理 | assert | 断言表达式是否为真 |
| catch | 捕捉异常 | |
| finally | 有没有异常都执行 | |
| throw | 抛出一个异常对象 | |
| throws | 声明一个异常可能被抛出 | |
| try | 捕获异常 | |
| 包相关 | import | 引入 |
| package | 包 | |
| 基本类型 | boolean | 布尔型 |
| byte | 字节型 | |
| char | 字符型 | |
| double | 双精度浮点 | |
| float | 单精度浮点 | |
| int | 整型 | |
| long | 长整型 | |
| short | 短整型 | |
| 变量引用 | super | 父类,超类 |
| this | 本类 | |
| void | 无返回值 | |
| 保留关键字 | goto | 是关键字,但不能使用 |
| const | 是关键字,但不能使用 |
注意:Java 的 null 不是关键字,类似于 true 和 false,它是一个字面常量,不允许作为标识符使用。
继承
在 Java 中,一个类可以由其他类派生。如果你要创建一个类,而且已经存在一个类具有你所需要的属性或方法,那么你可以将新创建的类继承该类。
利用继承的方法,可以重用已存在类的方法和属性,而不用重写这些代码。被继承的类称为超类(super class),派生类称为子类(sub class)。
接口
在 Java 中,接口可理解为对象间相互通信的协议。接口在继承中扮演着很重要的角色。
接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类。
二、类和对象
Java 中的类
一个类可以包含以下类型变量:
- 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
- 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
- `类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。???**
构造方法
每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
下面是一个构造方法示例:
public class Puppy{
public Puppy(){
}
public Puppy(String name){
// 这个构造器仅有一个参数:name
}
}
创建对象
对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:
- 声明:声明一个对象,包括对象名称和对象类型。
- 实例化:使用关键字 new 来创建一个对象。
- 初始化:使用 new 创建对象时,会调用构造方法初始化对象。
下面是一个创建对象的例子:
public class Puppy{
public Puppy(String name){
//这个构造器仅有一个参数:name
System.out.println("小狗的名字是 : " + name );
}
public static void main(String[] args){
// 下面的语句将创建一个Puppy对象
Puppy myPuppy = new Puppy( "tommy" );
}
}
编译并运行上面的程序,会打印出下面的结果:
小狗的名字是 : tommy
import 语句
在 Java 中,如果给出一个完整的限定名,包括包名、类名,那么 Java 编译器就可以很容易地定位到源代码或者类。import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类。
例如,下面的命令行将会命令编译器载入 java_installation/java/io 路径下的所有类
import java.io.*;
三、基本数据类型
内置数据类型
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
byte:
- byte 数据类型是8位、有符号的,以二进制补码表示的整数;
- 最小值是 -128(-2^7);
- 最大值是 127(2^7-1);
- 默认值是 0;
- byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
- 例子:byte a = 100,byte b = -50。
short:
- short 数据类型是 16 位、有符号的以二进制补码表示的整数
- 最小值是 -32768(-2^15);
- 最大值是 32767(2^15 - 1);
- Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
- 默认值是 0;
- 例子:short s = 1000,short r = -20000。
int:
- int 数据类型是32位、有符号的以二进制补码表示的整数;
- 最小值是 -2,147,483,648(-2^31);
- 最大值是 2,147,483,647(2^31 - 1);
- 一般地整型变量默认为 int 类型;
- 默认值是 0 ;
- 例子:int a = 100000, int b = -200000。
long:
- long 数据类型是 64 位、有符号的以二进制补码表示的整数;
- 最小值是 -9,223,372,036,854,775,808(-2^63);
- 最大值是 9,223,372,036,854,775,807(2^63 -1);
- 这种类型主要使用在需要比较大整数的系统上;
- 默认值是 0L;
- 例子: long a = 100000L,Long b = -200000L。
"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。
float:
- float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
- float 在储存大型浮点数组的时候可节省内存空间;
- 默认值是 0.0f;
- 浮点数不能用来表示精确的值,如货币;
- 例子:float f1 = 234.5f。
double:
-
double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
-
浮点数的默认类型为 double 类型;
-
double类型同样不能表示精确的值,如货币;
-
默认值是 0.0d;
-
例子:
double d1 = 7D ; double d2 = 7.; double d3 = 8.0; double d4 = 8.D; double d5 = 12.9867;7 是一个 int 字面量,而 7D,7. 和 8.0 是 double 字面量。
boolean:
- boolean数据类型表示一位的信息;
- 只有两个取值:true 和 false;
- 这种类型只作为一种标志来记录 true/false 情况;
- 默认值是 false;
- 例子:boolean one = true。
char:
- char 类型是一个单一的 16 位 Unicode 字符;
- 最小值是 \u0000(十进制等效值为 0);
- 最大值是 \uffff(即为 65535);
- char 数据类型可以储存任何字符;
- 例子:char letter = 'A';。
类型默认值
下表列出了 Java 各个类型的默认值:
| 数据类型 | 默认值 |
|---|---|
| byte | 0 |
| short | 0 |
| int | 0 |
| long | 0L |
| float | 0.0f |
| double | 0.0d |
| char | 'u0000' |
| String (or any object) | null |
| boolean | false |
引用类型
- 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
- 对象、数组都是引用数据类型。
- 所有引用类型的默认值都是null。
- 一个引用变量可以用来引用任何与之兼容的类型。
- 例子:Site site = new Site("Runoob")。
Java 常量
常量在程序运行时是不能被修改的。
在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似:
final double PI = 3.1415927;
虽然常量名也可以用小写,但为了便于识别,通常使用大写字母表示常量。
字面量可以赋给任何内置类型的变量。例如:
byte a = 68;
char a = 'A'
byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。
当使用字面量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制, 例如:
int decimal = 100;
int octal = 0144;
int hexa = 0x64;
Java语言支持一些特殊的转义字符序列。
| 符号 | 字符含义 |
|---|---|
| \n | 换行 (0x0a) |
| \r | 回车 (0x0d) |
| \f | 换页符(0x0c) |
| \b | 退格 (0x08) |
| \0 | 空字符 (0x0) |
| \s | 空格 (0x20) |
| \t | 制表符 |
| " | 双引号 |
| ' | 单引号 |
| \ | 反斜杠 |
| \ddd | 八进制字符 (ddd) |
| \uxxxx | 16进制Unicode字符 (xxxx) |
自动类型转换
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级。
低 ------------------------------------> 高
byte,short,char—> int —> long—> float —> double
数据类型转换必须满足如下规则:
-
\1. 不能对boolean类型进行类型转换。
-
\2. 不能把对象类型转换成不相关类的对象。
-
\3. 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
-
\4. 转换过程中可能导致溢出或损失精度,例如:
int i =128; byte b = (byte)i;因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。
-
\5. 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
(int)23.7 == 23; (int)-45.89f == -45
自动类型转换
必须满足转换前的数据类型的位数要低于转换后的数据类型,例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32,可以自动转换为64位的double类型。
实例
public class ZiDongLeiZhuan{
public static void main(String[] args){
char c1='a';//定义一个char类型
int i1 = c1;//char自动类型转换为int
System.out.println("char自动类型转换为int后的值等于"+i1);
char c2 = 'A';//定义一个char类型
int i2 = c2+1;//char 类型和 int 类型计算
System.out.println("char类型和int计算后的值等于"+i2);
}
}
运行结果为:
char自动类型转换为int后的值等于97
char类型和int计算后的值等于66
解析:c1 的值为字符 a ,查 ASCII 码表可知对应的 int 类型值为 97, A 对应值为 65,所以 i2=65+1=66。
强制类型转换
-
\1. 条件是转换的数据类型必须是兼容的。
-
\2. 格式:(type)value type是要强制类型转换后的数据类型 实例:
实例
public class QiangZhiZhuanHuan{ public static void main(String[] args){ int i1 = 123; byte b = (byte)i1;//强制类型转换为byte System.out.println("int强制类型转换为byte后的值等于"+b); } }运行结果:
int强制类型转换为byte后的值等于123
隐含强制类型转换
- 1、 整数的默认类型是 int。
- \2. 小数默认是 double 类型浮点型,在定义 float 类型时必须在数字后面跟上 F 或者 f。
四、变量类型
Java 局部变量
- 局部变量声明在方法、构造方法或者语句块中;
- 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
- 访问修饰符不能用于局部变量;
- 局部变量只在声明它的方法、构造方法或者语句块中可见;
- 局部变量是在栈上分配的。
- 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
实例变量
- 实例变量声明在一个类中,但在方法、构造方法和语句块之外;
- 当一个对象被实例化之后,每个实例变量的值就跟着确定;
- 实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
- 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
- 实例变量可以声明在使用前或者使用后;
- 访问修饰符可以修饰实例变量;
- 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
- 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
- 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。
实例
Employee.java 文件代码:
import java.io.*;
public class Employee{
// 这个实例变量对子类可见
public String name;
// 私有变量,仅在该类可见
private double salary;
//在构造器中对name赋值
public Employee (String empName){
name = empName;
}
//设定salary的值
public void setSalary(double empSal){
salary = empSal;
}
// 打印信息
public void printEmp(){
System.out.println("名字 : " + name );
System.out.println("薪水 : " + salary);
}
public static void main(String[] args){
Employee empOne = new Employee("RUNOOB");
empOne.setSalary(1000.0);
empOne.printEmp();
}
}
以上实例编译运行结果如下:
$ javac Employee.java
$ java Employee
名字 : RUNOOB
薪水 : 1000.0
类变量(静态变量)
- 类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。
- 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
- 静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static 类型的变量。静态变量初始化后不可改变。
- 静态变量储存在静态存储区。经常被声明为常量,很少单独使用 static 声明变量。
- 静态变量在第一次被访问时创建,在程序结束时销毁。
- 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
- 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
- 静态变量可以通过:ClassName.VariableName的方式访问。
- 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。
实例:
Employee.java 文件代码:
import java.io.*;
public class Employee {
//salary是静态的私有变量
private static double salary;
// DEPARTMENT是一个常量
public static final String DEPARTMENT = "开发人员";
public static void main(String[] args){
salary = 10000;
System.out.println(DEPARTMENT+"平均工资:"+salary);
}
}
以上实例编译运行结果如下:
开发人员平均工资:10000.0
五、修饰符
六、Number & Math
| 包装类 | 基本数据类型 |
|---|---|
| Boolean | boolean |
| Byte | byte |
| Short | short |
| Integer | int |
| Long | long |
| Character | char |
| Float | float |
| Double | double |
Number & Math 类方法
下面的表中列出的是 Number & Math 类常用的一些方法:
| 序号 | 方法与描述 |
|---|---|
| 1 | xxxValue() 将 Number 对象转换为xxx数据类型的值并返回。 |
| 2 | compareTo() x.compareTo(3) 将number对象与参数比较。 |
| 3 | equals() x.equals(y) ,判断number对象是否与参数相等。 |
| 4 | valueOf() 返回一个 Number 对象指定的内置数据类型 |
| 5 | toString() 以字符串形式返回值。 |
| 6 | parseInt() 将字符串解析为int类型。 |
| 7 | abs() 返回参数的绝对值。 |
| 8 | ceil() 返回大于等于( >= )给定参数的的最小整数,类型为双精度浮点型。 |
| 9 | floor() Math.floor(d) 返回小于等于(<=)给定参数的最大整数 。 |
| 10 | rint() 返回与参数最接近的整数。返回类型为double。 |
| 11 | round() 它表示四舍五入,算法为 Math.floor(x+0.5),即将原来的数字加上 0.5 后再向下取整,所以,Math.round(11.5) 的结果为12,Math.round(-11.5) 的结果为-11。 |
| 12 | min() 返回两个参数中的最小值。 |
| 13 | max() 返回两个参数中的最大值。 |
| 14 | exp() 返回自然数底数e的参数次方。 |
| 15 | log() 返回参数的自然数底数的对数值。 |
| 16 | pow() 返回第一个参数的第二个参数次方。 |
| 17 | sqrt() 求参数的算术平方根。 |
| 18 | sin() 求指定double类型参数的正弦值。 |
| 19 | cos() 求指定double类型参数的余弦值。 |
| 20 | tan() 求指定double类型参数的正切值。 |
| 21 | asin() 求指定double类型参数的反正弦值。 |
| 22 | acos() 求指定double类型参数的反余弦值。 |
| 23 | atan() 求指定double类型参数的反正切值。 |
| 24 | atan2() 将笛卡尔坐标转换为极坐标,并返回极坐标的角度值。 |
| 25 | toDegrees() 将参数转化为角度。 |
| 26 | toRadians() 将角度转换为弧度。 |
| 27 | random() 返回一个随机数。 |
1.xxxValue() 方法
| 类型 | 方法及描述 |
|---|---|
| byte | byteValue() :以 byte 形式返回指定的数值。 |
| abstract double | doubleValue() :以 double 形式返回指定的数值。 |
| abstract float | floatValue() :以 float 形式返回指定的数值。 |
| abstract int | intValue() :以 int 形式返回指定的数值。 |
| abstract long | longValue() :以 long 形式返回指定的数值。 |
| short | shortValue() :以 short 形式返回指定的数值。 |
参数
以上各函数不接受任何的参数。
返回值
转换为 xxx 类型后该对象表示的数值。
实例
public class Test{
public static void main(String args[]){
Integer x = 5;
// 返回 byte 原生数据类型
System.out.println( x.byteValue() );
// 返回 double 原生数据类型
System.out.println(x.doubleValue());
// 返回 long 原生数据类型
System.out.println( x.longValue() );
}
}
2.equals()
equals() 方法用于判断 Number 对象与方法的参数进是否相等。
语法
public boolean equals(Object o)
参数
o -- 任何对象。
返回值
如 Number 对象不为 Null,且与方法的参数类型与数值都相等返回 True,否则返回 False。
Double 和 Float 对象还有一些额外的条件
实例
public class Test{
public static void main(String args[]){
Integer x = 5;
Integer y = 10;
Integer z =5;
Short a = 5;
System.out.println(x.equals(y));
System.out.println(x.equals(z));
System.out.println(x.equals(a));
}
}
编译以上程序,输出结果为:
false
true
false
3.toString() 方法
toString() 方法用于返回以一个字符串表示的 Number 对象值。
如果方法使用了原生的数据类型作为参数,返回原生数据类型的 String 对象值。
如果方法有两个参数, 返回用第二个参数指定基数表示的第一个参数的字符串表示形式。
语法
以 String 类为例,该方法有以下几种语法格式:
String toString()
static String toString(int i)
参数
- i -- 要转换的整数。
返回值
- toString(): 返回表示 Integer 值的 String 对象。
- toString(int i): 返回表示指定 int 的 String 对象。
实例
public class Test{
public static void main(String args[]){
Integer x = 5;
System.out.println(x.toString());
System.out.println(Integer.toString(12));
}
}
编译以上程序,输出结果为:
5
12
4.parseInt() 方法
parseInt() 方法用于将字符串参数作为有符号的十进制整数进行解析。
如果方法有两个参数, 使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
语法
所有 Number 派生类 parseInt 方法格式类似如下:
static int parseInt(String s)
static int parseInt(String s, int radix)
参数
- s -- 十进制表示的字符串。
- radix -- 指定的基数。
返回值
- parseInt(String s): 返回用十进制参数表示的整数值。
- parseInt(int i): 使用指定基数的字符串参数表示的整数 (基数可以是 10, 2, 8, 或 16 等进制数) 。
实例
public class Test{
public static void main(String args[]){
int x =Integer.parseInt("9");
double c = Double.parseDouble("5");
int b = Integer.parseInt("444",16);
System.out.println(x);
System.out.println(c);
System.out.println(b);
}
}
编译以上程序,输出结果为:
9
5.0
1092
5. pow()
pow() 方法用于返回第一个参数的第二个参数次方。
语法
double pow(double base, double exponent)
参数
- base -- 任何原生数据类型。
- exponent -- 任何原生数据类型。
返回值
返回第一个参数的第二个参数次方。
实例
public class Test{
public static void main(String args[]){
double x = 11.635;
double y = 2.76;
System.out.printf("e 的值为 %.4f%n", Math.E);
System.out.printf("pow(%.3f, %.3f) 为 %.3f%n", x, y, Math.pow(x, y));
}
}
编译以上程序,输出结果为:
e 的值为 2.7183
pow(11.635, 2.760) 为 874.008
6.random() 方法
random() 方法用于返回一个随机数,随机数范围为 0.0 =< Math.random < 1.0。
语法
static double random()
参数
- 这是一个默认方法,不接受任何参数。
返回值
该方法返回 double 值。
实例
public class Test{
public static void main(String args[]){
System.out.println( Math.random() );
System.out.println( Math.random() );
}
}
编译以上程序,输出结果为:
0.5444085967267008
0.7960235983184115
小题练习
题目:
设置一个长度为10的数组,
* 1.值为两位数的随机数
* 2. 值各不相同
public class RandomTest {
/*
* 设置一个长度为10的数组,
* 1.值为两位数的随机数
* 2. 值各不相同
*
* 解析:2位数 10-99 :(int)Math.random()*(99-10+1)+10;
* rondom是浮点型,需要强制转换
* */
public static void randomArr() {
//定义数组
int[] arr = new int[10];
//赋值
for (int i = 0; i < arr.length; i++) {
int a=0;
boolean flag = true;
//生成一个之前没有出现的随机数
while (flag){
//生成随机数
a = (int)(Math.random()*(99-10+1))+10;
flag = false;//默认当前随机数还没出现过
for (int j = 0; j < i; j++) {
if (arr[j] ==a ) {
flag = true;//已经存在则继续while循环
System.out.println(a + "已经存在,i= =" +i);
}
}
}
arr[i] = a;
}
//遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(i+" =="+ arr[i]);
}
}
public static void main( String [] args) {
randomArr();
}
}
七、Character
Character类提供了一系列方法来操纵字符。你可以使用Character的构造方法创建一个Character类对象,例如
Character ch = new Character('a');
在某些情况下,Java编译器会自动创建一个Character对象。
例如,将一个char类型的参数传递给需要一个Character类型参数的方法时,那么编译器会自动地将char类型参数转换为Character对象。 这种特征称为装箱,反过来称为拆箱。
// 原始字符 'a' 装箱到 Character 对象 ch 中
Character ch = 'a';
// 原始字符 'x' 用 test 方法装箱
// 返回拆箱的值到 'c'
char c = test('x');
方法
下面是Character类的方法:
| 序号 | 方法与描述 |
|---|---|
| 1 | isLetter() 是否是一个字母 |
| 2 | isDigit() 是否是一个数字字符 |
| 3 | isWhitespace() 是否是一个空白字符 |
| 4 | isUpperCase() 是否是大写字母 |
| 5 | isLowerCase() 是否是小写字母 |
| 6 | toUpperCase() 指定字母的大写形式 |
| 7 | toLowerCase() 指定字母的小写形式 |
| 8 | toString() 返回字符的字符串形式,字符串的长度仅为1 |
八、String
8.1 创建格式化字符串
我们知道输出格式化数字可以使用 printf() 和 format() 方法。
String 类使用静态方法 format() 返回一个String 对象而不是 PrintStream 对象。
String 类的静态方法 format() 能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出。
System.out.printf("浮点型变量的值为 " +
"%f, 整型变量的值为 " +
" %d, 字符串变量的值为 " +
"is %s", floatVar, intVar, stringVar);
你也可以这样写
String fs;
fs = String.format("浮点型变量的值为" +
"%f, 整形变量的类型为" +
"%d,字符串变量的值为" +
"%s", f, i, str);
System.out.println(fs);
运行结果:
浮点型变量的值为8.800000, 整形变量的类型为8,字符串变量的值为一条新的字符串
8.2 String 方法
特点:不可变性
代表不可变的字符序列
体现:1、当对字符串重新赋值时,进行连接操作时,使用replace等方法修改字符串值时,字符串都会重新创建开辟地址,变成另外一个变量,保留原来的地址。
public class stringTest {
public static void main(String[] arg) {
String s1 = "123";
String s2 = "abc";
String s3 = "123abc";
String s4 = "123" + "abc";//都在常量池
String s5 = s1 + "abc";//s5:常量池 s1 在堆中,“abc”在常量池,(s1+"abc")结果在堆中
String s6 = s1 + s2;
System.out.println(s3 == s4);//true
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s4 == s5);//false
System.out.println(s4 == s6);//false
String s8 = s5.intern();//intern() 将变量存储到常量池
System.out.println(s8 == s3);//true
/*
* 说明:String s1定义变量时,变量存储在常量池中,而字符串拼接时调用变量的变量在堆中
*
*
* */
}
}
String 面试题
public class StringTest2 {
String str = new String("good");
char[] ch = {'t', 'e', 's', 't'};
public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'b';
}
public static void main(String[] args) {
StringTest2 ex = new StringTest2();
ex.change(ex.str, ex.ch);
System.out.println(ex.str);//good
System.out.println(ex.ch);//best
}
/*
* str 传递进去修改值,但因为String不变性,修改后的值为开辟新地址,原来的str地址对应变量不变
* ch[]是数组,变量在堆中 调用change方法,ch[0]改变了
* */
}
下面是 String 类支持的方法
| SN(序号) | 方法描述 |
|---|---|
| 1 | char charAt(int index) 返回指定索引处的 char 值。 |
| 2 | int compareTo(Object o) 把这个字符串和另一个对象比较。 |
| 3 | int compareTo(String anotherString) 按字典顺序比较两个字符串。 |
| 4 | int compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。 |
| 5 | String concat(String str) 将指定字符串连接到此字符串的结尾。 |
| 6 | boolean contentEquals(StringBuffer sb) 当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真。 |
| 7 | [static String copyValueOf(char] data) 返回指定数组中表示该字符序列的 String。 |
| 8 | [static String copyValueOf(char] data, int offset, int count) 返回指定数组中表示该字符序列的 String。 |
| 9 | boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 |
| 10 | boolean equals(Object anObject) 将此字符串与指定的对象比较。 |
| 11 | boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写。 |
| 12 | [byte] getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
| 13 | [byte] getBytes(String charsetName) 使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
| 14 | [void getChars(int srcBegin, int srcEnd, char] dst, int dstBegin) 将字符从此字符串复制到目标字符数组。 |
| 15 | int hashCode() 返回此字符串的哈希码。 |
| 16 | int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 |
| 17 | int indexOf(int ch, int fromIndex) 返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。 |
| 18 | int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引。 |
| 19 | int indexOf(String str, int fromIndex) 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。 |
| 20 | String intern() 返回字符串对象的规范化表示形式。 |
| 21 | int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。 |
| 22 | int lastIndexOf(int ch, int fromIndex) 返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。 |
| 23 | int lastIndexOf(String str) 返回指定子字符串在此字符串中最右边出现处的索引。 |
| 24 | int lastIndexOf(String str, int fromIndex) 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。 |
| 25 | int length() 返回此字符串的长度。 |
| 26 | boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。 |
| 27 | boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) 测试两个字符串区域是否相等。 |
| 28 | boolean regionMatches(int toffset, String other, int ooffset, int len) 测试两个字符串区域是否相等。 |
| 29 | String replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 |
| 30 | String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 |
| 31 | String replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。 |
| 32 | [String] split(String regex) 根据给定正则表达式的匹配拆分此字符串。 |
| 33 | [String] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串。 |
| 34 | boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开始。 |
| 35 | boolean startsWith(String prefix, int toffset) 测试此字符串从指定索引开始的子字符串是否以指定前缀开始。 |
| 36 | CharSequence subSequence(int beginIndex, int endIndex) 返回一个新的字符序列,它是此序列的一个子序列。 |
| 37 | String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。 |
| 38 | String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。 |
| 39 | [char] toCharArray() 将此字符串转换为一个新的字符数组。 |
| 40 | String toLowerCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为小写。 |
| 41 | String toLowerCase(Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为小写。 |
| 42 | String toString() 返回此对象本身(它已经是一个字符串!)。 |
| 43 | String toUpperCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。 |
| 44 | String toUpperCase(Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为大写。 |
| 45 | String trim() 返回字符串的副本,忽略前导空白和尾部空白。 |
| 46 | static String valueOf(primitive data type x) 返回给定data type类型x参数的字符串表示形式。 |
| 47 | contains(CharSequence chars) 判断是否包含指定的字符系列。 |
| 48 | isEmpty() 判断字符串是否为空。 |
subSequence()
CharSequence subSequence(int beginIndex, int endIndex)
public CharSequence subSequence(int beginIndex, int endIndex)
返回一个新的字符序列,它是此序列的一个子序列。
public class Test {
public static void main(String args[]) {
String Str = new String("www.runoob.com");
System.out.print("返回值 :" );
System.out.println(Str.subSequence(4, 10) );
}
}
8.3 String 与 char[ ] 转化
字符串转数组
toCharArray()
toCharArray() 方法将字符串转换为字符数组。
语法
public char[] toCharArray()
参数
- 无
返回值
字符数组。
实例
public class Test {
public static void main(String args[]) {
String Str = new String("www.runoob.com");
System.out.print("返回值 :" );
System.out.println( Str.toCharArray() );
}
}
以上程序执行结果为:
返回值 :www.runoob.com
数组转字符串
char[] ch = new char[]{'h', 'e', 'l', 'l', 'o'};
String str = new String(ch);
System.out.println(str);
8.4 String & byte[]
/*String 与 byte[] 字符串和字节的转换*/
//1.字符串转字节
String str1 = new String("2022 中国");
byte[] bytes = str1.getBytes();
System.out.println(Arrays.toString(bytes));//[50, 48, 50, 50, 32, -28, -72, -83, -27, -101, -67]
//2.字节转字符串
String str2 = new String(bytes);
System.out.println(str2);//2022 中国
九、 StringBuffer
9.1 源码解析
public class StringTest3 {
public static void main(String[] args) {
/*
* 1.String StringBuffer StringBuilder三者异同
* String:不可变的字符序列:底层用char[]存储
* StringBuffer:可变的字符序列,线程安全,底层用char【】存储
* StringBuilder:可变的字符序列,jdk5.0新增的,线程不安全的,底层用char[]存储
*
*
* 问题1:System.out.println(sb2.length());//3
问题2:扩容问题:如果要添加的数据底层数组撑不下,那么需要扩容底层数组,
默认情况下,扩容为原来容量的2倍,并把原来的数据复制到新的数组中
*指导意义:建议开发中运用 StringBuffer(int capacity)
* 或者
* StringBuffer(int capacity)
* 指定容量,减少扩容,提高效率
* */
//源码分析:
String str = new String();//char[] value = new char[0];
String str1 = new String("abe");//char [] value=new char ['a','b','c']
StringBuffer sb1 = new StringBuffer();//char[] value = new char[16]; 底层创建了一个长度为16的字符串数组
System.out.println(sb1.length());//0 :length长度为值的长度
sb1.append('a');//value[0] = 'a'
sb1.append('b');//value[1] = 'b'
System.out.println(sb1);
StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length]
}
}
9.2 StringBuffer 方法
以下是 StringBuffer 类支持的主要方法:
| 序号 | 方法描述 |
|---|---|
| 1 | public StringBuffer append(String s) 将指定的字符串追加到此字符序列。 |
| 2 | public StringBuffer reverse() 将此字符序列用其反转形式取代。 |
| 3 | public delete(int start, int end) 移除此序列的子字符串中的字符。 |
| 4 | public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。 |
| 5 | insert(int offset, String str) 将 str 参数的字符串插入此序列中。 |
| 6 | replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。 |
| 序号 | 方法描述 |
|---|---|
| 1 | int capacity() 返回当前容量。 |
| 2 | char charAt(int index) 返回此序列中指定索引处的 char 值。 |
| 3 | void ensureCapacity(int minimumCapacity) 确保容量至少等于指定的最小值。 |
| 4 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将字符从此序列复制到目标字符数组 dst。 |
| 5 | int indexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引。 |
| 6 | int indexOf(String str, int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。 |
| 7 | int lastIndexOf(String str) 返回最右边出现的指定子字符串在此字符串中的索引。 |
| 8 | int lastIndexOf(String str, int fromIndex) 返回 String 对象中子字符串最后出现的位置。 |
| 9 | int length() 返回长度(字符数)。 |
| 10 | void setCharAt(int index, char ch) 将给定索引处的字符设置为 ch。 |
| 11 | void setLength(int newLength) 设置字符序列的长度。 |
| 12 | CharSequence subSequence(int start, int end) 返回一个新的字符序列,该字符序列是此序列的子序列。 |
| 13 | String substring(int start) 返回一个新的 String,它包含此字符序列当前所包含的字符子序列。 |
| 14 | String substring(int start, int end) 返回一个新的 String,它包含此序列当前所包含的字符子序列。 |
| 15 | String toString() 返回此序列中数据的字符串表示形式。 |
实例
/*
stringbuffer方法
insert(int offset, String str)
replace(int start, int end, String str)
void setCharAt(int index, char ch)
*/
public static void test2() {
StringBuffer sb1 = new StringBuffer("abc");
sb1.append('d');
sb1.reverse();
sb1.delete(0, 1);//删除0,不删除1 【左闭右开】
sb1.insert(1, 2);//c2ba
sb1.replace(0, 1, "替换01");//替换012ba
sb1.setCharAt(6,'7');//第二个参数是char,只能是一个字符
System.out.println(sb1);
}
十、数组
一维数组
1.声明变量
double[] myList; // 首选的方法
或
double myList[]; // 效果相同,但不是首选方法
//2.定义
double[] myList = new double[size];
//3.填充fill
import static java.util.Arrays.fill;//导包
fill(myList, 8);//填充
//4.遍历-forEach
for (double ele : myList) {
System.out.println(ele);
}
方法
java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。
具有以下功能:
- 给数组赋值:通过 fill 方法。
- 对数组排序:通过 sort 方法,按升序。
- 比较数组:通过 equals 方法比较数组中元素值是否相等。
- 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。
//方式一
int[] myList = new int[3];
fill(myList, 8);
//方式二
int myList2[] = new int[3];
Arrays.fill(myList2, 8);
System.out.println(Arrays.equals(myList,myList2));
System.out.println(Arrays.binarySearch(myList,8));
二维数组
二维数组底层是一维数组,只是一维数组的每一个值也是一个一维数组。
//1.声明变量
//方式一:
type[][] typeName = new type[typeLength1][typeLength2];
//实例
int[][] a = new int[2][3];
//方式二:从最高维开始,分别为每一维分配空间
String[][] s = new String[2][];
s[0] = new String[2];
s[1] = new String[3];
s[0][0] = new String("Good");
s[0][1] = new String("Luck");
s[1][0] = new String("to");
s[1][1] = new String("you");
s[1][2] = new String("!");
//方式三:
int[][] i2 = new int[][]{{1, 2, 3}, {3, 4, 5}};
//获取长度
System.out.println(i2.length);//2
System.out.println(i2[0].length);//3
//默认值
/*
外层元素的初始值为地址值,内层元素的初始值和一维数组的初始值一样
*/
int [][] i1 = new int[2][2];
System.out.println("--------------------");
System.out.println(i1[0]);//[I@1d44bcfa 地址值
System.out.println(i1[0][0]);//0
应用
二维数组打印杨辉三角形
public class yanghuiTest {
/*
输出十行杨辉三角形
*/
public static void yh() {
//定义二维数组
int[][] yh = new int[10][];
//赋初始值
for (int i = 0; i < yh.length; i++) {
yh[i] = new int[i+1];
yh[i][0] =yh[i][i] = 1;
}
//方式一:效率比2高
for (int i = 0; i < yh.length; i++) {
if (i > 1) {
for (int j = 1; j < yh[i].length-1; j++) {
yh[i][j] = yh[i - 1][j - 1] + yh[i - 1][j];
}
}
}
// //方式二:
// for (int i = 0; i < yh.length; i++) {
// for (int j = 0; j < yh[i].length; j++) {
// if (i > 0 && j>0 && j<i) {
// yh[i][j] = yh[i - 1][j - 1] + yh[i - 1][j];
// }
// }
// }
//遍历
for (int i = 0; i < yh.length; i++) {
System.out.println();
for (int j = 0; j < yh[i].length; j++) {
System.out.print(yh[i][j] +" ");
}
}
}
public static void main(String[] args) {
yh();
}
}
十一、正则表达式
import java.util.regex.*;
| 字符 | 说明 |
|---|---|
| \ | 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如, n匹配字符 n。\n 匹配换行符。序列 \\ 匹配 \ ,\( 匹配 (。 |
| ^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。 |
| $ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。 |
| * | 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。 |
| + | 一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。 |
| ? | 零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。 |
| {n} | n 是非负整数。正好匹配 n 次。例如,"o{2}"与"Bob"中的"o"不匹配,但与"food"中的两个"o"匹配。 |
| {n,} | n 是非负整数。至少匹配 n 次。例如,"o{2,}"不匹配"Bob"中的"o",而匹配"foooood"中的所有 o。"o{1,}"等效于"o+"。"o{0,}"等效于"o*"。 |
| {n,m} | m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。 |
| ? | 当此字符紧随任何其他限定符(、+、?、{n}、{n,}、{n,m*})之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配所有"o"。 |
| . | 匹配除"\r\n"之外的任何单个字符。若要匹配包括"\r\n"在内的任意字符,请使用诸如"[\s\S]"之类的模式。 |
| (pattern) | 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果"匹配"集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用"("或者")"。 |
| (?:pattern) | 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符 (|) 组合模式部件的情况很有用。例如,'industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。 |
| (?=pattern) | 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 |
| (?!pattern) | 执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows",但不匹配"Windows 2000"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 |
| x|y | 匹配 x 或 y。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"。 |
| [xyz] | 字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。 |
| [^xyz] | 反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。 |
| [a-z] | 字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。 |
| [^a-z] | 反向范围字符。匹配不在指定的范围内的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"范围内的任何字符。 |
| \b | 匹配一个字边界,即字与空格间的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。 |
| \B | 非字边界匹配。"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。 |
| \cx | 匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是"c"字符本身。 |
| \d | 数字字符匹配。等效于 [0-9]。 |
| \D | 非数字字符匹配。等效于 [^0-9]。 |
| \f | 换页符匹配。等效于 \x0c 和 \cL。 |
| \n | 换行符匹配。等效于 \x0a 和 \cJ。 |
| \r | 匹配一个回车符。等效于 \x0d 和 \cM。 |
| \s | 匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。 |
| \S | 匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。 |
| \t | 制表符匹配。与 \x09 和 \cI 等效。 |
| \v | 垂直制表符匹配。与 \x0b 和 \cK 等效。 |
| \w | 匹配任何字类字符,包括下划线。与"[A-Za-z0-9_]"等效。 |
| \W | 与任何非单词字符匹配。与"[^A-Za-z0-9_]"等效。 |
| \xn | 匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,"\x41"匹配"A"。"\x041"与"\x04"&"1"等效。允许在正则表达式中使用 ASCII 代码。 |
| *num* | 匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)\1"匹配两个连续的相同字符。 |
| *n* | 标识一个八进制转义码或反向引用。如果 *n* 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。 |
| *nm* | 标识一个八进制转义码或反向引用。如果 *nm* 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 *nm* 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。如果两种前面的情况都不存在,则 *nm* 匹配八进制值 nm,其中 n 和 m 是八进制数字 (0-7)。 |
| \nml | 当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。 |
| \un | 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。 |
十二、日期时间
Date类、SimpleDateFormat、Calendar
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Calendar;
import java.util.Date;
public class DateTest {
/**
* java.util.Date
* ---java.sql.Date
* 1.两个构造器的使用
*
* 2.两个方法的的使用
* >toString() 显示当前年月日 时分秒
* >.getTime() :获取当前时间戳
*
* 3.java.sql.Date对应数据库中的日期类型
* >如何实例化
* >如果将java.utl.date => java.sql.date
*
*
* System.currentTimeMillis( ) //获取当前时间戳
*/
public static void test01() {
//构造器一;Date()
Date d1 = new Date();
System.out.println(d1.toString());//Wed Mar 09 14:42:26 CST 2022
System.out.println(d1.getTime());//1646808214378
//构造器二:创建指定毫秒数的date对象
Date d2 = new Date(1646808214378l);
System.out.println(d2.toString());//Wed Mar 09 14:43:34 CST 2022
//创建java.sql.date
java.sql.Date d3 = new java.sql.Date(1646808214378l);
System.out.println(d3);//2022-03-09
//如果将java.utl.date => java.sql.date
Date d4 = new Date();
java.sql.Date d5 = new java.sql.Date(d4.getTime());
System.out.println(d5);//2022-03-09
//获取当前时间戳
System.out.println(System.currentTimeMillis());//1646810560389
}
/**
* 使用 SimpleDateFormat
* >格式化日期 时间=>字符串
* >解析字符串 字符串=>时间
*
* @param
*/
public static void simpleDateFormatTest() throws ParseException {
//>格式化日期 时间=>字符串
Date date1 = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
System.out.println(df.format(date1.getTime()));
//解析字符串 字符串=>时间
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd");
Date date2,date3;
try {
date2= ft.parse("1818-11-11");
System.out.println(date2);
}catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
date3= ft.parse("1818-11-11 上午11:33");//不抛出异常会报红
System.out.println(date3);
}
/**
* Calendar 日历类
* 1.抽象类,不能直接实例化,可以调用子类方法
*
* @param
* @throws ParseException
*/
public static void calendarTest() {
//实例化
//方式一:创建子类GregorianCanlenar对象
//方式二:调用子类静态方法
Calendar c = Calendar.getInstance();//默认是当前日期
//常用方法
//get()
System.out.println(c.get(Calendar.YEAR));
System.out.println(c.get(Calendar.MONTH));
System.out.println(c.get(Calendar.DATE));
System.out.println(c.get(Calendar.HOUR_OF_DAY));
System.out.println(c.get(Calendar.DAY_OF_WEEK));
System.out.println("--------------------------");
//set() 设置时间
c.set(Calendar.YEAR, Calendar.MONTH, 6);
System.out.println(c.get(Calendar.DATE));
//add() 添加时间
c.add(Calendar.DATE, +10);//时间+100
System.out.println(c.get(Calendar.DATE));
//Date getTime() //获取日历当前时间。日历类=> Date类
Date d = c.getTime();
System.out.println(d);//Wed Mar 16 15:56:28 CST 1
//setTime() date => 日历类
Date d1 = new Date();
c.setTime(d1);
int days = c.get(Calendar.DAY_OF_YEAR);
System.out.println(days);
}
/**
* LocalDate
* LocalTime:使用频率最高
* LocalDateTime
*/
public static void localTimeTest() {
//1、获取当前时间
LocalDate localdate = LocalDate.now();//2022-03-09
LocalTime localTime = LocalTime.now();//16:22:08.881
LocalDateTime localDateTime = LocalDateTime.now();//2022-03-09T16:22:08.881
System.out.println(localdate);
System.out.println(localTime);
System.out.println(localDateTime);
//2.设置指定的年月日 时分秒,【没有偏移量】
LocalDate localDate2 = LocalDate.of(2022, 8, 17);
System.out.println(localDate2);//2022-08-17
//3.getXXX()
System.out.println(localdate.getDayOfMonth());//9
System.out.println(localdate.getDayOfWeek());//WEDNESDAY
System.out.println(localdate.getDayOfYear());//68
System.out.println(localdate.getYear());//2022
//4.修改值 :原来值不变
LocalDate l = localdate.withDayOfMonth(13);
System.out.println(l);//2022-03-13
System.out.println(localdate);//2022-03-09
//5、 add加减
LocalDate l2 = localdate.plusMonths(1);
LocalDate l3 = localdate.minusDays(1);
}
public static void main(String[] args) throws ParseException {
// test01();
// simpleDateFormatTest();
// calendarTest();
localTimeTest();
}
}
Date类特点(jdk8):
偏移量 : Date中的年份从1900年开始,月份从0开始。所以年份+1900,月份+1,才能表示需要的时间
Java Number类
浙公网安备 33010602011771号