1.String原理介绍
1.1字符串构造
String类中常用的三种构造方式:
1.2字符串常量(String Table(实际上是一个哈希表))
字符串常量池在JVM中是StringTable类,实际是⼀个固定⼤⼩的HashTable(⼀种⾼效⽤来进⾏查找的数据结构),不同JDK版本下字符串常量池的位置以及默认⼤⼩是不同的:
一般来说只要是双引号引起来的字符串都会存在池当中
关于“池”的理解:
"池"是编程中的⼀种常⻅的,重要的提升效率的⽅式,
简单理解池就是把钱存到银行卡中,随取随用,效率非常高
1.3字符串内存存储
说明:
str1在进⾏存储的时候,"abc"会先存储到字符串常量池当中
•当str2再次存储的时候,先会检查字符串常量池当中是否存在"abc"常量,如果存在,则不再重复
说明:
第⼀次存储的时候,会将"abc"存储到常量池当中
每次new都会在堆中实例化新的对象
存储str2的时候,会使⽤常量池的"abc"对象进⾏存储
2.常用方法介绍
2.1String对象的比较
2.1.1==比较是否为同一个对象
对于内置类型,==比较的是变量中的值,对于引用类型==比较的是引用中的地。
3.1.2equals方法:按照字典序比较(字符大小的顺序)
String类重写了⽗类Object中equals⽅法,Object中equals默认按照==⽐较,String重写equals⽅法后,按照如下规则进⾏⽐较,⽐如: s1.equals(s2)
3.1.3compareTo方法:按照字典序比较
compare方法与euqals方法不同的是,后者返回类型是boolean类型的,而前者返回类型为int类型。
比较方式:
1.按照字典序比较,如果出现不相同的字符,则返回这两个字符串长度差值。相同则返回0
2.如果前k个字符相等(相比较的两个字符昂长度的最小值为k),返回这两个字符串长度的差值
3.1.4compareTognoreCase方法:与comperTo方法相同但是此方法忽略大小写比较
3.2字符串查找
索引从0开始
3.3转换
3.3.1数值和字符串转换
格式为:转换类型首字母大写(其中int为Integer).parse转换类型首字母大写
3.3.2大小写转换
小写转大写格式:字符串.toUpperCase()
大写转小写格式:字符串.toLowerCase()
3.3.3字符串转数组
格式为:字符串.toCharArry()
3.3.4格式化
格式为:String 字符串名称=String.format(“格式字符串”,参数列表);
3.4字符串替换
即使用一个新字符替换已有的字符串数据,
String replaceAll(String regex,String replacement) 替换所有的指定内容
String replacefirst(String regex,String replacement) 替换首个内容
注意:由于字符串是不可变对象,替换不修改当前字符串,⽽是产⽣⼀个新的字符串
3.5字符串拆分
将一个完整的字符串按照指定的分隔符划分为若干个字符串。
方法:
str1为实现字符串的全部拆分
str2为实现字符串的部分拆分
拆分是特别常⽤的操作另外有些特殊字符作为分割符可能⽆法正确切分,需要加上转义.
示例:拆分IP地址
其中第一个\表示要使用一个特殊的字符表示法,
第二个\是实际想要在字符串中表示的那个反斜杠。
然后这个\.被传递给正则表达式引擎,在那里他被表示为一个字面上的点。
注意事项:
1.字符"|","*","+"都得加上转义字符,前⾯加上"\\".
同理上述示例的点号
2.⽽如果是"\",那么就得写成"\\\\".
•正则表达式需要\\来匹配⼀个反斜杠。
•在Java字符串中表示\\,我们需要\\\\。
3.如果⼀个字符串中有多个分隔符,可以⽤"|"作为连字符.
•|在正则表达式中表⽰"或",意味着匹配它左边或右边的表达式。
多次拆分:
可用|来使用两个分隔符
3.6字符串截取
从一个字符串中截取出部分内容。
方法: 功能
String substring(int beginlndex) 从指定索引截取到结尾(索引从0开始)
String substring(int beginlndex,int endlndex) 截取部分内容(左闭右开原则)
3.7去除字符串两边的空格
方法: 功能:
String trim() 去掉字符串中的左右空格,保留中间空格
3.8intern方法
当调用intern()方法时,如果字符串常量池中已经包含⼀个等于此String对象的字符串(由equals(Object)⽅法确定),则返回常量池中的字符串。
•否则,将此String对象添加到常量池中,并返回此String对象的引⽤。
4.字符串的不变性
String是一种不可变对象,是被final修饰的,也就是说其内容是不可改变的。涉及到字符串内容修改的都是创建一个心的对象改变的是新对象。
5.字符串的修改
字符串本身是不可修改的,但是会创建一个新的String对象并将想要修改的字符串通过字符串拼接来存放在新的String对象当中,但是这种字符串的修改如果发生在循环当中则会导致许多空间的浪费,且编译效率低下低下。
此时可使用Java提供的StringBuffer和StringBuilder。
可以通过上述代码来直观反映出StringBuffer或者StringBuilder方法相较于对String类直接拼接时,效率提高了很多。因此:如果要修改尽量使用StringBuilder或者StringBuffer。
6.StringBuilder和StringBuffer
StringBuilder和StringBuffer的介绍:这两个类的功能大部分相同。图为String Builder的用法
String和StringBuilder的最大区别是String不可以改变字符串的内容,StringBuilder可以修改字符串的内容。所以频繁修改字符串时 优先使用StringBuilder。
StringBuilder和StringBuffer唯一的区别在于方法的声明上有一些不同。
StringBuilder采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作。简单理解:线程安全操作相当于进入方法体内就会上锁其他对象调用该方法时无法进入该方法内部,而线程不安全操作允许多个对象同时调用该方法,但是可能会导致数据冲突。