一、Object类
在Java中,Object类是所有类的超类,因此所有的类都继承了Object类的方法。以下是Object类的一些常用方法:
-
toString():返回对象的字符串表示形式。默认的实现可能不会提供太多信息,因此许多类都重写了这个方法以提供更有用的信息。
Object obj = new Object(); System.out.println(obj.toString()); // 输出: java.lang.Object@15db9742
-
equals(Object obj):比较当前对象与另一个对象是否相等。默认实现是比较对象的引用,但很多类都重写了这个方法以比较对象的实际内容。
Object obj1 = new Object(); Object obj2 = new Object(); System.out.println(obj1.equals(obj2)); // 输出: false
-
hashCode():返回对象的哈希码,通常用于散列数据结构,如HashSet和HashMap。默认实现是基于对象的内存地址,但很多类都重写了这个方法以提供基于对象内容的哈希码。
Object obj = new Object(); System.out.println(obj.hashCode()); // 输出: 一个整数
-
clone():创建并返回此对象的一个副本。默认实现是浅拷贝,但可以通过实现Cloneable接口并重写clone()方法来实现深拷贝。
Object obj = new Object(); Object cloneObj = obj.clone(); // 浅拷贝
-
getClass():返回对象的运行时类。
Object obj = new Object(); System.out.println(obj.getClass()); // 输出: class java.lang.Object
- notify(), notifyAll(), wait():这些方法用于多线程编程中的对象等待/通知机制。一个线程可以在某个对象上等待(通过调用
wait()
),其他线程可以通知(通过调用notify()
或notifyAll()
)这个等待的线程继续执行。
以上就是Java中Object类的一些常用方法。需要注意的是,由于Object类是所有类的超类,因此所有的类都继承了这些方法,可以根据实际需要选择是否重写这些方法。
二、包装类
Java中的包装类是指Java的基本数据类型(如int、char、boolean等)的包装类。这些包装类都是Java标准库中的一部分,提供了基本数据类型与对象之间的转换。Java中的包装类包括:
- Integer:用于包装int类型的数据。
- Character:用于包装char类型的数据。
- Boolean:用于包装boolean类型的数据。
- Byte:用于包装byte类型的数据。
- Short:用于包装short类型的数据。
- Long:用于包装long类型的数据。
- Float:用于包装float类型的数据。
- Double:用于包装double类型的数据。
这些包装类的主要用途是提供了基本数据类型与对象之间的转换,以及对基本数据类型的常用操作,例如比较、转换等。例如,可以通过调用Integer类的静态方法parseInt()将字符串转换为int类型,或者调用Integer类的静态方法valueOf()将int类型转换为Integer对象。
需要注意的是,Java中的包装类都是不可变的,即一旦创建了一个包装对象,它的值就不能被修改。此外,Java中的包装类还提供了一些有用的方法,例如Integer类的静态方法parseInt()可以将字符串转换为int类型,但是这个方法可能会抛出NumberFormatException异常,因此在使用时需要注意异常处理。
以下是Integer类包装类的示例:
Integer i1 = new Integer(10);
int i2 = Integer.parseInt("10");
int i3 = Integer.valueOf(10);
使用包装类的静态方法将基本数据类型转换为对象或将对象转换为基本数据类型。需要注意的是,包装类是不可变的,因此一旦创建了一个包装对象,它的值就不能被修改。
Java中的包装类Integer提供了一些常用的方法,用于操作基本数据类型int的包装对象。以下是Integer类中一些常用的方法:
static Integer valueOf(int i)
: 将基本数据类型int转换为Integer对象。如果参数i为null,则返回null。int intValue()
: 将Integer对象转换为基本数据类型int。如果Integer对象为null,则抛出NullPointerException异常。static Integer min(int a, int b)
: 返回两个整数的最小值,如果a和b都是非null,则返回a和b中的较小值;如果a或b为null,则抛出NullPointerException异常。static Integer max(int a, int b)
: 返回两个整数的最大值,如果a和b都是非null,则返回a和b中的较大值;如果a或b为null,则抛出NullPointerException异常。int compareTo(Integer anotherInteger)
: 比较两个Integer对象的数值大小。如果当前对象小于另一个Integer对象,则返回负数;如果两个对象相等,则返回0;如果当前对象大于另一个Integer对象,则返回正数。boolean equals(Object obj)
: 比较当前Integer对象是否与另一个对象相等。如果相等,则返回true;否则返回false。int hashCode()
: 返回当前Integer对象的哈希码值。
三、数字处理类
在Java中,处理数字的类有很多种,以下是一些主要的:
- Math:这是Java的内置类,包含许多用于数学运算的静态方法。例如,你可以使用
Math.sqrt()
来计算平方根,Math.random()
来生成随机数,Math.abs()
来获取一个数的绝对值等。 - BigInteger:这个类用于任意精度的算术。你可以使用它来进行大整数的运算,而不用担心溢出问题。
- BigDecimal:这个类用于任意精度的十进制运算。它提供了精确的小数运算,这对于金融和货币计算特别重要。
- Random:这个类用于生成伪随机数。你可以使用
Random
类的实例来生成各种类型的随机数。 - Scanner:这个类用于从各种输入源(如键盘)读取原始数据。它常常用于获取用户的输入。
- NumberFormat 和 DecimalFormat:这两个类用于格式化数字,使它们以特定的方式显示。例如,你可以使用它们将数字格式化为货币格式,或者限制小数点后的位数。
- BigInteger 和 BigDecimal 类也提供了很多方法用于比较数字,例如
compareTo()
方法。
四、String类
String
是 Java 中的一个核心类,用于表示字符串。以下是关于 String
类的一些基本信息:
-
创建字符串:
- 字面量方式:直接在代码中写字符串,如
String s = "Hello, World!";
- 使用
new
关键字:String s = new String("Hello, World!");
- 字面量方式:直接在代码中写字符串,如
-
常用方法:
length()
: 返回字符串的长度。charAt(int index)
: 返回指定索引位置的字符。substring(int beginIndex, int endIndex)
: 返回一个新的字符串,它是此字符串的一个子序列。equals(Object anObject)
: 比较此字符串与指定的对象是否相等。equalsIgnoreCase(String anotherString)
: 比较此字符串与另一个字符串是否相等,不区分大小写。getBytes()
: 返回此字符串的字节表示形式。indexOf(int ch)
: 返回指定字符在此字符串中第一次出现处的索引。indexOf(String str)
: 返回指定子字符串在此字符串中第一次出现处的索引。lastIndexOf(int ch)
: 返回指定字符在此字符串中最后一次出现处的索引。lastIndexOf(String str)
: 返回指定子字符串在此字符串中最后一次出现处的索引。
-
不可变性:一旦创建了一个字符串对象,其内容就不能更改。但你可以通过拼接或其他方式创建一个新的字符串对象。
-
内存中的存储:字符串常量通常存储在 Java 虚拟机 (JVM) 的字符串常量池中,这有助于节省内存,因为相同的字符串常量只存储一次。使用
new
关键字创建的字符串对象存储在堆内存中。 -
性能考虑:由于字符串是不可变的,因此某些操作(如连接大量字符串)可能会比使用可变字符序列更有效率。
-
线程安全:
String
是线程安全的,因为所有的公共操作(如charAt
,substring
,concat
,indexOf
,lastIndexOf
等)都是同步的。 -
Unicode:
String
类支持 Unicode,这意味着它可以正确地表示任何 Unicode 字符集中的字符。 -
不可变性的优势:由于字符串是不可变的,所以可以安全地用作各种数据结构(如哈希表中的键)的标识符,因为它们的内容不会在程序执行期间更改。
五、StringBuilder 类和 StringBuffer类
StringBuilder
和 StringBuffer
都是 Java 中用于处理字符串的类,但它们之间存在一些重要的差异。
-
线程安全:
StringBuffer
是线程安全的,因为它的公共方法(如append
,insert
,delete
,reverse
等)都是同步的。这意味着在多线程环境中,对StringBuffer
的操作是安全的。StringBuilder
不是线程安全的。在多线程环境中,如果你需要对字符串进行修改操作,最好使用StringBuffer
。
-
性能:
- 由于
StringBuilder
的方法不需要进行同步,因此在单线程环境中,它的性能通常优于StringBuffer
。
- 由于
-
用途:
- 如果你需要频繁地修改字符串(如拼接、替换或删除),并且不需要考虑线程安全问题,那么
StringBuilder
是更好的选择,因为它通常比StringBuffer
更快。 - 如果你在多线程环境中工作,或者需要确保字符串操作的原子性(即,多个操作作为一个单一的、不可分割的操作执行),那么应该使用
StringBuffer
。
- 如果你需要频繁地修改字符串(如拼接、替换或删除),并且不需要考虑线程安全问题,那么
-
初始容量和增长策略:
- 两者都有默认的初始容量(通常是 16)和增长策略。当字符串的当前长度超过容量时,它们都会按需要增长。但具体的增长策略可能因实现而异。
-
空字符串的处理:
- 当向
StringBuilder
或StringBuffer
添加空字符串时,它们的容量不会增加。这意味着多次添加空字符串不会导致大量的内存分配。
- 当向
-
方法:两者都提供了许多用于处理字符串的方法,如
insert
,delete
,replace
,reverse
等。
StringBuilder 类的方法:
- append():将指定的字符串追加到此字符串构建器的末尾。
- insert():在指定索引处插入指定的字符串。
- delete():删除此字符串构建器中的字符。
- replace():替换此字符串构建器中的字符。
- reverse():将此字符串构建器中的字符反转。
- length():返回此字符串构建器中的字符数。
- capacity():返回此字符串构建器的容量。
- charAt():返回此字符串构建器中指定索引处的字符。
- substring():返回此字符串构建器中的子字符串。
- indexOf():返回指定子字符串在此字符串构建器中第一次出现的索引。
- lastIndexOf():返回指定子字符串在此字符串构建器中最后一次出现的索引。
StringBuffer 类的方法同上
这些方法提供了对字符串进行操作的功能,如拼接、替换、删除、查找等。需要注意的是,StringBuilder
的方法不是同步的,因此在多线程环境中可能会引发并发修改异常,而 StringBuffer
的方法都是同步的,可以在多线程环境中安全使用。
在Java中,与时间相关的类主要有以下几个:
- java.util.Date:这是一个抽象类,用于表示特定的瞬间,精确到毫秒。但是它有一些问题,例如它不能很好地处理时区和夏令时。
- java.sql.Date:这个类是java.util.Date的子类,用于处理数据库中的日期。它只包含日期部分,不包含时间部分。
- java.time.LocalDate:这个类是Java 8引入的新日期API的一部分,用于表示不包含时间信息的日期。
- java.time.LocalDateTime:这个类也是Java 8引入的新日期API的一部分,用于表示包含日期和时间信息的日期时间。
- java.time.ZonedDateTime:这个类也是Java 8引入的新日期API的一部分,用于表示带有时区信息的日期时间。
- java.time.Duration:这个类是Java 8引入的新日期API的一部分,用于表示时间段。
- java.time.Period:这个类也是Java 8引入的新日期API的一部分,用于表示日期中的年月。
这些类都是java.time
包的一部分,是Java 8引入的新的日期和时间API,比旧的java.util.Date
等类更易用,更直观,也更适合处理复杂的日期和时间问题。
六、Date和SimpleDateFormat类
Date
和 SimpleDateFormat
是 Java 中处理日期和时间的重要类。
Date 类:
Date
类是 Java 中的一个核心类,位于 java.util
包中。它用于表示特定的时间点。这个类有一些重要的方法,例如 getTime()
和 setTime()
,用于获取和设置时间戳(自 1970 年 1 月 1 日 00:00:00 GMT 起的毫秒数)。
SimpleDateFormat 类:
SimpleDateFormat
是 java.text
包中的一个类,用于将日期对象格式化为字符串,以及将字符串解析为日期对象。它提供了对日期和时间格式化的强大支持,允许你指定日期和时间的显示格式。
例如,以下是如何使用 SimpleDateFormat
将当前日期格式化为 "yyyy-MM-dd" 格式的字符串:
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = sdf.format(new Date());
System.out.println(formattedDate); // 输出类似 "2023-09-25" 的日期字符串
}
}
在上述代码中,我们首先创建了一个 SimpleDateFormat
对象,并指定了日期格式。然后,我们使用 format()
方法将当前日期格式化为字符串。最后,我们打印了这个字符串。
请注意,SimpleDateFormat
是非常有用的,但它也有一些问题,例如它不是线程安全的,并且对时区和夏令时的处理可能不够准确。Java 8 引入了一个新的日期和时间 API (java.time
包),它提供了更好的性能和更直观的 API。