第八章 常用类

8.1 包装类

8.1.1 包装类的分类

1) 针对八种基本数据类型相应的引用类型—包装类

2) 有了类的特点,就可以调用类中的方法。

3) 如图:

8.1.2包装类和基本数据的转换

演示包装类和基本数据类型的相互转换,这里以int和Integer演示。

  1. jdk5前的手动装箱和拆箱方式,装箱: 基本类型->包装类型拆箱:包装类型->基本类型.
  2. jdk5 以后(含jdk5)的自动装箱和拆箱方式
  1. 自动装箱底层调用的是valueOf方法,比如lnteger.valueofo

8.1.3.包装类型特征

特征:自动装箱和拆箱(互相赋值)

如 Integer i =10; int j =i;

8.2 string 类

8.2.1 String 类的理解和创建

1)String对象用于保存字符串,也就是一组字符序列

2)字符串常量对象是用双引号括起的字符序列。例如:"你好"、“12.97"."boy"等

3)字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节。

4)String类较常用构造器(其它看手册):

String s1 = new String ;

String s2= new String(String original);

String s3 = new String(char [ ] a);

String s4= new String(char [] a,int startIndex,int count)

8.2.2创建String对象的两种方式

方式一: 直接赋值 String s = "hspedu";

方式二: 调用构造器 String s = new String("hspedu);

8.2.3―两种创建String对象的区别

方式一:直接赋值 String s="hsp";

方式二:调用构造器 String s2 = new String("hsp");

1.方式一:先从常量池查看是否有"hsp”数据空间,如果有,直接指向;如果

没有则重新创建,然后指向。s最终指向的是常量池的空间地址

2.方式二: 先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。

如果常量池没有"hsp",重新创建,如果有,直接通过value指向。最终指向

的是堆中的空间地址。

3.画出两种方式的内存分布图

8.2.4 字符串的特性

1) String是一个final类,代表不可变的字符序列

2) 字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的.

小结:底层是StringBuilder sb = new StringBuilder(); sb.append(a);sb.append(b);

sb是在堆中,并且append是在原来字符串的基础上追加的.

重要规则:String c1 = "ab" +"cd"; 常量相加,看的是池

String c1 =a+b ; 变量相加,是在堆中

8.2.5 String 类的常见方法

· equals // 区分大小写,判断内容是否相等 equalslgnoreCase //忽略大小写的判新内容是否相等

· length // 获取字符的个数,字符串的长度

· indexOf //获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1

· lastIndexOf //获取字符在字符串中最后1次出现的索引索引从O开始,如找不到,返回-1

· substring //截取指定范围的子串

· trim //去前后空格

· charAt:获取某索引1处的字符,注意不能使用Str[index]这种方式.

· toUpperCase //转换成大写

· toLowerCase //转换成小写

· concat //拼接字符串

· replace //替换字符串中的字符

· split //分割字符串,对于某些分割字符,我们需要转义比如│I等

· compareTo //比较两个字符串的大小

(1)如果长度相同,并且每个字符也相同,就返回0

(2) 如果长度相同或者不相同,但是在进行比较时,可以区分大小

(3)如果前面的部分都相同,就返回str1.len - str2.len

· toCharArray // 转换成字符数组

· format // 格式字符串,%s字符串 %c字符 %d整型 %.2f 浮点型(保留两位)

8.2.6 正则表达式

Pattern类
字符匹配   -  x 匹配x字符   \\  \匹配\字符
[abc]  -a或b或c
[^abc]  -非a或b或c
[a-zA-Z] -匹配a-z或A-Z字符区间
[0-9]或\d  -纯数字    
\D或 [^\d]  -非数字
.  -任意字符
^  -匹配字符串开始部分,一个字符串开始标识,如果出现在[]中表示非
$  -表示匹配字符串结束部分
\w  -匹配数字、字母、下划线
\W  -和上面相反
\s  -匹配任意空白字符(空格或tab)
\S  -和上面相反

X? -匹配小于等于一次,如[s]?表示字符串必须是s或空字符串
X* -0或任意次  如[s]*表示为空字符串,如不为空,则起始字符必须是S,后面如果还有字符,也必须是S
X+ -大于等于一次
X{n} -刚好n次
X{n,} -大于或等于n次
X{n,m}  -大于等于n,小于等于m次

如何使用正则表达式
1.String中的方法matches(reg)
2.f =Pattern.matches(reg,s)
3.上面两种都是
//对于一个规则,如果多次使用,可只用编译一次
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(input);
f= m.matches();

8.3 StringBuffer 类

8.3.1基本介绍

1)java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增册很多方法与String相同,但StringBuffer是可变长度的。

2)StrinaBuffer是一个容器。

  1. StringBuffer的直接父类是AbstractStringBuilder
  2. StringBuffer实现了Serializable,即 StringBuffer的对象可以串行化
  1. 在父类中AbstractStringBuilder有属性char[] value,不是final该value数组存放字符串内容,引出存放在堆中的
  2. StringBuffer是一个final类,不能被继承
  1. 因为StringBuffer字符内容是存在char[]value,所有在变化(增加/删除)不用每次都更换地址(即不是每次创建新对象),所以效率高于String

8.3.2 String VS StringBuffer

1) String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低//private final char value[;

2) StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址,效率较高。

//char[] value;1/这个放在堆.

8.3.3 String 与StringBuffer的转换

  1. String -> StringBuffer

String str= "hello tom";

方式1 :使用构造器

// 注意:返回的才是StringBuffer对象,对str本身没有影响

StringBuffer stringBuffer = new StringBuffer(str);

方式2使用的是append方法

StringBuffer stringBuffer1 = new StringBuffer();

stringBufferl = stringBuffer1.append(str);

  1. StringBuffer ->String

StringBuffer stringBuffer3 = new StringBuffer("韩顺平教育");

方式1: 使用StringBuffer提供的toString方法

String s = stringBuffer3.toString();

方式2:使用构造器来搞定

String s1 = new String(stringBuffer3);

8.4 StringBuilder类

8.4.1基本介绍

1)一个可变的字符序列。此类提供一个与StringBuffer 兼容的 API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作 StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类国为在大多数实现中,它比 StringBuffer要快。

2)在StringBuilder上的主要操作是 append和 insert方法,可重载这些方法,以接受任意类型的数据。

  1. StringBuffer 的直接父类 是 AbstractStringBuilder
  2. StringBuffer 实现了 Serializable, 即 StringBuffer 的对象可以串行化
  1. 在父类中 AbstractStringBuilder 有属性 char[] value,不是 final

// 该 value 数组存放 字符串内容,引出存放在堆中的

  1. StringBuffer 是一个 final 类,不能被继承
  2. 因为 StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除)

// 不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String

  1. StringBuilder的方法,没有做互斥的处理,即没有synchronized关键字,因此在单线程的情况下使用

8.4.2String、StringBuffer和StringBuilder的比较

1)StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样

2) String : 不可变字符序列,效率低,但是复用率高

3) StringBuffer: 可变字符序列、效率较高(增删)、线程安全,看源码

4)StringBuilder:可变字符序列、效率最高、线程不安全

5)String使用注意说明:

string s="a"; //创建了一个字符串

s+="b" ; //实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符

串s+"b”(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能=>结论:如果我们对String 做大量修改,不要使用String

8.4.3String、StringBuffer和StringBuilder的选择

使用的原则,结论:

1.如果字符串存在大量的修改操作,一般使用StringBuffer或StringBuildei

2.如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder

3.如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer

4.如果我们字符串很少修改,被多个对象引用,使用String, 比如配置信息等

StringBuilder的方法使用和StringBuffer一样,不再说.

常用方法

  • append(Object data)    --追加内容
  • insert(index, Object data)  --插入内容
  • delete(start, end)  --删除内容    [2,5)
  • reverse()  --倒置
  • length()   --长度
  • toString()  --转不可变字符串
  • capacity()  --返回缓冲区的当前容量    默认是16字符

String  StringBuffer 和StringBuilder区别 (面试题:)

共同点:都能表示字符序列,都能动态改变字符串长度

不同点:

  1. String 可以通过字符串连接符+或concat方法动态改变,但是会重新生成对象,效率不高
  2. 而可变字符串内部使用了字符缓冲区,追加元素时,直接操作内部缓冲区,不改变对象本身,不会产生新的对象,效率略高
  1. StringBuffer是线程安全的,StringBuilder是线程不安全的。

8.5 MATH类

8.5.1 基本介绍

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

8.5.2 静态方法

8.6 Arrays类

1) toString返回数组的字符串形式Arrays.toString(arr)

2) sort 排序(自然排序和定制排序)Integer arr[l= {1,-1,7,O, 89;}

3)binarySearch 通过二分搜索法进行查找,要求必须排好序

int index = Arrays.binarySearch(arr,3);

4) copyOf 数组元素的复制

Integerll newArr = Arrays.copyof(arr,arr.length);

5)fil数组元素的填充

Integer[l num = new Integer{9,3,21;

Arrays.fill(num,99);

6) equals比较两个数组元素内容是否完全一致

boolean equals = Arrays.equals(arr,arr2);

7) arraysList将一组值,转换成list

List<lnteger> asList = Arrays.asList(2,3.4,5.6.1);

System.out.println("asList=" +asList);

8.7 System类

System类常见方法

1) exit 退出当前程序

2) arraycopy: 复制数组元素,比较适合底层调用,一般使用

Arrays.copyOf完成复制数组.

int[ src={1,2,3);

int[ dest = new int[3];

System.arraycopy(src, o,dest, 0,3);

3) currentTimeMillens: 返回当前时间距离1970-1-1 的毫秒数

4) gc:运行垃圾回收机制System.gcO;

(面试题:)

8.8 BigInteger 和 BigDecimal 类

8.8.1 BigInteger 和 BigDecimal 介绍

应用场景:

1)Biglnteger适合保存比较大的整型

2)BigDecimal适合保存精度更高的浮点型(小数)

8.8.2 BigInteger和 BigDecimal常见方法

1)add 加

2) subtract减

3)multiply乘

4)divide除

8.9日期类

8.9.1 第一代日期类 Date

1) Date: 精确到毫秒,代表特定的瞬间

2) SimpleDateFormat: 格式和解析日期的类

SimpleDateFormat 格式化和解析日期的具体类。它允许进行格式化(日期->文本)、解析(文本->日期)和规范化

常用方法:

Date date = new Date();   --创建日期对象

getTime()   --获取毫秒数

SimpleDateFormat  sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  --实现字符串和日期之间互转

String str =sdf.format(Date date)   --把一个日期对象转为指定格式字符串

Date date =sdf.parse(String s)     --把指定字符串转为日期格式

写一个日期转换工具类

	//把日期转换为字符串格式
	public static String date2Str(Date date, String format) {
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			return sdf.format(date);
		}
	 //把字符串转换为日期
	public static Date str2Date(String dateStr, String format) {
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			Date date = null;
			try {
				date = sdf.parse(dateStr);
			} catch (ParseException e) {
				e.printStackTrace();
				// 异常处理
				throw new RuntimeException("日期格式字符串错误:" + dateStr);
			}
			return date;
		}

8.9.2 第二代日期类 :日历类

1 )第二代日期类,主要就是Calendar类(日历)

public abstract class Calendar extends object implements Serializable,

cloneable,Comparable<calendar>

2) Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH.DAY OF MONTH、HOUR等日历全段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

1 常用方法

getInstance()    --获取实例对象方法

getTime()       --获取日期对象

set(Calendar.YEAR, 2021)  --设置年份

set(2020,01, 01)     --设置年月日 ( 月份需要加1 )

get(Calendar.YEAR)    --获取年份

getTimeInMillis()    --获取毫秒数

System.currentTimeMillis() --毫秒数

8.9.3 第三代日期类

前面两代日期类的不足分析:
JDK1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK1.1引入Calendar类之后被弃用了。而Calendar也存在问题是;
1)可变性:像日期和时间这样的类应该是不可变的。
2)偏移性:Date中的年份是从1900开始的,而月份都从O开始。
3)格式化:格式化只对Date有用,Calendar则不行。
4)此外,它们也不是线程安全的;不能处理闰秒等(每隔2天,多出1s).

1) LocalDate(日期/年月日)、LocalTime(时间/时分秒)、LocalDateTime(日期时间/年月日时分秒) JDK8加入

LocalDate 只包含日期,可以获取日期字段 (年月日)

LocalTime 只包含时间,可以获取时间字段 (时分秒)

LocalDateTime 包含日期+时间,可以获取日期和时间字段。

2)DateTimeFormatter

格式日期类类似于SimpleDateFormat

DateTimeFormat dtf = DateTimeFormatter.ofPattern(格式);

String str = dtf.format(日期对象);

案例演示:

LocalDateTime Ildt = LocalDateTime.now();

//关于 DateTimeFormatter的各个格式参数,需要看jdk8的文档.

DateTimeFormatter dtf =DateTimeFormatter.ofPattern("yyy年MM月dd日HH小时mm分钟ss秒");

String strDate = dtf.format(ldt);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值