假设有两个字符串
String qc1 = "张三,李四,赵二,谢大脚,刘能";
String qc2 = "谢广坤,谢大脚,张三";
如何去重,只留下qc2中不包含qc1中的字段呢,这时候要用到indexOf();
java.lang.String.indexOf(String str)
indexOf() 返回此字符串中指定子字符串第一次出现的索引,如果没有的话返回-1;
写法一(String字符串直接拼接)不推荐:
String qc1 = "张三,李四,赵二,谢大脚,刘能"; String qc2 = "谢广坤,谢大脚,张三"; String qc3 = ""; String[] arrqc1 = qc1.split(","); String[] arrqc2 = qc2.split(","); for(int i = 0;i <arrqc1.length;i++) { qc2.indexOf(arrqc1[i]); if (qc2.indexOf(arrqc1[i]) == -1) { qc3 += arrqc1[i] + ","; } } //去掉最后一个 ',' qc3 = qc3.toString().substring(0,qc3.length()-1); System.out.println("qu3= "+qc3);
打印的结果是:
写法二(利用StringBuilder)推荐:
String qc1 = "张三,李四,赵二,谢大脚,刘能"; String qc2 = "谢广坤,谢大脚,张三"; StringBuilder sBuilder2 = new StringBuilder(); String aString = ""; String[] array1 = qc1.split(","); for (int i = 0; i < array1.length; i++) { if (qc2.indexOf(array1[i]) == -1) { sBuilder2.append("'").append(array1[i]).append("'").append(","); } } // 去除最后一个"," if (sBuilder2.toString().endsWith(",")) { aString = sBuilder2.toString().substring(0,sBuilder2.length()-1); } System.out.println("sBuilder2== "+aString);
打印结果:
但是呢,我们一般拒绝使用方法一(String)进行拼接,为什么?因为影响性能
String是字符串常量的引用,String += String其实就是重新new了一个新的临时对象。
所以,拼接字符串不能使用String进行拼接,要使用StringBuilder或者StringBuffer
既然说到这了,不妨再说一下String 、StringBuffer 、StringBuilder三者的区别
1、修改String对象的值,内存地址会发生改变
2、StringBuffer和StringBuilder的值可以被多次修改,但并不能创建新的对象,即内存地址不变
3、StringBuffer是线程安全的 StringBuilder是线程不安全的
4、StringBuffer的执行速度要比StringBuilder快
5、StringBuffer和StringBuilder的默认容量长度为16。
6、 如果在声明StringBuffer对象的同时,通过构造方法进行value[]初始化(即给变量赋值), 则容量长度是是(value[]的长度+16)
7、 如果调用append方法拼接字符串,字符串的长度超出了容量长度,则对容量长度进行扩容,扩容大小为(原长度