1. String字符串
1)String类型介绍
String类采用final修饰,String对象为不可变对象,一旦在内存中创建,内容不能发生变化,若要对字符串内容改变,那么就会创建新对象。
String对象创建,有静态和动态之分。
String str1 = "dadsadad";
String str2 = new String("dasdasdadad");
2)String常量池
JVM对字符串有一个限制,让字符串作为不变对象,这样就可以做到重用。事实上,当我们通过字面量,常量来初始化一个字符串时,JVM首先会从字符串的常量池(一个JVM内部维护的内存区域,用来保存已经创建过的字符串对象)中查询用来保存该字符串的对象是否存在,若存在则直接引用,若不存在则创建该字符串对象并存入常量池,然后引用它。
3)字符串的常用方法
String str = "dn1aAj2FD6hbF4hjaX0f";
① str.length(),获取字符串的长度,返回int类型的数值
② str.indexOf(char c),获取字符串中某个字符第一次出现的索引,找不到,返回值为-1。
str.lastIndexOf(char c), 返回指定字符在此字符串中最后一次出现的索引,找不到,返回值为-1。
③ str.charAt(int index),获取字符串指定下标位置上的字符,返回值是char类型的。
④ str.toUpperCase(),将字符串str全部转成大写,
str.toLowerCase(),将字符串str全部转成小写,返回的都是新的字符串。
⑤ str.stratsWith(String s),判断字符串str是不是以字符串s开头,
str.endsWith(String s),判断字符串str是不是以s结尾,返回值都是boolean类型的。
⑥ str.equals(String s),判断两个字符串的内容是否相等(在前一章已经分析了==和equals()的区别了),返回boolean类型。
⑦ str.replace(char oldChar, char newChar):将字符串中匹配odChar的字符全部替换成新的newChar字符,返回新的字符串。
⑧ str.subString(int begin),截取字符串中某一段字符,从下标begin开始,截取到最后,
str.subString(int begin, int end),截取字符串中某一段字符,从下标begin开始,到end-1结束,返回的是一个新的字符串。
⑨ str.split(String regex): 参数regex为一个字符串规则,以regex所表示的字符串为分隔符,将字符串拆分成字符串数组。
其中,regex所表示的字符串不被保留,即 不会存到字符串数组中,可理解为被一刀切,消失!
⑩ str.trim(),去掉字符串前后两端的空格,返回新的字符串。
案例1:
结果:
2. StringBuilder、StringBuffer类
String类我们已经得知,它是不变对象,那么每当对内容修改时都会引发新对象的创建。那么当我们有一个需求是需要频繁修改字符串时,这样不仅不能减少内存的开销,返回会增加内存的开销。为此java为我们提供了一个专门用于修改字符串内容的类StringBuilder类, 该类封装了可变的字符串,换句话说,当我们需要改变字符串内容时,并不会创建新对象,而是在原对象基础上进行修改。从而减小了内存的开销。
StringBuilder类的常用方法有:
append(String str):追加字符串;
insert (int index,String s):从指定下标位置插入字符串;
delete(int start,int end):从起始下标删除字符串到end结束下标,end要大于等于start,可以超出数组总长度;
replace(int start,int end,String str): 替换字符串;
reverse():字符串反转。
案例2:
结果:可以看出效率方面对比性很强。
案例3:
结果:
StringBuffer类,是JDK早期的版本,StringBuffer是线程安全的可变字符序列。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。
通常,如果 sb 引用 StringBuilder 的一个实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。只要发生有关源序列(如在源序列中追加或插入)的操作,该类就只在执行此操作的字符串缓冲区上而不是在源上实现同步。每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。
从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 java.lang.StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。