java中常用的包
java.lang包:基础包不需要引入,每一个类自动添加
java.util包:工具Arrays、List、Map,用的时候需要引入
java.sql包:java操作数据库的类,Connection
java.io包:操作文件,输入输出流
引用格式:import 包名.类;
一、String类、StringBuffer类和StringBuilder类
String类
- 不可变性:
String
类是不可变的,一旦创建了String
对象,其值就不能被改变。任何修改String
内容的操作实际上都是创建一个新的String
对象。 - 线程安全:由于不可变性,
String
是线程安全的,可以在多线程环境中共享。 - 适用场景:当字符串的值不会改变时,如数据库的连接字符串、文件路径等固定不变的值时,使用
String
是合适的选择。
1. 初始化方式
使用字符串常量直接初始化一个String对象:
String 变量名= 字符串;
String str1 = null; // 初始化为空
String str2 = ""; // 初始化为空字符串
String str3 = "abc"; // 初始化为abc,其中abc为字符串常量
使用String的构造方法初始化字符串对象
String 变量名 = new String(字符串)
2. String类中常用的方法
方法声明 | 功能描述 |
---|---|
String() | 创建一个内容为空的字符串 |
String(String value) | 根据指定的字符串内容创建对象 |
String(char[] value) | 根据指定的字符数组创建对象 |
int indexOf(int ch) | 返回指定字符在此字符串中第一次出现处的索引 |
int lastIndexOf(int ch) | 返回指定字符在此字符串中最后一次出现处的索引 |
int indexOf(String str) | 返回指定子字符串在此字符串中第一次出现处的索引 |
int lastIndexOf(String str) | 返回指定子字符串在此字符串中最后一次出现处的索引 |
char charAt(int index) | 返回字符串中index位置上的字符,其中index的取值范围是:0~(字 符串长度-1) |
boolean endsWith(String suffix) | 判断此字符串是否以指定的字符串结尾 |
int length() | 返回此字符串的长度 |
boolean equals(Object anObject) | 将此字符串与指定的字符串比较 |
boolean isEmpty() | 当且仅当字符串长度为0时返回true |
boolean startsWith(String prefix) | 判断此字符串是否以指定的字符串开始 |
boolean contains(CharSequence cs) | 判断此字符串中是否包含指定的字符序列 |
String toLowerCase() | 使用默认语言环境的规则将String中的所有字符都转换为小写 |
String toUpperCase() | 使用默认语言环境的规则将String中的所有字符都转换为大写 |
static String valueOf(int i) | 返回 int 参数的字符串表示形式 |
char[] toCharArray() | 将此字符串转换为一个字符数组 |
String replace(CharSequence oldstr, CharSequence newstr) | 返回一个新的字符串,它是通过用newstr替换此字符串中出现的所 有oldstr得到的 |
String[] split(String regex) | 根据参数regex(regex是一个正则表达式,用来限定分隔规则)将字 符串分割为若干个子字符串 |
String substring(int beginIndex) | 返回一个新字符串,它包含从指定的beginIndex起始角标处开始,直 到此字符串末尾的所有字符 |
String substring(int beginIndex, int endIndex) | 返回一个新字符串,它包含从指定的beginIndex起始角标处开始,直 到索引endIndex-1角标处的所有字符 |
String trim() | 返回一个新字符串,它去除了原字符串首尾的空格 |
StringBuffer类
- 可变性:
StringBuffer
是可变的,可以通过方法修改其内容而不创建新的对象。 - 线程安全:
StringBuffer
是线程安全的,内部的操作方法都使用了同步(synchronized)关键字进行线程安全控制,因此适合在多线程环境中使用。 - 性能:由于线程安全的机制,
StringBuffer
操作相对较慢,适合于在多线程环境中频繁修改字符串的场景。
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 直接在原对象上修改,不创建新对象
System.out.println(sb.toString()); // 输出 "Hello World"
String类中常用的方法
方法声明 | 功能描述 |
StringBuffer append(char c) | 添加字符到StringBuffer对象中末尾 |
StringBuffer insert(int offset,String str) | 在StringBuffer对象中的offset位置插入字符串str |
StringBuffer deleteCharAt(int index) | 移除StringBuffer对象中指定位置的字符 |
StringBuffer delete(int start,int end) | 删除StringBuffer对象中指定范围的字符或字符串 |
StringBuffer replace(int start,int end,String s) | 将StringBuffer对象中指定范围的字符或字符串用新的字符串s进 行替换 |
void setCharAt(int index, char ch) | 修改指定位置index处的字符 |
String toString() | 返回StringBuffer缓冲区中的字符串对象 |
StringBuffer reverse() | 将此StringBuffer对象用其反转形式取代 |
StringBuilder类
- 可变性:
StringBuilder
也是可变的,与StringBuffer
类似,但不保证线程安全。 - 性能:由于没有线程安全的开销,
StringBuilder
比StringBuffer
更快,适合在单线程环境下使用,特别是需要频繁进行字符串操作的场景。 - 适用场景:通常在单线程的情况下,需要高效地进行字符串操作时,使用
StringBuilder
更为合适。
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 直接在原对象上修改,不创建新对象
System.out.println(sb.toString()); // 输出 "Hello World"
StringBuffer与StringBuilder的区别
二者所不同的是StringBuffer是线程安全的,而StringBuilder没有实现 线程安全功能,所以性能略高。通常情况下,如果创建一个内容可变的字符串对 象,应该优先考虑StringBuilder类。
二、System类和Runtime类
System类
System类定义了一些与系统相关的属性和方法,它所提供的属性和方法都 是静态的,因此,想要引用这些属性和方法,直接使用System类调用即可。
System类的常用方法
方法声明 | 功能描述 |
static void exit(int status) | 该方法用于终止当前正在运行的Java虚拟机,其中参数status表 示状态码,若状态码非0 ,则表示异常终止 |
static void gc() | 运行垃圾回收器,并对垃圾进行回收 |
static native long currentTimeMillis() | 返回以毫秒为单位的当前时间 |
static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length) | 从src引用的指定源数组复制到dest引用的数组,复制从指定的 位置开始,到目标数组的指定位置结束 |
static Properties getProperties() | 取得当前的系统属性 |
static String getProperty(String key) | 获取指定键描述的系统属性 |
Runtime类
定义:Runtime类用于表示Java虚拟机运行时的状态,它用于封装Java虚拟机进程。
说明:每次使用“java”命令启动Java虚拟机时都会对应一个Runtime实例,并 且只有一个实例,应用程序会通过该实例与其运行时的环境相连。
获取Runtime实例方式:
Runtime run = Runtime.getRuntime()
注意:Runtime类中提供了一个exec()方法,该方法用于执行一个DOS命令,从 而实现和在命令行窗口中输入DOS命令同样的效果。
三、Math类与Random类
Math类
1. Math类是一个工具类,主要用于完成复杂的数学运算,如求绝对值、三角函 数、指数运算等。
2. 由于Math类的构造方法被定义成private,因此无法创建Math类的对象。
3. Math类中的所有方法都是静态方法,可以直接通过类名来调用它们。
4. 除静态方法外,Math类中还有两个静态常量PI和E,分别代表数学中的π和e。
Random类
在JDK的java.util包中,有一个Random类,它可以在指定的取值范围内随机产生数字。
Random类的两个构造方法
方法声明 | 功能描述 |
Random() | 构造方法,用于创建一个随机数生成器,每次实例化Random对象会生成 不同的随机数 |
Random(long seed) | 构造方法,使用一个long型的seed(种子)创建伪随机数生成器,当seed 相同时,每次实例化Random对象会生成相同的随机数 |
Random类的常用方法
方法声明 | 功能描述 |
boolean nextBoolean() | 随机生成boolean类型的随机数 |
double nextDouble() | 随机生成double类型的随机数 |
float nextFloat() | 随机生成float类型的随机数 |
int nextInt() | 随机生成int类型的随机数 |
int nextInt(int n) | 随机生成[0,n)之间int类型的随机数 |
long nextLong() | 随机生成long类型的随机数 |
四、日期与时间类
Date类
1. 在JDK的java.util包中,提供了一个Date类用于表示日期和时间。
2. 随着JDK版本的不断升级和发展,Date类中大部分的构造方法和普通方法都 已经不再推荐使用。
3. 目前JDK 8中,Date类只有两个构造方法是可以使用的。
4. Date():用来创建当前日期时间的Date对象。
5. Date(long date):用于创建指定时间的Date对象,其中date参数表示1970年1 月1日0时0分0(称为历元)以来的毫秒数,即时间戳。
Calendar类
1. Calendar类用于完成日期和时间字段的操作,它可以通过特定的方法设置和 读取日期的特定部分,比如年、月、日、时、分和秒等。
2. Calendar类是一个抽象类,不可以被实例化。
3. 在程序中需要调用其静态方法getInstance()来得到一个Calendar对象,然后才 能调用其相应的方法。
Calendar类常用方法
方法声明 | 功能描述 |
int get(int field) | 返回指定日历字段的值 |
void add(int field,int amount) | 根据日历规则,为指定的日历字段增加或减去指定的时间量 |
void set(int field,int value) | 为指定日历字段设置指定值 |
void set(int year,int month,int date) | 设置Calendar对象的年、月、日三个字段的值 |
void set(int year.int month,int date,int hourOfDay,int minute,int second) | 设置Calendar对象的年、月、日、时、分、秒六个字段的值 |
JDK 8新增日期与时间类
类名 | 功能描述 |
Clock | 用于获取指定时区的当前日期、时间 |
DayOfWeek | 枚举类,定义了一周七天周一到周日的枚举值 |
Duration | 表示持续时间,该类提供的ofXxx()方法用于获取指定的时间的小时、分钟、秒数等 |
Instant | 表示一个具体时刻,可以精确到纳秒。该类提供了静态的now()方法来获取当前时刻, 提供了静态的now(Clock clock)方法来获取clock对应的时刻。同时还提供了一系列的 plusXxx()方法来获取当前时刻基础上加上一段时间,以及一系列的minusXxx()方法在 当前时刻基础上减去一段时间 |
LocalDate | 表示不带时区的日期,如2018-01-27。该类提供了静态的now()方法来获取当前日期, 提供了静态的now(Clock clock)方法来获取clock对应的日期。同时还提供了一系列的 plusXxx()方法在当前年份基础上加上几年、几月、几日等,以及一系列的minusXxx() 方法在当前年份基础上减去几年、几月、几日等 |
LocalTime | 表示不带时区的时间,如14:49:20。该类提供了静态的now()方法来获取当前时间,提 供了静态的now(Clock clock)方法来获取clock对应的时间。同时还提供了一系列的 plusXxx()方法在当前年份基础上加上几小时 、几分、几秒等,以及一系列的 minusXxx()方法在当前年份基础上减去几小时、几分、几秒等 |
LocalDateTime | 表示不带时区的日期、时间。该类提供了静态的now()方法来获取当前日期、时间,提 供了静态的now(Clock clock)方法来获取clock对应的日期、时间。同时还提供了一系列 的plusXxx()方法在当前年份基础上加上几年、几月、几日、几小时、几分、几秒等, 以及一系列的minusXxx()方法在当前年份基础上减去几年、几月、几日、几小时、几 分、几秒等 |
Month | 枚举类,定义了一月到十二月的枚举值 |
MonthDay | 表示月日,如--01-27。该类提供了静态的now()方法来获取当前月日,提供了静态的 now(Clock clock)方法来获取clock对应的月日 |
Year | 表示年,如2018。该类提供了静态的now()方法来获取当前年份,提供了静态的 now(Clock clock)方法来获取clock对应的年份。同时还提供了plusYears()方法在当前年 份基础上增加几年,以及minusYears()方法在当前年份基础上减去几年 |
YearMonth | 表示年月,如2018-01。该类提供了静态的now()方法来获取当前年月,提供了静态的 now(Clock clock)方法来获取clock对应的年月。同时还提供了plusXxx()方法在当前年 月基础上增加几年、几月,以及minusXxx()方法在当前年月基础上减去几年、几月 |
ZoneId | 表示一个时区 |
ZonedDateTime | 表示一个时区化的日期、时间 |
五、包装类
在Java中,包装类(Wrapper classes)是一种将基本数据类型封装为对象的类。Java的基本数据类型(如 int、char、boolean 等)不是对象,因此没有与其相关的方法。为了使基本数据类型具备对象的特性,Java 提供了对应的包装类,每种基本数据类型都有对应的包装类。
基本数据类型和对应的包装类
1. 整型包装类
Byte
:对应byte
Short
:对应short
Integer
:对应int
Long
:对应long
Integer intObj = 42; // 自动装箱:基本类型 int 转换为 Integer 对象
int value = intObj; // 自动拆箱:Integer 对象转换为基本类型 int
2. 浮点型包装类
Float
:对应float
Double
:对应double
Double doubleObj = 3.14; // 自动装箱:基本类型 double 转换为 Double 对象
double value = doubleObj; // 自动拆箱:Double 对象转换为基本类型 double
3. 字符型包装类
Character
:对应char
Character charObj = 'A'; // 自动装箱:基本类型 char 转换为 Character 对象
char value = charObj; // 自动拆箱:Character 对象转换为基本类型 char
4. 布尔型包装类
Boolean
:对应boolean
Boolean boolObj = true; // 自动装箱:基本类型 boolean 转换为 Boolean 对象
boolean value = boolObj; // 自动拆箱:Boolean 对象转换为基本类型 boolean
使用场景和特性
-
自动装箱(Autoboxing)和自动拆箱(Unboxing):Java 提供了自动装箱和自动拆箱的机制,使得基本类型和其对应的包装类之间的转换更加方便。
自动装箱(Autoboxing):是指将基本数据类型的变量赋给对应的包装类变量。
自动拆箱(AutoUnboxing):是指将包装类对象类型直接赋给一个对应的基本 数据类型变量。
-
对象方法:包装类提供了许多方法来处理基本数据类型,比如转换为字符串、比较大小、获取最大值和最小值等操作。
Integer num = 123;
String str = num.toString(); // 将整数转换为字符串
int max = Integer.max(10, 20); // 求两个整数的最大值
- Null 值处理:包装类可以表示为
null
,而基本数据类型不能。这在需要处理对象可能为空的情况下很有用。
Integer num = null; // Integer 可以赋值为 null,表示没有数值
int value = num; // 编译时自动拆箱,但在运行时可能抛出 NullPointerException
基本数据类型、基本数据包装类以及字符串之间的相互转换
1. 基本数据类型转换为字符串
使用 String 类的 valueOf 方法
int intValue = 42;
String str1 = String.valueOf(intValue); // 将 int 转换为 String
使用基本数据类型的字符串连接操作
double doubleValue = 3.14;
String str2 = "" + doubleValue; // 将 double 转换为 String
使用包装类的 toString 方法
boolean boolValue = true;
String str3 = Boolean.toString(boolValue); // 将 boolean 转换为 String
2. 字符串转换为基本数据类型
使用包装类的 parseXXX 静态方法
String str = "123";
int intValue = Integer.parseInt(str); // 将 String 转换为 int
double doubleValue = Double.parseDouble(str); // 将 String 转换为 double
使用包装类的 valueOf 方法(返回包装类对象)
String str = "true";
boolean boolValue = Boolean.valueOf(str); // 将 String 转换为 boolean
3. 基本数据包装类转换为字符串
使用 toString 方法
Integer integerObj = 42;
String str1 = integerObj.toString(); // 将 Integer 对象转换为 String
注意事项:
- 当字符串无法正确转换为目标基本数据类型时(例如,包含非数字字符的字符串转换为 int),会抛出
NumberFormatException
异常。 - 包装类的 toString 方法和 String 类的 valueOf 方法在功能上是等效的,都可以将基本数据类型或包装类转换为字符串。