String
理解和创建对象
- Serializable 说明String可以串行化
- Comparable 说明String对象可以比较
说明
- String对象用于保存字符串,也就是一组字符序列
- "jack"字符串常量,双引号括起的字符序列
- 字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
- String 类有很多构造器,构造器的重载
- String类实现了接口 Serializable 【String 可以串行化:可以在网络传输
- 实现了接口 Comparable [String 对象可以比较大小]
- String是final类,不能被继承
- String有属性 private final char value[];用于存放字符串内容
- 一定要注意:value是一个final类型,不可以修改。这里指的是地址不可修改。值可以修改
- 即value不能指向新的地址,但是单个字符内容是可以变化
两种创建方式
String的内存布局
下面来一段代码看看实际情况
可以知道以下结论
- String内部重写了equals方法。
- 用直接赋值创建的String其实是同一个东西,内容相同,地址相同
- 用==不相等的原因就是地址是不同的。堆中的String保存了指向常量池字符串的地址。
intern方法
说简单一点,就是返回堆中String保存的常量池中字符串的地址,就是String的内存布局图里面,返回OX99
##测试题
这里需要注意的是。p1.name==p2.name
实际上是相同的
字符串特性
创建了两个字符串常量对象
String a="hello";
String b="good";
String c=a+b;
String d="hello"+"good";
- 先创建一个
StringBuilder sb = StringBuilder()
- 执行
sb.append("hello")
- 执行
sb.append("good")
- 执行`sb.toString()
- 其实是c指向堆中的对象(String) value[ ] ->池中"helloabc"
- 一共创建了三个对象
- 注意
String c=a+b
和String c="hello"+"good"
创建方式不同
最后的输出结果为:hspandhava
常见方法
说明
常见方法1
- equals(str) 区分大小写,判断内容是否相等
- equalslgnoreCase(str) 忽略大小写的判断内容是否相等.
- length()获取字符的个数,字符串的长度
- indexOf(char) 获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1
- indexOf(str) 获取子串在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1。lastIndexOf用法相同
- lastIndexOf(char)获取字符在字符串中最后1次出现的索引,索引从0开始,如找不到,返回-1
- substring(start,end)截取指定范围的子串,左闭右开[start,end)
- substring(index)从索引index开始截取后面所有的内容,包括index
- trim() 去前后空格
- charAt:获取某索引处的字符,注意不能使用
Str[index]
(即数组的方式)这种方式.
常见方法2
-
toUpperCase() 将字符串中的字符全变成大写
-
toLowerCase() 将字符串中的字符全变成小写
-
concat(str) 拼接字符串,可以链式。比如
s1 = s1.concat("林黛玉").concat("薛宝骊").concat("together");
-
replace(oldstr,newstr) 替换字符串中的字符。把字符串中所有oldstr替换成newstr。这里注意,s1.replace()方法执行后,返回的结果才是替换过的,原来数组未发生改变
-
split(str)分割字符串,以str为标准对原字符串分割,对于某些分割字符,我们需要转义比如
|
\\
等。在对字符串进行分割时,如果有特殊字符,需要加入转义符\
-
compareTo(str) 比较两个字符串的大小。如果前者大,返回正数,后者大返回负数,相等返回0。根据ASCII表对每一个字符进行判断的。
-
toCharArray() 转换成字符数组
-
format格式字符串,
%s字符串
%c字符
%d整型
%.2f 浮点型表示保留两位小数并且进行四舍五入的处理
(称为占位符)案例,将一个人的信息格式化输出。复用性很高
StingBuffer
基本介绍
解读
- StringBuffer 的直接父类是AbstractStringBuilder
- StringBuffer实现了 Serializable,即StringBuffer的对象可以串行化
- 在父类中 AbstractStringBuilder有属性 char[] value ,不是final.该value数组存放字符串内容,引出存放在堆中的
- StringBuffer是一个final类,不能被继承
- 因为StringBuffer字符内容是存在char[] value,所有在变化(增加/删除)不用每次都更换地址(即创建新对象)
String和StringBuffer
如果用StringBuffer进行字符拼接,速度要比String快很多
StringBuffer的构造器
通过给一个String 创建StringBuffer ,char[]大小就是 str.length() +1
String和StringBuffer互相转换
常用方法
说明
- append
- delete(start,end)删除下标为start到end的字符,不包括end。[start,end)
- replace(start,end,str)使用str替换索引为[start,11)的字符
- insert(index,str)在索引为index的位置,插入str,原来索引为index的内容自动后移
注意事项
先看一个截图
底层调用的是 AbstractStringBuilder 的appendNull。其中appendNull方法会把null直接转化成"null"字符串。append的参数里不能写为null,str=null的时候也不能.length,会报错。
另一个截图
String str=null;
StringBuffer sb2=new StringBuffer(str);
这里是StringBuffer的构造方法,这里是直接用了str.length,但是传入的str是null,直接报空指针异常!
StringBuilder
基本介绍
这里有两个注意点
- 一个是线程不同步,文中说的是不保证同步。
- 速度比StringBuffer快,重载了方法可以接受任意类型的数据
常用方法
串行化(对象可以网络传输,可以保存到文件)