对String类的理解
String类这部分的知识点不是很难里面用到的方法都可以从API中查到有些常用的方法记一下其他去查学会看懂API如何正确去应用里面的内容。1.String类的重要性在c语言中已经涉及到字符串了但是在c语言中要表示字符串只能使用数组或者指针可以使用标准库提供的字符串系列函数完成大部分操作但是这种将数据和操作方法分离开的方式不符合面向对象的思想而字符串应用又非常广泛因此Java语言专门提供了String类。2.常用方法2.1字符串构造String类提供的构造方法有很多常用的就以下三种1.使用常量串构造2.直接newString对象3.使用字符数组进行构造注意1.String是引用类型内部并不存储字符串本身,在String类中的实现源码中String类实例变量如下为啥说String是不可变的呢1String这个类本身被final修饰不可以被继承2其次value被private final修饰只能在这个类中使用还不能被修改3所有修改字符串的方法都返回一个新的String对象而不是修改原对象。s1和s2是两个完全独立的对象s3指向s1的对象所以s1和s3的值一样2.在Java中引起来的也是String类型对象在java中所有被“”引起来的内容都是字符串对象都被存放到字符串常量池当中它也能直接调用String类的方法从而验证它是字符串对象。2.2String对象的比较字符串的比较是常见的操作之一比如字符串排序。Java中总共提供了4种方法1.比较是否引用的是同一个对象注意对于内置类型基本类型比较的是变量中的值对于引用类型比较的是引用中的地址。通过这个代码大家应该能很清晰的看出来不同了。2.boolen equals(Object anObject)方法按照字典序比较字典序字符大小的顺序String类重写了父类Object中的equals方法Object中equals默认按照比较String重写equals方法以后按照如下规则进行比较比如s1.equalss23.intcompareToString s方法按照字典序进行比较与equals不同的是equals放回的是boolean类型而compareTo返回的是int类型具体比较方式1先按照字典次序大小比较如果出现不等的字符直接返回这两个字符的大小差值。2如果前k个字符相等k为两个字符长度最小值返回值为两个字符串长度差值。上面代码第二个注释写的有问题应该是前面字符都一样拿当前的减后面所对比的4.int compareTolgnoreCaseString str2.3字符串查找字符串查找也是字符串中非常常见的操作String类提供的常用查找的方法把常用的记一下其他在API中查找就行1.判断类方法2.比较大小/字典序返回int3.获取信息类4.截取/分割/替换5.转换类6.这些就是字符串常用的方法2.4转化1.数值和字符串转化数值-----字符串2.字符串-----数字用包装类.parseXXX ()2.大小写转换3.字符串转数组2.5字符串替换使用一个指定的新的字符串替换掉已有的字符串数据可用的方法如下普通字母/数字替换replace和replaceAll方法一致关键区别遇到正则表达式注意由于字符串是不可变对象替换不修改当前字符串而是产生一个新的字符串2.6字符串的拆分最简单的示例特殊符号不能直接拆必须加转义字符多次拆分2.7字符串的截取2.8字符串的不可变性String是一种不可变对象字符串中内容是不可改变的。字符串不可被修改是因为String 不可被修改是因为它的底层存储字符的数组被 private final 修饰并且 String 类本身没有提供修改这个数组的方法1.底层是被private final修饰的final数组地址不能变private外部无法直接访问和修改数组里面的内容2.String类没有提供修改value数组的任何方法3.String类被final修饰无法被继承子类无法重写破坏其不可变性。网上有人说字符串不可变是因为其内部保存字符的数组被final修饰因此不能改这是错误的说法final修饰类表示不想被继承final修饰引用类型表示该引用变量不能引用其他对象只锁地址不锁内容但是引用对象中的内容是可以改变的真正让value数组不能改变的是private1final修饰变量值不能改很明显会报错2final修饰数组数组不能改里面的内容可以改3final修饰方法子类不能重写4final修饰类子类不能继承为啥String类要被设计成不可变的支持字符串常量池实现字符串复用节约内存空间天然线程安全多线程环境下无需额外同步锁哈希值固定适合作为哈希表HashMap/HashSet的键提升安全性避免账号、路径等敏感数据被篡改。那如果想修改字符串中的内容该如何操作呢2.9字符串的修改注意尽量避免直接对String类型对象进行修改因为String类是不能修改的所有的修改都会创建新的对象效率非常低下。String 不可变不能修改原对象每次拼接、修改都会创建新的临时字符串大量修改会产生很多垃圾对象耗内存、降效率要频繁修改必须用 StringBuilder总结String拼接不断创建对象速度最慢--------少量字符串用StringBuffer在原对象修改线程安全速度中等-------大量拼接多线程StringBuilder在原对象修改线程不安全速度最快-------大量拼接单线程StringBuilder的底层底层就是一个char[]数组可变数组自带扩容机制1.底层源码StringBuilder继承它所以底层就是char[] value2.和String的区别最关键Stringfinal修饰数组地址不能改一拼接就创建新对象新数组所以巨慢stringBuilder数组内容可以随便改拼接直接往里面加不创建对象所以飞快3.append到底做了什么底层逻辑底层只做三件事1.看数组够不够放2.够直接塞进数组3.不够自动扩容新数组原来数组*224.计数1全程不创建新对象StringBuilder的toString方法StringBuilder的toString方法不会复制原有数组而是直接new一个String对象把数组内容拷贝过去返回一个不可变的String1.底层源码2.底层执行流程1.StringBuilder内部有一个char[] value可变数组2.调用toString3.new String···创建一个新字符串4.把数组内容复制到String的数组里5.返回这个新的不可变String3.StringBuilder和StringBuffer3.1StringBuilder和StringBuffer的常用方法会用StringBuilder就会用StringBuffer3.2String和StringBuilder之间的转换1.String----StringBuilder(1)构造方法常用2append追加2.StringBuilder----String唯一的常用方法调用toString()3.关键要点1转换后是独立对象转换后的新字符串/字符序列和原对象互不影响修改一方不会改变另一方。2使用场景频繁拼接增删字符先转StringBuilder操作效率更高操作完成后在转回String使用很多方法只接受String类型3同理StringBuffer和StringBuilder 的转换规则、写法完全一致。3.3StringStringBuilderStringBuffer的区别1.String内容不可以修改StringBuffer与StringBuilder的内容可以修改2.StringBuffer和StringBuilder大部分功能是相似的3.StringBuffer采用同步处理属于线程安全操作而StringBuilder未采用同步处理属于线程不安全操作。