学习JavaSE中的常用API要学会:
1 谁的方法(哪个类的)
2 什么方法(静态还是成员)
3 功能是什么(能干啥)
4 需要传入什么参数
5 返回什么数据
6 方法名
一、String是什么
1. String 是字符串类,保存在java.lang包下,使用是不需要导入。
2. 注意的是,String虽然在很多语言中是基本类型,但是在java中是引用类型,因为String是个类。
既然是引用类型,就意味着,肯定要使用equals比较,而不能使用==比较,String类中已经覆写了equals方法,比较的是值。
3. String底层是char数组,所以String很多特性就是数组特性。
注意:
(1)字符串一旦创建,不能修改,所以不推荐使用字符串进行大量字符串拼接工作。
(2)为了提高字符串使用效率,java虚拟机使用了一种缓存技术(字符串常量池),正常我们接触的对象都是new在堆内存的,而字符串,而字符串是保存在常量池的。
(3)在程序中,如果要用到某个字符串,会先去常量池中检索是否存在,如果存在就不需要创建,直接拿走使用,如果不存在,则会新建一个,并返回新建的字符串对象。
(4)如果是new的方式,会在堆内存创建一个对象,并且如果常量池中没有的话,也会在常量池中创建一个。
二、新生代/老年代/永久代/元数据区
为什么要分成新生代和老年代? 因为和垃圾回收有关。
新生代/年轻代 : 对于新生代对象,他们都有个共同的特点,就是创建对象之后,很快就不用了,就被回收了,所以需要一个独立的回收算法
老年代 : 老年代中的对象,特点是长期存储,所以需要另一种回收算法。
永久代 : 方法区可以理解为是永久代,存活时间比较长,但是也会被回收。
1 首先该类的所有实例对象都已经被回收了
2 其次加载这个类的ClassLoader也被回收了
3 最后,其他类也没有使用到这个类,满足这三个要求,就可以被回收了
注意:
(1)1.7之前,字符串常量池是保存在运行时常量池中(方法区),属于永久代,但是java7开始,字符串常量池就被移动到堆内存中的老年代内存中了,因为永久代空间比较有限。
(2)但是1.8开始,方法区又被分割出来了,只不过实现方式不再是永久代了,而是元数据区,运行时常量池就在元数据区(最终保存在本地),而字符串常量池,还在堆内存中。
三、基本使用
仍需注意:在程序中,如果要用到某个字符串,会先去常量池中检索是否存在,如果存在就不需要创建,直接拿走使用,如果不存在,则会新建一个,并返回新建的字符串对象。如果new的方式,会在堆内存创建一个对象,并且如果常量池中没有的话,也会在常量池中创建一个。
注意代码中s1与s2是来自字符串常量池中的同一个地址,但s3使用了"new"创建,所以会在堆内存中新开辟一个空间,而s3指向这个堆内存地址,所以"=="下,s1与s2相同,但是s1与s3并不同。所以字符串的比较一定要用equals方法。
四、构造方法
1. 字面量写法(三种)
2. 字节数组
3. 字符数组
五、常用方法
1. char CharAt(int index):获取字符串中指定下标的字符。
2. boolean endsWith(String str):判断字符串是否以指定字符串结尾。
boolean startsWith(String str):判断字符串是否以指定字符串开始。
3. boolean equals(String str):区分大小写的比较。
boolean equalsIgnoreCase(String str):不区分大小写的比较。
4. byte[] getBytes() : 把字符串转换为字节数组返回。
5. char[] toCharArray() : 把字符串转换为字符数组返回。
6. int indexOf(String str) : 获取字符串中指定字符串出现的起始索引,找不到返回-1。
int lastIndexOf(String str) : 最后一次出现的索引。
7. int length() : 返回字符串长度。
8. String replace(String s1,String s2) : 把s1全部替换为s2,不支持正则表达式。
String replaceAll(String s1,String s2) : 支持正则表达式。
9. String[] split(String regex) : 以指定字符串进行分割,返回字符串数组,支持正则表达式。
10. String trim() : 删除字符串两边空格。
11. String substring(int begin) : 获取字符串以某个下标起始的子字符串(包含)。
String substring(int beginindex,int endindex):获取字符串以某个下标起始(包含),到某个下标结束(不包含)的子字符串。
12. String toUpperCase() 转换为大写 。
String toLowerCase() 转换为小写。
上面所有的结果为:
六、注意事项
不要频繁进行字符串拼接
上面代码的结果为: