JAVA类的静态字符串常量报错_第九章 java常用类

第九章 java常用类

大纲:

70d6188d339ecb948e29607e9edcdc22.png

① String

1.1 String类概述

String:字符串,使用一对""引起来表示。

1.String声明为final的,不可被继承

2.String实现了Serializable接口:表示字符串是支持序列化的。

实现了Comparable接口:表示String可以比较大小

3.String内部定义了final char[] value用于存储字符串数据

4.通过字面量的方式(区别于new给一个字符串赋值,此时的字符串值声明在字符串常量池中)。

5.字符串常量池中是不会存储相同内容(使用String类的equals()比较,返回true)的字符串的。

1.2 String的不可变性 (重点) ※

1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。

2.当对现的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

3.当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

图示:

3a25ca8dc8412cfbbf6202c74aef4d5d.png

1.3 String实例化的两种方式

方式一:通过字面量定义的方式

方式二:通过new + 构造器的方式

480230bb2fc25ee59e38a91b358d0c3c.png

面试题:

String s = new String("abc");方式创建对象,在内存中创建了几个对象?

两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:"abc"

图示:

855d3e3fffb432d87d96ad7815235c45.png

1.4 字符串拼接方式赋值的对比

说明:

1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。

2.只要其中一个是变量,结果就在堆中。

3.如果拼接的结果调用intern()方法,返回值就在常量池中

4 被final修饰的变量也当做常量看待

代码:

a0f8639933d1af3161f6cc3836ecee17.png

1.5 String类的常用方法

0cd9ac2462544097f64d60acfab8ccf7.png

6b1409bc8d5667fd049232883a5cce58.png

1.6 String与其他结构的转换

1.6.1 与基本数据类型、包装类之间的转换

String --> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)

基本数据类型、包装类 --> String:调用String重载的valueOf(xxx)

244b335cef8e3f107b0ba2b24a3252a3.png

1.6.2 与字符数组之间的转换

String --> char[]:调用String的toCharArray()

char[] --> String:调用String的构造器

7214df70d4d68f7b2981a22fa818b4d2.png

1.6.3 与字节数组之间的转换

编码:String --> byte[]:调用String的getBytes()

解码:byte[] --> String:调用String的构造器

编码:字符串 -->字节  (看得懂 --->看不懂的二进制数据)

解码:编码的逆过程,字节 --> 字符串 (看不懂的二进制数据 ---> 看得懂

说明:解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。

8895d94a1caeae3fe631c322acb3b436.png

1.6.4 与StringBuffer、StringBuilder之间的转换

String -->StringBuffer、StringBuilder:调用StringBuffer、StringBuilder构造器

StringBuffer、StringBuilder -->String:①调用String构造器;②StringBuffer、StringBuilder的toString()

1.7 JVM中字符串常量池存放位置说明

jdk 1.6 (jdk 6.0 ,java 6.0):字符串常量池存储在方法区(永久区)

jdk 1.7:字符串常量池存储在堆空间

jdk 1.8:字符串常量池存储在方法区(元空间)

1.8 常见算法题目的考查

3986af4c3542057c6b45e1efe6bad447.png

② StringBuffer和StringBuilder

2.1 String、StringBuffer、StringBuilder三者的对比 (重点) ※

String:不可变的字符序列;底层使用char[]存储

StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储

StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储

对比String、StringBuffer、StringBuilder三者的执行效率:

从高到低排列:StringBuilder > StringBuffer > String

2.2 StringBuffer与StringBuilder的内存解析

fa0486a29874fecdbf992e5541cd9a56.png

问题1. System.out.println(sb2.length());//3

问题2. 扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。

默认情况下,扩容为原来容量的2倍 + 2,同时将原数组中的元素复制到新的数组中。

指导意义:开发中建议大家使用:StringBuffer(int capacity) 或 StringBuilder(int capacity)

2.3 StringBuffer、StringBuilder中的常用方法

1443dd678016cac18a45de5ecd53f52d.png

③④ 关于日期时间的API

后续用到在研究,此处先略过

⑤ java比较器

5.1 java比较器的使用背景

Java中的对象,正常情况下,只能进行比较:==  或  != 。不能使用 > 或 < 的

但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。

如何实现?使用两个接口中的任何一个:Comparable 或 Comparator

5.2 自然排序:使用Comparable接口

说明:

d9daacdb30bd95e26d35259116a9daf7.png

5.3 定制排序:使用Comparator接口

说明:

c3a86286434e78b97b2a1ef80033b2c4.png

两种排序方式对比:

Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小。

Comparator接口属于临时性的比较。

⑥ 其他类

后续再了解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值