Java集合类简要笔记 - 内部类 包装类 Object类 String类 BigDecimal类

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

匿名内部类

=====

  • 没有类名的局部内部类(一切特征都与局部内部类相同)

  • 必须继承一个父类或者实现一个接口

  • 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象

  • 优点:减少代码量

  • 缺点可读性较差

// 使用匿名内部类优化(相当于创建了一个局部内部类)

Usb usb = new Usb(){ // Usb为一个接口

@Override

public void service(){

sout(“连接电脑成功,fan开始工作”)

}

};

usb.service();

1|2Object 类

===========

  • 超类、基类,所有类的直接或间接父类,位于继承树的最顶层

  • 任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承

  • Object类中所定义的方法,是所有对象都具备的方法

  • Object类型可以存储任何对象

  • 作为参数,可接受任何对象

  • 作为返回值,可返回任何对象

getClass() 方法

=============

  • public final Class<?> getClass(){}

  • 返回引用中存储的实际对象类型

  • 应用:通常用于判断两个引用中实际存储对象类型是否一致

// 判断s1 和 s2是不是同一个类型

Class class1 = s1.getClass();

Class class2 = s2.getClass();

// getClass返回 class类型

hashCode()方法

============

  • public int hashCode(){}

  • 返回该对象的哈希码值

  • 哈希值根据对象的地址或字符串或数字使用hash算法计算出来的int类型的值

  • 一般情况下相同对象返回相同哈希码

s1.hashCode();

s2.hashCode();

// 自然不同

Student s3 = s1; // 此时s3的hashCode与s1相同

toString()方法

============

  • public String toSring(){}

  • 返回该对象的字符串表示(表现形式)

  • 可以根据程序需求覆盖该方法,如:展示对象各个属性值

sout(s1.toString()); // 直接打印包+类名+哈希值

// 重写 alt + enter + s

@override

public String toString(){

return "Student [name = " + name + ", age = " + age + “]”;

}

equals()方法

==========

  • public boolean equals(Object obj){}

  • 默认实现为(this == obj), 比较两个对象地址是否相同

  • 可进行覆盖,比较两个对象的内容是否相同

// 判断两个对象是否相等

sout(s1.equals(s2)); // false

Student s4 = new Strudent(“小明”, 17);

Student s5 = new Strudent(“小明”, 17);

sout(s4.equals(s5)); // false 堆中地址不同

// 重写 改变其比较内容

/*

步骤 1. 比较两个应用是否指向同一个对象

  1. 判断obj是否为null

  2. 判断两个引用只想的实际对象类型是否一致

  3. 强制类型转换

  4. 依次比较各个属性值是否相同

*/

@override

public boolean equals(Object obj){

// 1.

if(this == obj){

return true;

}

// 2.

if(obj == null){

return false;

}

// 3.

// if(this.getClass() == obj.getClass()){

//

// }

// instanceof 判断对象是否是某种类型

if(obj instanceof Student){

// 4.强制类型转换

Student s = (Student)obj;

// 5. 比较属性

if(this.name.equals(s.getName()) && this.age == s.getAge()){

return true;

}

}

return false;

}

finalize() 方法

=============

  • 当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列

  • 垃圾对象:没有有效引用指向此对象时,为垃圾对象

  • 垃圾回收:由gc销毁垃圾对象,释放数据存储空间

  • 自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象

  • 手动回收机制:使用System.gc();通知JVM执行垃圾回收

@Override

protected void finalize() throws Throwable{

sout(this.name + “对象被回收了”);

}

psvm(String[] args){

Student s1 = new Student(“aaa”, 29); // 不是垃圾

new Student(“bbb”, 30); // 是辣鸡 会被回收

//回收垃圾

System.gc();

sout(“回收垃圾”);

// 打印出 “回收垃圾

// aaa对象被回收了”

}

1|3包装类

======

  • 基本数据类型所对应的引用数据类型

  • Object 可统一所有数据,包装类的默认值是null

基本数据类型

包装类型

byte

Byte

short

Short

int

Integer

long

Long

float

Float

double

Double

boolean

Boolean

char

Character

类型转换与装箱、拆箱

==========

  • 8种包装类提供不用类型间的转换方式

  • Number父类中提供的6个共性方法

2. parseXXX( )静态方法

3. valueOf( )静态方法

  • 注意:需保证类型兼容,否则抛出NumberFormatException异常

psvm(String[] args){

// 装箱, 基本类型 → 引用类型

// 基本类型

int num1 = 18;

// 使用Integer类创建对象

Integer integer1 = new Integer(num1);

Integer integer2 = Integer.valueOf(num1);

// 拆箱, 引用类型 → 基本类型

Integer integer3 = new Integer(100);

int num2 = integer3.intValue();

// 上述为jdk1.5之前方法,之后提供了自动装箱拆箱

int age = 30;

// 自动装箱

Integer integer4 = age;

// 自动拆箱

int age2 = integer4;

// 基本类型和字符串之间转换

// 1. 基本类型转成字符串

int n1 = 100;

// 1.1 使用+号

String s1 = n1 + “”;

// 1.2 使用Integer中的toString()方法

String s2 = Integer.toString(n1);

String s2 = Integer.toString(n1, x); // x为进制要求

// 2. 字符串转成基本类型

String str = “150”;

// 使用Integer.parseXXX();

int n2 = Integer.parseInt(str);

// boolean 字符串形式转成基本类型,“true” —> true 非“true ———> false

String str2 = “true”;

boolean b1 = Boolean.parseBoolean(str2);

}

整数缓冲区

=====

  • Java预先创建了256个常用的证书包装类型对象

  • 在实际应用当中,对已创建的对象进行复用

psvm(String[] args){

// 面试题

Integer integer1 = new Integer(100);

Integer integer2 = new Integer(100);

sout(integer1 == integer2); // false

Integer integer3 = new Integer(100);// 自动装箱

// 相当于调用 Integer.valueOf(100);

Integer integer4 = new Integer(100);

sout(integer3 == integer4); // true

Integer integer5 = new Integer(200);// 自动装箱

Integer integer6 = new Integer(200);

sout(integer5 == integer6); // false

// 因为缓存区数组 [-128, 127] 在这之内地址一样

}

1|4String 类

===========

  • 字符串是常量,创建之后不可改变

  • 字符串字面值存储在字符串池中,可以共享

  • String s = “Hello”;产生一个对象,字符串池中存储

  • String s = new String(“Hello”); 产生两个对象,堆、池各一个

常用方法

====

// 1. length(); 返回字符串长度

// 2. charAt(int index); 返回某个位置的字符

// 3. contains(String str); 判断是否包含某个字符串

String content = “java是最好的语言, java no1”;

sout(content.length()); // 10

sout(content.charAt(content.length() - 1)); // 言

sout(content.contains(“java”)); // true

// 4. toCharArray(); 返回字符串对应数组

// 5. indexOf(); 返回子字符串首次出现的位置

// 6. lastIndexOf(); 返回字符串最后一次出现的位置

sout(content.toCharArray());

sout(content.indexOf"java")); // 0

sout(content.indexOf(“java”, 4)); // 从索引4开始找 返回12

sout(content.lastIndexOf(“java”)); // 12

// 7. trim(); //去掉字符串前后空格

// 8. toUpperCase(); toLowerCase(); 转换大小写

// 9. endWith(str); startWith(str); 判断是否以str 结尾、开头

String ct = " hello world ";

sout(ct.trim()); // “hello world”

sout(ct.toUpperCase()); // HELLO WORLD

sout(ct.toLowerCase()); // hello world

sout(ct.endWith(“world”)); // true

sout(ct.startWith(“hello”)) // true

// 10. replace(char old, char new); 用心的字符或字符串替换旧的字符或字符串

// 11. split(); 对字符串拆分

sout(content.replace(“java”, “php”)); // php是最好的语言, php no1

String say = “java is the best language”;

String[] arr = arr.say.split(" "); // “[ ,]+” 表示空格 逗号切分 +号表示切分可以多个 比如多个空格

sout(arr.length); // 5

for(String string : arr){

sout(string);

}

// 打印出

//java

//is

//the

//best

//language

// 补充两个equals/compareTo();比较大小

String s1 = “hello”;

String s2 = “HELLO”;

sout(s1.equalsIgnoreCase(s2));// 忽略大小写比较true

// compareTo(); 两字符不同时比较字符字典序的ascii码

// 字符相同时比较长度 返回差值

案例演示

====

需求:

  1. 已知String str = “this is a text”;

  2. 将str中的单词单独获取

  3. 将str中的text替换成practice

  4. 在text前面插入一个easy

  5. 将每个单词的首字母改为大写

psvm(String[] args){

String str = “this is a text”;

// 2.

String[] arr = str.split(" ");

for(String s : arr){

sout(s);

}

// 3.

String str2 = str.replace(“text”, “practice”);

// 4.

String str3 = str.replace(“text”, “easy text”);

// 5.

for(int i = 0; i < arr.length; i ++){

char first = arr[i].charAt(0);

char upperfirst = Character.toUpperCase(first);

String new = upperfirst + arr[i].substring(1);

}

}

可变字符串

=====

  • StringBuffer : 可变长字符串,运行效率慢、线程安全

  • StringBuilder : 可边长字符串、运行快、线程不安全

效率都比String高且节省内存

psvm(String[] args){

// StringBuffer 和 StringBuilder 用法一致

StringBuffer sb = new StringBuffer();

// 1. append(); 追加

sb.append(“java no1”);

// 2. insert(); 添加、插入

sb.insert(0, “在第一个位置插入”);

// 3.replace(); 替换

sb.replace(0, 9, str); // 左闭右开

// 4. delete(); 删除

sb.delete(0, 5); // 左闭右开

// 5. 清空

sb.delete(0, sb.length());

}

1|5BigDecimal 类

===============

  • 位置 java.math 包中

  • 作用 精确计算浮点数

  • 创建方式 BigDecimal bd = new BigDecimal(“1.0”);

BigDecimal bd1 = new BigDecimal(“1.0”); // 需用字符串

BigDecimal bd2 = new BigDecimal(“0.9”);

// 减法

BigDecimal r1 = bd1.subtract(bd2);

sout(r1); // 0.1

// 加法

BigDecimal r2 = bd1.add(bd2);

//乘法

BigDecimal r3 = bd1.multiply(bd2);

// 除法

BigDecimal r4 = new BigDecimal(“1.4”).subtract(new BigDecimal(“0.5”)).divide(new BigDecimal(“0.9”), x, BigDecimal.ROUND_HALF_UP);

//除不尽时 x填保留位数 后面为四舍五入之意

Date 类

======

Date表示特定的瞬间,精确到毫秒。Date类中的大部分方法都已经被Calendar类中的方法所取代

时间单位:1s = 1,000ms = 1,000,000 μs = 1,000,000,000 = ns

psvm(String[] args){

// 1 创建Date对象

Date date1 = new Date();

sout(date1.toString()); //WED Sept 02 22:25:23 CST 2020

sout(date1.toLocaleString()); // 已过时 但也能用 2020-9-2

// 创建昨天的

Date date2 = new Date(date1.getTime() - (606024*1000));

sout(date2.toLocaleString());

// 2 方法after before

boolean b1 = date.after(date2);

sout(b1); //true

总结

大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。

麻烦帮忙转发一下这篇文章+关注我

就这一次!拼多多内部架构师培训Kafka源码笔记(现已绝版)

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

方法所取代

时间单位:1s = 1,000ms = 1,000,000 μs = 1,000,000,000 = ns

psvm(String[] args){

// 1 创建Date对象

Date date1 = new Date();

sout(date1.toString()); //WED Sept 02 22:25:23 CST 2020

sout(date1.toLocaleString()); // 已过时 但也能用 2020-9-2

// 创建昨天的

Date date2 = new Date(date1.getTime() - (606024*1000));

sout(date2.toLocaleString());

// 2 方法after before

boolean b1 = date.after(date2);

sout(b1); //true

总结

大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。

麻烦帮忙转发一下这篇文章+关注我

[外链图片转存中…(img-QG7mTk3d-1715453727204)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值