Java学习八—常用包(类)之java

  1. java.security - 提供了安全性和加密功能,包括安全的随机数生成、加密、摘要、签名等。主要类有KeyStore​、Cipher​、MessageDigest​、Signature​等。
  2. java.math - 包含了BigDecimal​类,用于任意精度的整数和定点数的数学运算。
  3. java.concurrent - 包含了并发编程的工具类,如线程池、同步器、并发集合等。关键类有ExecutorService​、Future​、Callable​、CountDownLatch​、CyclicBarrier​、ConcurrentHashMap​等。
  4. java.time - Java 8引入的新的日期和时间API,提供了更加易用和更加灵活的日期时间处理类,如LocalDate​、LocalTime​、LocalDateTime​、ZonedDateTime​、Duration​、Period​等。

这些包构成了Java标准库的基础,是开发Java应用程序时不可或缺的部分。

image

image(2)

二、java.lang包

2.1关于java.lang包

2.1.1简介

java.lang​ 包是 Java 程序中最基本和最核心的包。它包含了 Java 编程语言的基础类,这些类是每个 Java 程序的构建块。由于其重要性,java.lang​ 包中的类被自动导入到所有的 Java 程序中,无需显式地使用 import​ 语句。

java.lang包是java语言的核心,它提供了java中的基础类。包括基本Object类、Class类、String类、基本类型的包装类、基本的数学类等等最基本的类。

2.1.2常用类和接口
  1. Object - 所有类的根类,提供了一些基本的方法,如 toString()​、equals(Object)​、hashCode()​ 和 getClass()​。
  2. String - 表示不可变的字符串。String​ 类提供了创建和操作字符串的方法,如 length()​、charAt(int)​、substring(int, int)​、indexOf(String)​ 等。
  3. Math - 提供了基本的数学运算功能,如 abs()​、sqrt()​、random()​、pow(double, double)​ 等。
  4. System - 提供了与系统相关的方法,如 out​(PrintStream​ 类型的 System.out​)、err​(PrintStream​ 类型的 System.err​)、exit(int)​、gc()​ 等。
  5. Thread - 用于创建和控制线程的类。Thread​ 类提供了线程的创建、启动、等待、同步和通信的方法。
  6. Runnable - 一个标记接口,其实现类的对象可以作为线程执行。通常与 Thread​ 类一起使用,以定义线程的任务。
  7. Throwable - 所有错误和异常的超类。Exception​ 和 Error​ 是 Throwable​ 的两个主要子类。
  8. Exception - 程序可以处理的异常的基类。RuntimeException​ 和 IOException​ 是 Exception​ 的常见子类。
  9. RuntimeException - 非检查性异常的超类,表示那些可能在Java虚拟机正常运行期间抛出的异常,如 NullPointerException​、IllegalArgumentException​ 等。
  10. ClassLoader - 用于动态加载 Java 类的类。Java 虚拟机会使用 ClassLoader​ 来加载 .class​ 文件。
  11. StringBuilderStringBuffer - 可变字符串类,提供了可修改字符串的方法。StringBuffer​ 是线程安全的,而 StringBuilder​ 不是。
  12. LongIntegerDoubleFloat 等 - 提供了基本数值类型的包装类,以及一系列静态方法来操作这些数值类型。​​

image

2.2Object类

2.2.1简介

java.lang.Object​ 是 Java 语言中所有类的根类。这个类提供了一些基本的方法和行为,这些方法和行为在所有的 Java 类中都是可用的,因为它们最终都是从 Object​ 类继承而来的。

image

Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。

img

Object 类可以显式继承,也可以隐式继承,以下两种方式是一样的:

1.显式继承:

public class Runoob extends Object{

}

2.隐式继承:

public class Runoob {

}

2.2.2构造方法

Object 类是所有类的根类,它包含了一些所有类都具有的通用方法,比如 toString​、equals​、hashCode​ 等。由于 Object 类是所有类的祖先,因此它并没有显式定义构造方法。换句话说,Object 类的构造方法是由 Java 虚拟机隐式提供的,它没有任何参数,也没有任何操作,因为它并不需要进行实例化。

2.2.3方法
  1. toString() - 返回对象的字符串表示,通常返回类的名称和对象的哈希码的无符号十六进制表示。可以通过重写此方法来提供对象的自定义字符串表示。
  2. equals(Object obj) - 用于比较两个对象是否相等。默认实现是比较对象的引用,即只有当两个对象是同一个实例时才返回 true​。可以通过重写此方法来提供自定义的相等性比较逻辑。
  3. hashCode() - 返回对象的哈希码,这是一个用于哈希表的整数值。默认实现依赖于对象的内部状态。通常,当你重写 equals​ 方法时,也应该重写 hashCode​ 方法,以确保 equals​ 方法的相等性与 hashCode​ 方法的一致性。
  4. getClass() - 获取运行时对象的类信息,返回一个 Class​ 对象,表示对象的类型。
  5. clone() - 创建并返回对象的一个副本。默认实现是浅拷贝,即复制对象的引用,而不是对象本身。可以通过实现 Cloneable​ 接口并重写 clone​ 方法来提供深拷贝或其他自定义的克隆行为。
  6. wait() - 使当前线程等待,直到另一个线程调用此对象的 notify()​ 或 notifyAll()​ 方法,或者直到超过指定的超时时间。
  7. notify()notifyAll() - 用于唤醒在此对象监视器上等待的单个线程(notify()​)或所有线程(notifyAll()​)。
  8. finalize() - 在垃圾收集器决定回收对象之前,由垃圾收集器调用此方法。这个方法可以用于执行清理操作,比如释放资源。然而,由于 finalize()​ 方法的调用时机不确定,以及可能对性能的影响,通常建议使用 try-with-resources 语句和自动资源管理器来管理资源,而不是依赖 finalize()​ 方法。

image

2.2.4示例
toString方法

Object​ 类中的 toString()​ 方法是 Java 中一个非常重要的方法,它被用来返回对象的字符串表示。这个字符串表示通常包含了对象的类名和它的哈希码值的无符号十六进制表示。

image

    /\*\*
 \* Returns a string representation of the object. In general, the
 \* {@code toString} method returns a string that
 \* "textually represents" this object. The result should
 \* be a concise but informative representation that is easy for a
 \* person to read.
 \* It is recommended that all subclasses override this method.
 \* <p>
 \* The {@code toString} method for class {@code Object}
 \* returns a string consisting of the name of the class of which the
 \* object is an instance, the at-sign character `{@code @}', and
 \* the unsigned hexadecimal representation of the hash code of the
 \* object. In other words, this method returns a string equal to the
 \* value of:
 \* <blockquote>
 \* <pre>
 \* getClass().getName() + '@' + Integer.toHexString(hashCode())
 \* </pre></blockquote>
 \*
 \* @return a string representation of the object.
 \*/
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

默认实现

Object​ 类中,toString()​ 方法的默认实现返回一个字符串,格式通常如下:

"[类名@哈希码]"

其中,类名是对象所属的类的名称,哈希码是对象的哈希值的无符号十六进制表示。哈希码是基于对象的内部状态计算得来的,通常是对象的内存地址的某种变换。

重写 **toString()**方法

由于 toString()​ 方法在 Object​ 类中的实现并不具有太多的描述性,因此在实际编程中,通常会根据需要重写这个方法,以提供更有意义的信息。例如,一个 Person​ 类可能会重写 toString()​ 方法来返回包含人名和年龄的字符串。

下面是一个重写 toString()​ 方法的例子:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + '}';
    }
}

在这个例子中,toString()​ 方法返回了一个包含 Person​ 对象 name​ 和 age​ 属性的字符串。

使用 **toString()**方法

toString()​ 方法在 Java 中的使用非常广泛,它被用于打印对象信息、显示在用户界面上、记录日志等场景。例如,可以使用 System.out.println()​ 方法打印对象的字符串表示:

Person person = new Person("Alice", 30);
System.out.println(person); // 输出:Person{name='Alice', age=30}

在上述代码中,由于 Person​ 类重写了 toString()​ 方法,所以 System.out.println()​ 方法能够打印出自定义的字符串表示。

在IDEA中高效使用toString

  • 第一步:alt +insert
  • 第二步:选中toString()

image

  • 第三步:将所需参数选中,点击OK!

image

生成你所需的方法,也可在此基础上进行修改达到最佳效果!

image

equals方法

Object​类的equals()​方法用于比较两个对象是否相等。默认情况下,equals()​方法实现的是比较两个对象的引用是否相同,即它检查两个对象的内存地址是否一致。如果两个对象的引用指向同一个内存位置,equals()​方法返回true​;否则返回false​。

image

	public boolean equals(Object obj) {
        return (this == obj);
    }

重写**equals()**方法

在实际应用中,通常需要根据对象的内容而不是它们的引用来比较它们是否相等。因此,经常需要重写equals()​方法来提供自定义的相等性比较逻辑。重写equals()​方法时,通常也需要重写hashCode()​方法,以确保相等的对象具有相同的哈希码,这是hashCode()​方法的一般约定。

以下是一个重写equals()​方法的示例:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 重写equals方法
    @Override
    public boolean equals(Object obj) {
        // 如果对象引用相同,或者obj是null,或者类型不匹配,则不平等
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }

        // 转换为Person类型以安全地访问属性
        Person person = (Person) obj;

        // 比较name和age属性
        return this.name.equals(person.name) && this.age == person.age;
    }

    // 重写hashCode方法以保持与equals的一致性
    @Override
    public int hashCode() {
        int result = 17;
        result = 31 \* result + name.hashCode();
        result = 31 \* result + age;
        return result;
    }
}

在这个示例中,Person​类重写了equals()​方法,以比较两个Person​对象的name​和age​属性是否相同。同时,也重写了hashCode()​方法,以确保具有相同属性的Person​对象具有相同的哈希码。

使用**equals()**方法

当你创建了自定义的equals()​方法后,可以使用它来比较两个对象是否具有相同的数据:

Person person1 = new Person("Alice", 30);
Person person2 = new Person("Alice", 30);
Person person3 = new Person("Bob", 30);

boolean areEqual1 = person1.equals(person2); // 返回true,因为他们具有相同的属性
boolean areEqual2 = person1.equals(person3); // 返回false,因为他们的name不同

在这个例子中,person1​和person2​具有相同的name​和age​,所以equals()​方法返回true​。而person1​和person3​的name​不同,所以equals()​方法返回false​。

hashCode()方法

简介

Object​类的hashCode()​方法用于为对象生成一个哈希码值,这个值通常用于确定对象在哈希表中的位置。哈希码是一个32位的整数,它通过对象的内部数据计算得到,可以用来快速比较对象的相等性。

public int hashCode();

hash值

哈希值是根据地址值换算出来的一个值,并不是实际的地址值,常用于哈希表中,如HashMap、HashTable、HashSet。关于哈希值,不同的JDK算法其实是不一样的:

Java 6、7 中会默认返回一个随机数;

Java 8 中默认通过和当前线程有关的一个随机数 + 三个确定值,运用Marsaglia’s xorshift scheme的随机数算法得到的一个随机数。

默认行为
Object类的默认hashCode()实现依赖于对象的内存地址,因此不同的Java虚拟机实现可能会有不同的hashCode()行为。通常情况下,如果你不重写这个方法,那么只有完全相同的对象(即指向同一内存地址的引用)才会返回相同的哈希码。

重写**hashCode()**方法

当重写了equals()​方法来提供自定义的相等性比较逻辑时,也应该重写hashCode()​方法,以确保相等的对象具有相同的哈希码。这是非常重要的,因为很多Java集合类(如HashSet​、HashMap​和Hashtable​)都依赖于hashCode()​方法来快速查找和存储对象。

一个好的hashCode()​实现应该满足以下条件:

  1. 如果两个对象根据equals()​方法被认为是相等的,那么它们的hashCode()​返回值也必须相等。
  2. hashCode()​方法的返回值应该在对象的生命周期内保持不变。
  3. 应该尽量生成一个分布均匀的哈希码,以减少哈希冲突。

以下是一个重写hashCode()​方法的示例:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 重写hashCode方法
    @Override
    public int hashCode() {
        int result = 17; // 常数种子
        result = 31 \* result + name.hashCode(); // 将name的哈希码混合进去
        result = 31 \* result + age; // 将age的值混合进去
        return result;
    }

    // 重写equals方法,以保持与hashCode的一致性
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person other = (Person) obj;
        return age == other.age && name.equals(other.name);
    }
}

在这个例子中,Person​类的hashCode()​方法使用了一个常数种子(17)和一个乘数(31),将name​的哈希码和age​的值混合在一起,生成了一个哈希码。这样做可以确保即使name​或age​的值改变,hashCode()​方法返回的哈希码也会相应地改变。

使用**hashCode()**方法

当你使用哈希表相关的集合类时,hashCode()​方法会被自动调用,以确定对象的存储位置:

HashSet<Person> people = new HashSet<>();
Person person1 = new Person("Alice", 30);
Person person2 = new Person("Bob", 35);

people.add(person1);
people.add(person2);

Person person3 = new Person("Alice", 30);
boolean contains = people.contains(person3); // 返回true,因为person3与person1相等

在这个例子中,HashSet​使用hashCode()​方法来确定person1​和person2​的存储位置。当我们尝试添加person3​时,由于它与person1​相等,HashSet​会认为它们是同一个对象,因此contains​方法返回true​。

2.3字符串类

2.3.1关于字符串类
简介

在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。String 类是不可变类,即一旦一个 String 对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。

Java 提供了两个可变字符串类 StringBuffer 和 StringBuilder,中文翻译为“字符串缓冲区”。

StringBuilder 类是 JDK 1.5 新增的类,它也代表可变字符串对象。实际上,StringBuilder 和 StringBuffer 功能基本相似,方法也差不多。不同的是,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用 StringBuilder 类。

image

区别

StringBuffer、StringBuilder、String 中都实现了 CharSequence 接口。CharSequence 是一个定义字符串操作的接口,它只包括 length()、charAt(int index)、subSequence(int start, int end) 这几个 API。

StringBuffer、StringBuilder、String 对 CharSequence 接口的实现过程不一样

对CharSequence接口的实现

                                                                     对CharSequence接口的实现

String 直接实现了 CharSequence 接口,StringBuilder 和 StringBuffer 都是可变的字符序列,它们都继承于 AbstractStringBuilder,实现了 CharSequence 接口。

使用

String 是 Java 中基础且重要的类,被声明为 final class,是不可变字符串。因为它的不可变性,所以拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。

StringBuffer 就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类。它提供了 append 和 add 方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列。

在很多情况下我们的字符串拼接操作不需要线程安全,所以 StringBuilder 登场了。StringBuilder 是 JDK1.5 发布的,它和 StringBuffer 本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。

线程安全:

StringBuffer:线程安全
StringBuilder:线程不安全

速度:

一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。

使用环境:

操作少量的数据使用 String。
单线程操作大量数据使用 StringBuilder。
多线程操作大量数据使用 StringBuffer。

字符串拼接方法

在 Java 中,有几种常用的方法可以用于字符串拼接:

1.使用加号(+)操作符:

javaCopy CodeString str1 = "Hello";
String str2 = "world!";
String result = str1 + " " + str2; // 结果为 "Hello world!"

高并发,性能较低

2.使用 StringBuilder 类:

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("world!");
String result = sb.toString(); // 结果为 "Hello world!"

使用 StringBuilder 可以有效避免大量字符串拼接操作时产生的临时对象,提高性能。

例子:

image

image

3.使用 String.format() 方法:

javaCopy CodeString str1 = "Hello";
String str2 = "world!";
String result = String.format("%s %s", str1, str2); // 结果为 "Hello world!"

使用 String.format() 方法可以按照指定的格式将多个字符串拼接成一个字符串。

需要注意的是,以上方法中的字符串拼接都是创建了新的字符串对象,并不会修改原有的字符串对象。如果频繁进行字符串拼接操作,建议使用 StringBuilder 或 StringBuffer 类来提高性能。另外,从 Java 9 开始,还引入了更简洁的字符串拼接方法 String.join()​,可以更方便地拼接多个字符串。

2.3.2String类
简介

java.lang.String​ 类是 Java 程序设计语言中用于表示和操作字符串的基本类。它是 java.lang​ 包的一部分,因此无需特别导入即可直接使用。

特点
  • 不可变性String​ 对象一旦创建,其值就不能被改变。这意味着任何看似修改字符串的操作实际上都会创建一个新的 String​ 对象。
  • 内存优化:Java 通过所谓的字符串池(String Pool)来优化内存使用。当创建字符串常量时,Java 虚拟机会在字符串池中查找是否已经存在相同的字符串,如果存在,则重用该字符串对象。
  • 自动装箱与拆箱String​ 类实现了 String​ 类型的自动装箱和拆箱,可以与 String​ 对象和字符串字面量之间无缝转换。

构造方法

String中的构造方法很多,即可以通过很多方法创建String对象。

  1. 构造方法1:使用字符串字面值创建

    • 示例:
String str1 = "Hello"; // 使用字符串字面值创建

  1. 构造方法2:使用字符数组创建

    • 示例:
char[] charArray = {'H', 'e', 'l', 'l', 'o'};
String str2 = new String(charArray); // 使用字符数组创建

  1. 构造方法3:使用字符数组指定起始位置和长度创建

    • 示例:
char[] charArray = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
String str3 = new String(charArray, 6, 5); // 从字符数组的第6个位置开始,长度为5创建字符串对象

  1. 构造方法4:使用字节数组创建

    • 示例:
byte[] byteArray = {72, 101, 108, 108, 111}; // 对应ASCII编码的 "Hello"
String str4 = new String(byteArray); // 使用字节数组创建

  1. 构造方法5:使用字节数组指定字符集创建

    • 示例:
byte[] byteArray = {72, 101, 108, 108, 111}; // 对应ASCII编码的 "Hello"
String str5 = new String(byteArray, StandardCharsets.UTF\_8); // 使用指定字符集创建

  1. 构造方法6:使用String对象创建

    • 示例:
String original = "Hello";
String str6 = new String(original); // 使用String对象创建

方法

s.length() : 返回字符串的长度

s.charAt(index) : 获取字符串s的第index位置的字符,返回的是字符。index可以看成下标,范围从0开始到字符 串的长度减1结束 0 <= index <= s.length()-1 。 超过这个长度 就会有字符串下标越界

s.compareTo(s2) : 比较两个字符串的大小。返回的是整数。正数代表s大,负数代表s2大。

s.concat(s2) : 将s2拼接到s的后,生成一个新的字符串,原字符串不变 等同于+的功能

s.contains(s2): 判断s中是否包含字符串s2,返回boolean类型

s.endsWith(s2) : 判断字符串s是否以字符串s2结尾 返回boolean类型

s.startsWith(s2):判断字符串s是否以字符串s2开始 返回boolean类型

s.equals(Object o) : 判断传过来的o是否是一个字符串且与s中的值一样。(判断两个字符串是否一样,不能使用 ==号,应该使用equals方法)

s.equalsIgnoreCase(s2) : 忽略大小写判断s与s2是否一样。

s.indexOf(s2) : 返回s2 在s中第一次出现的位置 (s2 可以是字符串也可以是字符),如果s中不包含s2子字符串, 则返回-1.

s.lastIndexOf(s2) : 返回s2在s中最后一次出现的位置

s.isEmpty() : 判断s是否是空字符串,不是null,而是"" 即 长度是0;

s.replace(s1,s2) : 将字符串s中的所有s1子字符串用字符串s2替换,生成一个新的字符串,原字符串不变。 s2替 换s中所有的子字符串s1.

s.split(s2) : 使用s2将字符串s拆开,返回的是一个字符串数组,原字符串不变(s2是一个正则表达式)

s.substring(int n) : 从字符串s的第n个位置开始,截取后面所有的子字符串。

s.substring(n,m) : 从字符串s的第n个位置开始截取到第m个位置,包含第n个位置,不包含第m个位置,原字符串 不变,返回一个新的字符串。

s.toLowerCase() : 将字符串s中的所有大写字母转成小写字母,原字符串不变,生成一个新的字符串。

s.toUpperCase() : 转大写

s.trim() : 去掉字符串s两边的空格,不包含中间的空格

String.valueOf(x) : String的静态方法,将x转成字符串。

s.replaceAll:Java 中用于替换字符串中的匹配项的方法。它使用正则表达式来指定要替换的模式,并用指定的字符串进行替换。

示例
public class StringExample {
    public static void main(String[] args) {
        // 创建字符串
        String str1 = "Hello,";
        String str2 = "world!";
      
        // 字符串拼接
        String result = str1 + " " + str2;
        System.out.println(result); // 输出: Hello, world!

        // 获取字符串长度
        int length = result.length();
        System.out.println("Length: " + length); // 输出: Length: 13

        // 字符串比较
        String str3 = "hello";
        if (str1.equalsIgnoreCase(str3)) {
            System.out.println("str1 equals to str3 ignoring case");
        } else {
            System.out.println("str1 not equals to str3 ignoring case"); // 输出: str1 not equals to str3 ignoring case
        }

        // 查找子字符串
        int index = result.indexOf("world");
        if (index != -1) {
            System.out.println("Substring 'world' found at index " + index); // 输出: Substring 'world' found at index 7
        } else {
            System.out.println("Substring not found");
        }

        // 提取子字符串
        String subStr = result.substring(7);
        System.out.println("Substring: " + subStr); // 输出: Substring: world!
      
        // 字符串分割
        String[] words = result.split(",");
        for (String word : words) {
            System.out.println(word);
        }

        // 替换字符串
        String replacedStr = result.replace("world", "Java");
        System.out.println("Replaced string: " + replacedStr); // 输出: Replaced string: Hello, Java!
      
        // 去除首尾空格
        String stringWithSpaces = " Trim me! ";
        String trimmedStr = stringWithSpaces.trim();
        System.out.println("Trimmed string: " + trimmedStr); // 输出: Trimmed string: Trim me!
    }
}


2.3.2StringBuilder类
简介

java.lang.StringBuffer​类是可变的字符串类,它可以动态修改字符串的内容。StringBuffer类的对象是一个动态的字符序列,可以进行插入、追加、删除和修改等操作,适用于需要频繁修改字符串内容的情况。

构造方法
  1. StringBuilder(): 构造一个空的字符串构建器,初始容量为 16 个字符。
  2. StringBuilder(CharSequence seq): 构造一个字符串构建器,初始化为指定的字符序列。
  3. StringBuilder(int capacity): 构造一个空的字符串构建器,初始容量由 capacity 参数指定。
  4. StringBuilder(String str): 构造一个字符串构建器,并初始化为指定的字符串内容。

  1. 使用空的构造方法创建一个空的 StringBuilder​ 对象:
StringBuilder sb1 = new StringBuilder();

  1. 使用指定容量的构造方法创建一个空的 StringBuilder​ 对象,初始容量为 20 个字符:
StringBuilder sb2 = new StringBuilder(20);

  1. 使用字符串参数的构造方法创建一个包含指定字符串内容的 StringBuilder​ 对象:
StringBuilder sb3 = new StringBuilder("Hello, World!");

  1. 使用字符序列参数的构造方法创建一个包含指定字符序列内容的 StringBuilder​ 对象:
CharSequence charSeq = "This is a char sequence";
StringBuilder sb4 = new StringBuilder(charSeq);

方法
  • append(String str): 在末尾追加字符串。
  • insert(int offset, String str): 在指定位置插入字符串。
  • replace(int start, int end, String str): 替换指定范围内的字符串。
  • delete(int start, int end): 删除指定范围内的字符。
  • reverse(): 反转字符串。
  • substring(int start): 返回从指定位置开始到末尾的子字符串。
  • substring(int start, int end): 返回指定范围的子字符串。
  • charAt(int index): 返回指定索引处的字符。
  • length(): 返回字符串长度。
  • indexOf(String str): 返回字符串中第一次出现指定子字符串的索引。
  • lastIndexOf(String str): 返回字符串中最后一次出现指定子字符串的索引。
  • toString(): 将 StringBuilder​ 对象转化为字符串。

示例
public class StringBuilderExample {
    public static void main(String[] args) {
        // 创建一个空的 StringBuilder 对象
        StringBuilder sb = new StringBuilder();

        // 在末尾追加字符串
        sb.append("Hello");

        // 在指定位置插入字符串
        sb.insert(5, ", World");

        // 输出当前 StringBuilder 对象内容
        System.out.println("StringBuilder内容: " + sb.toString());

        // 替换指定范围内的字符串
        sb.replace(6, 11, "Java");

        // 删除指定范围内的字符
        sb.delete(0, 5);

        // 反转字符串
        sb.reverse();

        // 输出结果
        System.out.println("处理后的StringBuilder内容: " + sb.toString());
    }
}

2.3.3StringBuffer类
简介

java.lang.StringBuffer​ 是 Java 中的一个可变字符序列,它提供了 String​ 类所没有的某些功能,尤其是在多线程环境中。与 String​ 类似,StringBuffer​ 也是 java.lang​ 包的一部分,因此可以直接使用而无需导入。

主要特性
  • 可变性StringBuffer​ 对象的内容可以在创建后进行修改,这与 String​ 对象的不可变性形成对比。
  • 线程安全:所有 StringBuffer​ 的公共方法都是同步的,这意味着它们是线程安全的,可以在多线程环境中安全使用,不会有并发问题。
  • 性能:由于 StringBuffer​ 的可变性,它在某些情况下比 String​ 更高效,尤其是在需要频繁修改字符串内容的场景中。

构造方法
  • StringBuffer()​​:创建一个空的 StringBuffer​​ 对象。
  • StringBuffer(int capacity)​​:创建一个指定初始容量的 StringBuffer​​ 对象。
  • StringBuffer(String str)​​:创建一个与指定字符串内容相同的 StringBuffer​​ 对象。

方法
  • append(String str): 在末尾追加字符串。
  • insert(int offset, String str): 在指定位置插入字符串。
  • replace(int start, int end, String str): 替换指定范围内的字符串。
  • delete(int start, int end): 删除指定范围内的字符。
  • reverse(): 反转字符串。
  • substring(int start): 返回从指定位置开始到末尾的子字符串。
  • substring(int start, int end): 返回指定范围的子字符串。
  • charAt(int index): 返回指定索引处的字符。
  • length(): 返回字符串长度。
  • setCharAt(int index, char ch): 将指定索引处的字符设置为指定字符。
  • indexOf(String str): 返回字符串中第一次出现指定子字符串的索引。
  • lastIndexOf(String str): 返回字符串中最后一次出现指定子字符串的索引。
  • capacity(): 返回当前容量。
  • ensureCapacity(int minimumCapacity): 确保容量至少等于指定值。
  • toString(): 将 StringBuffer​ 对象转化为字符串。

示例
public class StringBufferExample {
    public static void main(String[] args) {
        // 创建一个空的 StringBuffer 对象
        StringBuffer sb = new StringBuffer();

        // 在末尾追加字符串
        sb.append("Hello");

        // 在指定位置插入字符串
        sb.insert(5, ", World");

        // 输出当前 StringBuffer 对象内容
        System.out.println("StringBuffer内容: " + sb.toString());

        // 替换指定范围内的字符串
        sb.replace(6, 11, "Java");

        // 删除指定范围内的字符
        sb.delete(0, 5);

        // 反转字符串
        sb.reverse();

        // 输出结果
        System.out.println("处理后的StringBuffer内容: " + sb.toString());
    }
}

2.4包装类

2.4.1关于包装类
简介

包装类是一种用于将基本数据类型转换为对象的类。这些基本数据类型包括整数、浮点数、字符和布尔值。每种基本数据类型都有对应的包装类。包装类提供了许多实用的方法来处理基本数据类型的值,以及在集合类中使用基本数据类型的值。

基本数据类型及其对应的包装类
基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

功能

这些包装类提供了一系列方法来进行基本数据类型与对象之间的转换,以及进行数学运算、比较等操作。此外,它们还提供了一些静态方法来解析字符串、转换为字符串等功能。

例如,可以使用包装类将整数转换为对象,并执行一些操作:

Integer num = new Integer(10); // 将整数10转换为Integer对象
int value = num.intValue(); // 从Integer对象获取整数值
String str = num.toString(); // 将Integer对象转换为字符串

另外,自动装箱(autoboxing)和自动拆箱(unboxing)使得基本数据类型和包装类之间的转换更加方便。例如:

Integer num = 10; // 自动装箱:将整数10自动转换为Integer对象
int value = num; // 自动拆箱:将Integer对象自动转换为整数值

总体而言,包装类为基本数据类型提供了更多的操作和功能,使得基本数据类型可以更方便地在Java的面向对象环境中使用。

2.4.2Integer类
简介

Integer​ 类是 Java 中用于表示整数的包装类之一。它提供了许多方法来处理整数值,以及将整数值转换为其他数据类型。

构造方法
  • Integer​ 类提供了两种构造方法:

    1. Integer(int value)​:通过一个基本数据类型的整数值创建一个 Integer​ 对象。
    2. Integer(String s)​:通过一个字符串参数创建一个 Integer​ 对象,该字符串必须表示一个有效的整数。

方法
  • intValue()​:返回 Integer​ 对象的整数值。
  • doubleValue()​:返回 Integer​ 对象的双精度浮点值。
  • toString()​:返回 Integer​ 对象的字符串表示形式。
  • parseInt(String s)​:将指定字符串解析为带符号的十进制整数。
  • valueOf(int i)​:返回表示指定的 int​ 值的 Integer​ 实例。

示例
public class IntegerExample {
    public static void main(String[] args) {
        // 使用构造方法创建 Integer 对象
        Integer num1 = new Integer(10); // 通过整数值创建
        Integer num2 = new Integer("20"); // 通过字符串创建

        // 调用方法获取值或执行操作
        int value1 = num1.intValue(); // 获取整数值
        double value2 = num2.doubleValue(); // 获取双精度浮点值
        String str = num1.toString(); // 转换为字符串

        // 解析字符串为整数
        int parsedInt = Integer.parseInt("30");
  
        // 使用 valueOf 方法创建 Integer 对象
        Integer num3 = Integer.valueOf(40);

        // 输出结果
        System.out.println("Value of num1: " + value1);
        System.out.println("Value of num2 as double: " + value2);
        System.out.println("String representation of num1: " + str);
        System.out.println("Parsed integer from string: " + parsedInt);
        System.out.println("Value of num3: " + num3);
    }
}

2.5线程类及接口

2.5.1Thread类
简介

在Java中,Thread类是用于创建和操作线程的类。

  • Thread类是Java提供的用于多线程编程的核心类之一,用于创建和操作线程。
  • 通过继承Thread类并重写run()方法,可以定义线程要执行的任务代码。

image

构造方法
  1. Thread() :创建一个新的线程对象。
  2. Thread(Runnable target) :创建一个新的线程对象,并指定实现了Runnable接口的对象作为线程的目标。
  3. Thread(Runnable target, String name) :创建一个新的带有指定名称的线程对象。
  4. Thread(String name) :创建一个新的带有指定名称的线程对象。
  5. Thread(ThreadGroup group, Runnable target) :在指定线程组中创建一个新线程对象。

方法
  1. start() :启动线程,使其进入就绪状态,当CPU时间片分配到时自动执行run()方法。
  2. run() :线程的主体方法,包含线程要执行的任务代码。
  3. sleep(long millis) :让当前线程休眠指定毫秒数。
  4. join() :等待该线程终止。
  5. interrupt() :中断线程。
  6. isAlive() :判断线程是否处于活动状态。
  7. setName(String name) :设置线程的名称。
  8. getState() :获取线程的状态。

示例
class MyThread extends Thread {
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + ": " + i);
            try {
                Thread.sleep(1000); // 休眠1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();

        thread1.setName("Thread 1");
        thread2.setName("Thread 2");

        thread1.start();
        thread2.start();
    }
}

在上面的示例中,定义了一个继承自Thread的自定义线程类MyThread,重写了run()方法,在main函数中创建了两个线程对象,分别启动这两个线程,输出各自线程的执行结果。

2.5.2Runnable接口
简介

Runnable​ 是 Java 中的一个接口,它定义了那些可以由新线程执行的任务。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

}
}
}

public class Main {
public static void main(String[] args) {
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();

    thread1.setName("Thread 1");
    thread2.setName("Thread 2");

    thread1.start();
    thread2.start();
}

}


在上面的示例中,定义了一个继承自Thread的自定义线程类MyThread,重写了run()方法,在main函数中创建了两个线程对象,分别启动这两个线程,输出各自线程的执行结果。


‍


#### 2.5.2Runnable接口


##### 简介


`Runnable`​ 是 Java 中的一个接口,它定义了那些可以由新线程执行的任务。
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中...(img-DT79EYui-1712477322890)]

 

[外链图片转存中...(img-7fn4xiUO-1712477322890)]

![img](https://i-blog.csdnimg.cn/blog_migrate/ad7909a4730b780656545eb9552a5320.png)

![img](https://i-blog.csdnimg.cn/blog_migrate/16e27ee7dfd6e25a4f43c8cc6ef06aa7.png)

![img](https://i-blog.csdnimg.cn/blog_migrate/3443f3d934f11d6666b3767ac0897763.png)

![img](https://i-blog.csdnimg.cn/blog_migrate/0426b4c2e3d69852ceb846faa8ff365f.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**

<img src="https://img-community.csdnimg.cn/images/fd6ebf0d450a4dbea7428752dc7ffd34.jpg" alt="img" style="zoom:50%;" />
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list型的高级数据结构,更适合论坛帖子列表这种型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作 jared jared是一个用来操作Windows注册表的 Java 库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值