String类被修饰为final的好处
-
1.便于实现string常量池
只有当字符串是不可变的,字符串池才有可能实现,字符串池的实现可以在运行时节约很多heap空间.如果字符串是可变的,变量的值被改变了,其他指向这个值的变量也会被改变.
-
2.避免网络安全问题
如果字符串是可变的.那么将引起很严重的安全问题,例如,数据库的用户名 密码都是以字符串的形式传入来获的数据库的连接,因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞.
-
3.使多线程安全
因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的
-
4.避免本地安全性问题
类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载
-
5.加快字符串处理速度
因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。
String常用方法
-
获取
length()
—返回字符串长度// 底层源码 public int length() { return value.length; }
charAr(int index)
– 返回指定位置单个字符//底层源码 public char charAt(int index) { if ((index < 0) || (index >= value.length)) { throw new StringIndexOutOfBoundsException(index); } return value[index]; }
indexOf()
– 有四种形式public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。 public int indexOf(int ch, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。 int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1 int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。