《张三记录-java》常用方法,String、 StringBuffer、StringBuilder,正则,日期

本文深入讲解Java中的核心类,包括Object、String、StringBuffer、StringBuilder等的基础使用与高级特性,探讨包装类、日期处理类及数学运算类的应用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用类

一.Object

1.简介

java.lang.Object 类 所有类的根,所有类都直接或者简间的继承了Object类

Object 类中11个方法,需要掌握

2.常用方法

方法名作用
getClass获取对象的运行是类的Class对象
equals比较两个对象是否相等
hashCode获取对象的hashCode值
toString将对象转换为字符串
clone克隆对象
finalize对象被回收是自动调用

2.1getClass()

主要用于反射(后面讲)。 返回一个Class对象,表示一个运行时类,简单来说,可以认为是字节码文件(当前对象运行的字节码文件)

字节码文件 也是一个Class类型的对象

类名.class : 同样返回一个Class类型的对象

Object类中多个方法是被native关键词修饰的

  • 称为 本地方法
  • 该方法的方法体不是由java语言实现的,主要用来调用计算机本地的底层语言, 如 C 或 C++

2.2equals()

equals 和 == 的区别:

  • == 判断是否引用同一个对象。(判断基本类型时比较的是值,判断引用类型比较的是地址)

  • equals 如果没有被重写,默认和 == 区别。(Object类中的equals源码就是使用== 来比较的)

    String类中对equals方法进行了重写,字符串和字符串的比较 比的是值

  • 如果重写了equals方法,则按照重写后的规则进行比较

说明:

  • 自定义类可以重写equals方法,实现对特定属性的比较
  • 通过开发工具自动生成 ( equals 和 hashCode 一起重写)

2.3hashCode()

返回对象的hashCode值,哈希码值

  • hashCode值是为了支持数据结构-- 哈希表 (hashtable)

  • 如果没买重写方法,默认返回为对象的内存地址相关的数值

  • 重写equals方法是,要求重写hashCode()方法,

    如果两个对象的equals方法比较为true时,则两个对象的hashCode值也应该相同— 重写hashCode()方法

    如果两个对象的equals方法比较为false时,不强制要求hashCode值一定不同。但为不同对象产生不同的hashcode值可以提升哈希表的性能(集合时在讲)

2.4toString()

将对象转换为字符串的形式

  • 当直接输出对象时,会自动调用了对象的toString()方法。本质上输出的是toString()方法的返回值
  • 如果没有重写该方法,默认返回值: 全类名/完整类名 + @ + 16进制的hashCode值
  • 通过重写该方法,输出对象时可以是返回需要的信息,便于查看结果,一般用于测试

2.5clone()

用于克隆对象

对象被克隆的要求:

  • 必须重写clone()方法,且要调用super.clone()方法
  • 被克隆对象的类 必须实现Cloneable接口,表示该类可以被克隆

浅克隆 与深克隆

  • 浅克隆 : 只克隆第一层,不克隆它所引用的对象 ---- Object类中的clone()方法是浅克隆
  • 深克隆: 把要克隆的对象所引用的其他对象都进行克隆----需要自己写方法实现

2.6finalize()

该方法不需要程序员手动调用,由垃圾回收器自动调用

垃圾回收机制(gc机制):

gc过程:

  • 每个对象上,都会存在一个int类型的变量,叫做引用计数器
  • 每当有一个引用指向该对象时,引用计数+1
  • 每当有一个引用不再指向该对象时,引用计数-1
  • 当引用计数值为0时,gc就认为该对象为垃圾对象
  • gc会在合适的时机(算法)去对该对象进行回收,释放内存资料
  • 当gc在回收对象时,就自动调用finalize();
  • System.gc() 建议jVM进行垃圾回收

二.String

1.简介

java.lang.String 字符串,是java中最常用的类型

创建字符串:

  • 直接创建
  • 使用new关键字创建(构造方法创建)

2.常用方法

方法作用
length获取字符串长度
indexOf获取指定子串第一次出现的位置,如果找不到则返回-1
lastIndexOf获取指定子串最后一次出现的位置
substring获取指定索引范围内的子串,即截取字符串,范围[beginIndex,endIndex),左闭右开
charAt获取指定索引位置的字符
startsWith判断是否以指定子串开头
endsWith判断是否以指定子串结尾
contains判断是否为空字符串
equals判断值是否相等
equalsIgnoreCase判断是否相等,忽略大小写
toLowerCase转换为小写
toUpperCase转换为大写
replace替换
trim去掉字符串首尾的空格
split将字符串分割为数组
toCharArray将字符串转为字符数组
getBytes将字符串转为字节数组
join将多个元素以指定分隔符拼接为字符串 静态方法 String.join() JDK8新增的方法

3.字符集

字符: 各种文字和符号的总称。

常用字符集: ASCII ISO-8859-1 GBK UTF-8

Windows系统中默认使用GBK,linux 和 MacOS 使用UTF-8

计算机底层使用二进制, (1,0) 在处理各种字符时,需要对进行编码和解码

  • 将字符串转为字节数组 ---- 编码
  • 将字节数组转为字符串 ---- 解码

如果编码和解码的字符集不一致,就会导致中文乱码

4.正则表达式

4.1 简介

正则表达式也是一门独立的语言,有自己的语法,用于检测指定字符串是否符合特定的规则

通过正则表达式定义规则

4.2 规则

正则表达式 由 元字符 转义字符 限定字符 构成

  • 元字符:组成正则表达式的字符
  • 转义字符 \
  • 限定字符: 限制字符的个数
示例作用
a只能是a
a|ba或者b
a{5}只能是a,并且有5位
a{5,}只能是a,至少有5位
a{m,n}只能是a,m到n位
a*只能是a, 0到多位,可有可无
a+1到多位,至少一位
a?0到一位 , 最多一位
[a-z]{5}由小写字母组成,并且5位
[a-zA-Z]{5}由字母组成,并且5位
[a-zA-Z0-9]{2,}字母 0-9,最少2位
.任意一个字符
\d数字
\D非数字
\w数字 字母 下划线
\W非(数字 字母 下划线)
\s空格
\S非空格

示例:

  • 手机号的正则(数字 11位 第一位为1) 1\d{10}
  • 密码的规则:5-16位, 只能包含数字,字母,下划线,首位为大写字母 [A-Z]{1}[a-zA-Z0-9_]{4,15}

4.3 用法

String中 支持正则表达式的方法

方法名作用
matches判断某个字符串是否匹配指定的规则
replaceAll替换,作用和replace一样,区别在于 支持正则
split使用正则表达式,定义一个分割的规则

5.不变性

字符串的值一旦确定,则不可修改。

可修改是指的内存中的值不能在修改。

6.常量池

String常量:使用双引号直接创建的字符串,称为String常量,即字符常量

  • 字符常量放在内存的常量池中
  • 常量池中的值不会被gc回收,垃圾回收机制不会清理该区域的内容
  • 多次出现的相同字符常量,只会在常量池中创建一个String对象

常量池的位置:

  • jdk1.8 常量池在 与 堆空间相独立的位置
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OCGb6Op9-1610939552478)(img/常量池.png)]

三.StringBuffer 和StringBuilder

1.简介

Stringbuffer 和Stringbuider都是用来处理字符串的

String 是不可变字符串,不可修改

  • 频繁对String进行修改,会在内存中产生很多对象,垃圾数据
  • String类中提供了很多方法,但没有增删改等操作方法

如果在程序中频繁对字符串进行修改,建议使用StringBuffer 和StringBuilder 可变字符串

这两个类的用法基本一致

2.常用方法

方法含义
append()向末尾追加
insert向指定的索引位置插入数据
delete根据索引的范围删除字符
deleteCharAt根据索引删除一个字符
setCharAt根据索引修改
setLength保留指定的长度
reverse反转
toString转为String类型

3.区别

StringBuffer

  • 线程安全(多个人同时访问一个字符串,不会出现问题)
  • 效率低

StringBuilder

  • 线程不安全的(多个人同时访问一个字符串,可能会出现问题)
  • 效率高

四.包装类

1.简介

基本数据类型的功能比价简单,不具有面向对象的特点。

java中为每个基本类型的都提供了一个对应的包装类,使其具有面向对象的特点。

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

特性:

  • 包装类的默认值为 null
  • 包装类属于值传递
  • 包装类中提供了一些方法

2.基本类型和包装类的转换

装箱和拆箱

  • 将基本类型转为包装类型 – 装箱
  • 将包装类型转为基本类型 — 拆箱

在JDK1.5后,支持自动装箱和拆箱

3.基本类型和String类型的转换

/**
* 将基本类型   ----- String
*/

int a = 8;
//1.简单处理
String s1 = a+"";
//2.通过调用包装类的方法
String s2 = Integer.toString(a);
String s3 = Double.toString(12.3);
String s4 = Float.toString(12.3f);

//3.通过调用String类的方法
String s5 = String.valueOf(a);
String s6 = String.valueOf(12.6);

/**
* String  ---- 基本类型
*/

String  str = "11";// 数值形式的字符串,才能转换

//1. 通过调用包装类的方法
int i = Integer.parseInt(str);
double d = Double.parseDouble(str);
boolean b = Boolean.parseBoolean(str);
System.out.println(b);

//2.
int n1 = Integer.valueOf(str);
double n2 = Double.valueOf(str);

System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);

五.其他类

1.Date

1.1简介

java.util.Date 表示日期

java底层使用long类型来表示日期

  • long类型表示当前时间的毫秒值
  • 毫秒值是基于 1970/01/01 00:00:00 开始的, 这个时间被认为是计算机的起始时间(纪元时间)

Date类中有多个方法都是过时的,不建议使用

1.2方法

Date d = new Date();// 当前日期
d.getTime();//获取毫秒值
d.setTime(6000);//设置毫秒值
System.out.println("设置的时间为:"+d);

//after  判断某个时间是否在指定时间之后
Date d1 = new Date(111);
Date d2 = new Date(222);
System.out.println(d1.after(d2));

//befor() 之前

//a.compareTo(b)

System.out.println(d1.compareTo(d2));

1.3Date和String的转换

使用java.text.SimpleDateFormat 日期格式化类

具体格式参考api

	Date date = new Date();
		System.out.println(date);
		// Date --String
		// 1.指定一个日期格式    
//		SimpleDateFormat  df = new SimpleDateFormat(" yyyy年MM月dd日  hh:mm:ss E");
		DateFormat  df = new SimpleDateFormat(" yyyy年MM月dd日  hh:mm:ss E");
		
		//2. 调用方法进行格式化
		String s = df.format(date);
		System.out.println(s);
		
		//String  --Date
		String str = "2018/12月01日";
		// 格式要与字符串中的格式匹配    --  ParseException (格式不匹配包 错误)
		SimpleDateFormat  df2 = new SimpleDateFormat("yyyy/MM月dd日");
		Date d  = df2.parse(str);
		System.out.println(d);

2.Calendar

2.1 简介

java.util.Calendar 表示日历,用于日期的运算和取值

Calendar 是一个抽象类,不能通过new来创建,使用静态方法getInstance()获取一个实例

2.2常用方法

	Calendar c = Calendar.getInstance();
		
		/**
		 * 常用方法
		 */
		// getTime();  将Calendar  转为 Date
        Date d =	c.getTime();
        System.out.println(d);
        
        //setTime()  设置时间
        c.setTime(new Date());
        
        
        // get() 获取指定的时间段
        System.out.println(c.get(Calendar.YEAR));//年
        System.out.println(c.get(Calendar.MONTH)+1);//月    返回 0-11
        System.out.println(c.get(Calendar.DAY_OF_WEEK));//星期    返回1-7  1 星期天
        
        //set() 设置日期时间
        c.set(Calendar.YEAR, 2020);
        c.set(Calendar.DATE, 12);
        
        c.set(2019, 01, 01);
        
        // add() 添加日期
        c.add(Calendar.YEAR, 2);// +2 年
        c.add(Calendar.MONTH,2);// +2月
        
        //getTimeInMillis()获取毫秒值
        System.out.println(c.getTimeInMillis());
        
        c.clear();//清空
        
        System.out.println(c.getTime());
        

3.Math

java.lang.Math用于数学运算

Math类中所有的方法都是静态方法

// 常量
		System.out.println(Math.PI);//圆周率
		System.out.println(Math.E);//自然对数
		
		
		//方法
		double a = 3.821545;
		//round() 四舍五入
		System.out.println((int)a);
		System.out.println(Math.round(a));//返回 long类型
		System.out.println(Math.round(a*100)/100.0);//保留两位小数
		
		//floor 返回小于等于参数的最大整数
		System.out.println(Math.floor(a));//3.0
		//ceil  返回大于等于参数的最小整数
		System.out.println(Math.ceil(a));//4.0
		
		//abs 绝对值
		System.out.println(Math.abs(-5));
		
		//pow 求次方
		System.out.println(Math.pow(2, 5));
		
		// random()  产生【0,1)
		System.out.println(Math.random());
		System.out.println((int)(Math.random()*100));// [0,100)
		System.out.println((int)(Math.random()*61)+20);//[20,80]

4.Random

java.util.Random 用于生成随机数

	Random r = new Random();
		
		System.out.println(r.nextInt());
		System.out.println(r.nextInt(100));//[0,100)
		System.out.println(r.nextInt(61)+20);//[20,80]
		
		
		System.out.println(r.nextDouble());
		System.out.println(r.nextBoolean());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值