Java常用类使用总结(2)

public class Test {

public static void main(String[] args) {

Object obj1 = new Object();

System.out.println(obj1.toString()); // java.lang.Object@1b6d3586

Object obj2 = new Object();

System.out.println(obj2.toString()); // java.lang.Object@4554617c

// 数组元素值返回一个字符串的表达式

String[] arr = {“a”, “b”, “c”};

System.out.println(arr[0].toString()); // a

System.out.println(arr[1].toString()); // b

}

}

也可重写 toString() 方法

public class Test {

public static void main(String[] args) {

Test test = new Test();

System.out.println(test.toString()); // Test

}

public String toString() {

return “Test”;

}

}

getClass()

getClass() 方法用于获取对象的运行时对象的类。

public class Test {

public static void main(String[] args) {

Object obj = new Object();

System.out.println(obj.getClass()); // class java.lang.Object

String str = new String();

System.out.println(str.getClass()); // class java.lang.String

Test test = new Test();

System.out.println(test.getClass()); // class Test

}

}

equals()

equals() 方法用于比较两个对象是否相等。

equals() 方法是直接判断 this 和 obj 本身的值是否相等,即用来判断调用equals的对象和形参 obj 所引用的对象是否是同一对象,所谓同一对象就是指内存中同一块存储单元,如果 this 和 obj 指向的hi同一块内存对象,则返回true,如果 this 和 obj 指向的不是同一块内存,则返回 false。

注意:即便是内容完全相等的两块不同的内存对象,也返回 false。

public class Test {

public static void main(String[] args) {

// 比较两个对象

Object obj1 = new Object();

Object obj2 = new Object();

// 不同对象,内存地址不同,不相等,返回 false

System.out.println(obj1.equals(obj2)); // false

// 对象引用,内存地址相同,相等,返回 true

Object obj3 = obj1;

System.out.println(obj1.equals(obj3)); // true

// String 类重写了 equals() 方法,用于比较两个字符串是否相等

String str1 = new String();

String str2 = new String();

System.out.println(str1.equals(str2)); // true

System.out.println(str1 == str2); // false

str1 = “a”;

str2 = “a”;

System.out.println(str1.equals(str2)); // true

System.out.println(str1 == str2); // true

}

}

== 和 equals() 方法的区别

  • == 可以比较两个基本数据类的变量的值是否相等,也可以比较对象的首地址是否相同。

  • equals() 方法只能比较对象的首地址是否相同。

hashCode()

hashCode() 方法用于获取对象的 hash 值。

hashCode() 方法用于哈希查找,可以减少在查找中使用 equals() 的次数,重写了equals方法一般都要重写 hashCode() 方法。这个方法在一些具有哈希功能的 Collection 中用到。

import java.util.ArrayList;

public class Test {

public static void main(String[] args) {

Object obj1 = new Object();

Object obj2 = new Object();

System.out.println(obj1.hashCode()); // 460141958

System.out.println(obj2.hashCode()); // 1163157884

String str = new String();

System.out.println(str.hashCode()); // 0

ArrayList arr = new ArrayList<>();

System.out.println(arr.hashCode()); // 1

}

}

一般必须满足 obj1.equals(obj2) == true。可以推出 obj1.hash Code() == obj2.hashCode(),但是hashCode 相等不一定就满足 equals。不过为了提高效率,应该尽量使上面两个条件接近等价。

wait()

wait() 方法让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

notify() 唤醒在该对象上等待的某个线程。

notifyAll() 唤醒在该对象上等待的所有线程。

import java.util.Date;

class WaitTest {

public static void main(String[] args) {

ThreadA threadA = new ThreadA(“threadA”);

synchronized (threadA) {

try {

// 启动线程

threadA.start();

System.out.println(Thread.currentThread().getName() + " wait() " + new Date());

// 主线程等待 ta 通过 notify 唤醒。

threadA.wait();// 不是使ta线程等待,而是当前执行 wait 的线程等待

System.out.println(Thread.currentThread().getName() + " continue " + new Date());

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

class ThreadA extends Thread {

public ThreadA(String name) {

super(name);

}

@Override

public void run() {

synchronized (this) {

try {

Thread.sleep(1000); // 使当前线程阻塞1秒

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + " call notify()");

this.notify();

}

}

}

输出结果:

main wait() Sat Jul 24 13:03:57 CST 2021

threadA call notify()

main continue Sat Jul 24 13:03:58 CST 2021

finalize()

finalize() 方法用于实例被垃圾回收器回收的时触发的操作。

class Test {

public static void main(String[] args) {

User u1 = new User(1);

User u2 = new User(2);

User u3 = new User(3);

u2 = u3 = null;

System.gc();

}

}

class User {

private int id;

public User(int id) {

this.id = id;

System.out.println(“User Object " + id + " is created”);

}

protected void finalize() throws java.lang.Throwable {

super.finalize();

System.out.println(“User Object " + id + " is disposed”);

}

}

关于垃圾回收:

  1. 对象可能不被垃圾回收。只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。

  2. 垃圾回收并不等于 “析构”。

  3. 垃圾回收只与内存有关。使用垃圾回收的唯一原因是为了回收程序不再使用的内存。

finalize() 的用途:

无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。

这就将对 finalize() 的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。不过这种情况一般发生在使用 “本地方法” 的情况下,本地方法是一种在 Java 中调用非 Java 代码的方式。

String


在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

创建方式

class Test {

public static void main(String[] args) {

// 直接赋值方式创建对象是在方法区的常量池

String str1 = “hello”;

// 通过构造方法创建字符串对象是在堆内存

String str2 = new String(“hello”);

// 引用传递,str3 直接指向 st2 的堆内存地址

String str3 = str2;

String str4 = “hello”;

System.out.println(str1 == str2); // false

System.out.println(str1 == str3); // false

System.out.println(str3 == str2); // true

System.out.println(str1 == str4); // true

}

}

常用方法

字符串判断

| 方法 | 描述 |

| — | — |

| boolean equals(Object obj) | 比较字符串的内容是否相同 |

| boolean equalsIgnoreCase(String str) | 比较字符串的内容是否相同,忽略大小写 |

| boolean startsWith(String str) | 判断字符串对象是否以指定的str开头 |

| boolean endsWith(String str) | 判断字符串对象是否以指定的str结尾 |

字符串截取

| 方法 | 描述 |

| — | — |

| int length() | 获取字符串的长度,其实也就是字符个数 |

| char charAt(int index) | 获取指定索引处的字符 |

| int indexOf(String str) | 获取str在字符串对象中第一次出现的索引 |

| String substring(int start) | 从start开始截取字符串 |

| String substring(int start,int end) | 从start开始,到end结束截取字符串。包括start,不包括end |

字符串转换

| 方法 | 描述 |

| — | — |

| char[] toCharArray() | 把字符串转换为字符数组 |

| String toLowerCase() | 把字符串转换为小写字符串 |

| String toUpperCase() | 把字符串转换为大写字符串 |

其他方法

| 方法 | 描述 |

| — | — |

| String trim() | 去除字符串两端空格 |

| String[] split(String str) | 按照指定符号分割字符串 |

StringBuilder 和 StringBuffer


StringBuilder 是一个可变的字符序列。它继承于 AbstractStringBuilder,实现了 CharSequence 接口。

StringBuffer 也是继承于 AbstractStringBuilder 的子类;

但是,StringBuilder 和 StringBuffer 不同,前者是非线程安全的,后者是线程安全的。

常用方法

| 方法 | 描述 |

| — | — |

| public StringBuffer append(String s) | 将指定的字符串追加到此字符序列。 |

| public StringBuffer reverse() | 将此字符序列用其反转形式取代。 |

| public delete(int start, int end) | 移除此序列的子字符串中的字符。 |

| public insert(int offset, int i) | 将 int 参数的字符串表示形式插入此序列中。 |

| insert(int offset, String str) | 将 str 参数的字符串插入此序列中。 |

| replace(int start, int end, String str) | 使用给定 String 中的字符替换此序列的子字符串中的字符。 |

class Test {

public static void main(String[] args) {

StringBuilder sb = new StringBuilder(10);

// StringBuffer sb = new StringBuffer(10);

sb.append(“Test…”);

System.out.println(sb); // Test…

sb.append(“!”);

System.out.println(sb); // Test…!

sb.insert(6, “Java”);

System.out.println(sb); // Test…Java!

sb.delete(4, 6);

System.out.println(sb); // TestJava!

}

}

StringBuilder 和 StringBuffer 用法差不多。

String、StringBuilder、StringBuffer 之间的区别:

首先需要说明的是:

  • String 字符串常量

  • StringBuilder 字符串变量(非线程安全)

  • StringBuffffer 字符串变量(线程安全)

在大多数情况下三者在执行速度方面的比较:StringBuilder > StringBuffer > String

对于三者使用的总结:

  • 如果要操作少量的数据用 = String

  • 单线程操作字符串缓冲区下操作大量数据 = StringBuilder

  • 多线程操作字符串缓冲区下操作大量数据 = StringBuffer

Number


所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。

包装类

| 包装类 | 基本数据类型 |

| — | — |

| Boolean | boolean |

| Byte | short |

| Short | short |

| Integer | int |

| Long | long |

| Character | char |

| Float | float |

| Double | double |

使用方法

实现 int 和 Integer 的相互转换

class Test {

public static void main(String[] args) {

int m = 500;

Integer obj = new Integer(m);

int n = obj.intValue();

System.out.println(n); // 500

Integer obj1 = new Integer(500);

System.out.println(obj.equals(obj1)); // true

}

}

将字符串转换为整数

class Test {

public static void main(String[] args) {

String[] str = {“123”, “123abc”, “abc123”, “abcxyz”};

for (String str1 : str) {

try {

int m = Integer.parseInt(str1, 10);

System.out.println(str1 + " 可以转换为整数 " + m);

} catch (Exception e) {

System.out.println(str1 + " 无法转换为整数");

}

}

}

}

输出结果:

123 可以转换为整数 123

123abc 无法转换为整数

abc123 无法转换为整数

abcxyz 无法转换为整数

将整数转换为字符串

class Test {

public static void main(String[] args) {

int m = 500;

String s = Integer.toString(m);

System.out.println(s); // 500

String s2 = m + “a”;

System.out.println(s2); // 500a

}

}

Math


Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。

常量值

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

String s = Integer.toString(m);

System.out.println(s); // 500

String s2 = m + “a”;

System.out.println(s2); // 500a

}

}

Math


Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。

常量值

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

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

[外链图片转存中…(img-mehmUwHP-1715736356153)]

[外链图片转存中…(img-mRRby6uU-1715736356153)]

[外链图片转存中…(img-B87p2sft-1715736356154)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值