建设网站市场分析,天津百度分公司,中国做的电脑系统下载网站,网络建设与维护公司在之前的文章中我们曾简单介绍过String这个引用类型变量#xff0c;其实它还有许多特性#xff0c;还有StringBuffer和StringBuilder这两个方法在字符串操作中也有非常重要的地位#xff0c;接下来就由小编带大家梳理一下吧#x1f44a; 目录
一、String
1、构造方法
2、… 在之前的文章中我们曾简单介绍过String这个引用类型变量其实它还有许多特性还有StringBuffer和StringBuilder这两个方法在字符串操作中也有非常重要的地位接下来就由小编带大家梳理一下吧 目录
一、String
1、构造方法
2、字符串的不可变性
3、字符串的比较
4、 String的常用方法
二、StringBuider和StringBuffer
1、字符串的拼接
2、StringBuider与StringBuffer
总结 一、String
1、构造方法
String类提供的构造方式非常多常用的就以下两种 public static void main(String[] args) {// 使用常量串构造String s1 hello;System.out.println(s1);// 直接newString对象String s2 new String(hello);System.out.println(s1);} 注意 1、String是引用类型内部并不存储字符串本身 2. 在Java中“”引起来的也是String类型对象 那么这两种对象的存储方式有什么区别呢 在s1使用常量串构造时会直接在字符串常量池中创建字符串在栈中直接存储字符串在字符串常量池中相应的位置 在s2通过new String对象的方式实例化字符串时由于其字符串内容与s1一致不会在常量池中创建新的对象此时字符串对象存储在堆中在堆中存储了对应字符在常量池中的位置 这样做有什么好处呢就是所有的字符只用在字符串常量池中创建一次就行了后续创建的相同的字符串只需引用对应的位置即可大大提高了空间资源的利用效率 2、字符串的不可变性 String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改是因为 1. String 类在设计时就是不可改变的 String 类实现描述中已经说明了 以下来自JDK1.8中String类的部分实现 public final class Stringimplements java.io.Serializable, ComparableString, CharSequence {private final char value[]; 可以看出 1. String类被final修饰表明该类不能被继承 2. value被final修饰表明value自身的值不能改变即不能引用其它字符数组但是其引用空间中的内容可以修改。 2. 所有涉及到可能修改字符串内容的操作都是创建一个新对象改变的是新对象 如在以下代码中 String s1hello;
String s2hello;
s1world; s1发生改变时s2并不会改变指向s1会重新分配内存地址进行赋值 String字符串具有不可变性当字符串重新赋值时不会在原来的内存地址进行修改而是重新分配新的内存地址创建新的对象进行赋值 注意 字符串不可变不是因为其内部保存字符的数组被final修饰了因此不能改变。 不是因为String类自身或者其内部value被final修饰而不能被修改。 final 修饰类表明该类不想被继承 final 修饰引用类型表明该引用变量不能引用其他对象但是其引用对象中的内 容是可以修改的。 3、字符串的比较 1. 比较是否引用同一个对象 public static void main(String[] args) {int a 10;int b 20;int c 10;// 对于基本类型变量比较两个变量中存储的值是否相同System.out.println(a b); // falseSystem.out.println(a c); // true// 对于引用类型变量比较两个引用变量引用的是否为同一个对象String s1 new String(hello);String s2 new String(hello);String s3 new String(world);String s4 s1;System.out.println(s1 s2); // falseSystem.out.println(s2 s3); // falseSystem.out.println(s1 s4); // true
} 注意对于内置类型比较的是变量中的值对于引用类型比较的是引用中的地址。 2. boolean equals(Object anObject) 方法按照字典序比较 字典序字符在ASCII码中的顺序 public boolean equals(Object anObject) {// 1. 先检测this 和 anObject 是否为同一个对象比较如果是返回trueif (this anObject) {return true;}// 2. 检测anObject是否为String类型的对象如果是继续比较否则返回falseif (anObject instanceof String) {// 将anObject向下转型为String类型对象String anotherString (String) anObject;int n value.length;// 3. this和anObject两个字符串的长度是否相同是继续比较否则返回falseif (n anotherString.value.length) {char v1[] value;char v2[] anotherString.value;int i 0;// 4. 按照字典序从前往后逐个字符进行比较while (n-- ! 0) {if (v1[i] ! v2[i])return false;i;}return true;}}} 3、int compareTo(String s) 方法 : 按照字典序进行比较 与equals不同的是equals返回的是boolean类型而compareTo返回的是int类型。具体比较方式 1. 先按照字典次序大小比较如果出现不等的字符直接返回这两个字符的大小差值 2. 如果前k个字符相等(k为两个字符长度最小值)返回值两个字符串长度差值 public static void main(String[] args) {String s1 new String(abc);String s2 new String(ac);String s3 new String(abc);String s4 new String(abcdef);System.out.println(s1.compareTo(s2)); // 不同输出字符差值-1System.out.println(s1.compareTo(s3)); // 相同输出 0System.out.println(s1.compareTo(s4)); // 前k个字符完全相同输出长度差值 -3
} 4. int compareToIgnoreCase(String str) 方法与compareTo方式相同但是忽略大小写比较 public static void main(String[] args) {String s1 new String(abc);String s2 new String(ac);String s3 new String(ABc);String s4 new String(abcdef);System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同输出长度差值 -3
} 4、 String的常用方法 二、StringBuider和StringBuffer 1、字符串的拼接 让我们先来看一下下面这个问题 public static void main(String[] args) {String s1 abc;s1s1def;System.out.println(s1); }
//以上代码创建了几个对象 答案是三个 首先语句“String s1 new String(abc);”会在字符串中创建一个对象abc,在执行语句s1s1def;时会先创建一个对象“def”然后在创建两个对象相加后的结果“abcdef” 这时我们发现看似简单的一个拼接操作竟然需要创建三个对象其效率可想而知是非常低下的,因此我们在平时应用中一般会避免这样直接通过“”进行字符串的拼接。那么我们该怎么去拼接呢这时候我们就要介绍StringBuider和StringBuffer了 2、StringBuider与StringBuffer 由于String的不可更改特性为了方便字符串的修改Java中又提供StringBuilder和StringBuffer类。他们的底层原理与String类似都是通过数组来完成对字符串的存储其默认长度为16当实例化一个StringBuider对象时会根据创建字符串的长度来初始化内存数组的内存为“创建字符的长度16”即在进行修改字符串的操作时有16个字符的空间可供操作在对字符串进行修改时会自动检测当前char数组是否装的下如果超出数组范围会对char数组进行扩容。 扩容机制创建一个新的char数组对象其长度一般为原数组的两倍接着判断是否足够存储新的字符串如果不够再进行扩容以此类推直到创建的数组足够存储新的字符串为止。然后将新字符串的内容存储到新数组最后将指针指向新的数组 常用方法 String和StringBuilder最大的区别在于 String 的内容无法修改而 StringBuilder 的内容可 以修改。频繁修改字符串的情况考虑使用StringBuilder 注意String和StringBuilder类不能直接转换。如果要想互相转换可以采用如下原则: String变为StringBuilder: 利用StringBuilder的构造方法或append()方法StringBuilder变为String: 调用toString()方法 【面试题】String、StringBuffer、StringBuilder的区别 String的内容不可修改StringBuffer与StringBuilder的内容可以修改.StringBuffer与StringBuilder大部分功能是相似的StringBuffer大多数方法都使用了synchronized实现了同步处理属于线程安全操作而StringBuilder未采用同步处理属于线程不安全操作 注意在单线程的条件下StringBuilder的运行效率要高于StringBuffer,因此在单线程的情况下一般选用StringBuilder在多线程的情况下优先选用StringBuffer 总结 那么本篇文章就到此为止了如果觉得这篇文章对你有帮助的话可以点一下关注和点赞来支持作者哦。作者还是一个萌新如果有什么讲的不对的地方欢迎在评论区指出希望能够和你们一起进步✊