String源码阅读总结

1、charAt(index) 获取字符 , codePointAt()——提取索引字符代码点;
2、String 和 CharSequence 关系
String 继承于CharSequence,也就是说String也是CharSequence类型。
CharSequence是一个接口,它只包括length(), charAt(int index), subSequence(int start, int end)这几个API接口。除了String实现了CharSequence之外,StringBuffer和StringBuilder也实现了CharSequence接口。
需要说明的是,CharSequence就是字符序列,String, StringBuilder和StringBuffer本质上都是通过字符数组实现的!
关系图:
CharSequence(接口)

String AbstractStringBuilder(接口)

StringBuilder StringBuffer

3、contentEquals(CharSequence c) 、contentEquals(StringBuffer sb) ;
也就是说String可以和StringBuilder、StringBuffer比较内容,还可以和实现CharSequence接口的类比较内容;
4、equalsIgnoreCase(String anotherString) 忽略字符串大小写比较;
5、compareTo(String anotherString)排序默认大的在前面,长度长的前面如果一样,算大的;
String.CASE_INSENSITIVE_ORDER 这个排序对象,忽略大小写;
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;

int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;

}


测试例子:

/**
 * 字符串String不可变的字符串,内部实现是基于char[]数组,
 * 1、因为只能内部访问,所以不可变;
 * 2、final类
 * 3、如何实现一个不可变类
a、将类声明为final,所以它不能被继承。
b、将所有的成员声明为私有的,这样就不允许直接访问这些成员。
c、对变量不要提供setter方法。
d、将所有可变的成员声明为final,这样只能对它们赋值一次。
e、通过构造器初始化所有成员,进行深拷贝(deep copy)。
f、在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝。
 * 4、其他的方法有,equals toLowerCase split format格式化字符串,可以动态的拼接字符串,比如 数字 特殊字符什么的。
 * @author	hz16092620 
 * @date	2018年4月4日 下午4:59:21
 * @version      
 */
public class TestBaseString {
    
    
    public static void main(String[] args) {
	test();
	//testCharSequence();
	//testStartsAndEndWith();
	//testContact();
	//testReplace();
	//testTrim();
	//testIntern();
	//testStringAdd();
    }
    
    /**
     * 比较字符串大小
     * */
    static void testStringAdd() {
	String s1 = new String("hello");
	String s2 = new String("world");
	String s3 = s1 + " " + s2;
	String s4 = "hello world";
	System.out.println(s3==s4);
    }
    
    
    
    /**
     * 测试trim。
     * intern方法是Native调用,它的作用是在方法区中的常量池里通过equals方法寻找等值的对象,
     * 如果没有找到则在常量池中开辟一片空间存放字符串并返回该对应String的引用,
     * 否则直接返回常量池中已存在String对象的引用。
     * */
    static void testIntern() {
	String str = "liuhuipeng";
	String str1 = new String("liuhuipeng").intern();
	String str2 = "liuhuipeng";
	String str3 = new String("liuhuipeng").intern();
	System.out.println(str==str1);//true
	System.out.println(str==str2);//true
	System.out.println(str1==str3);//true
    }
    
    /**
     * 测试trim。
     * */
    static void testTrim() {
	String str = " liuhuipeng ";
	System.out.println(str.trim());
    }
    
    /**
     * 测试replace。
     * */
    static void testReplace() {
	String str = "liuhuipeng";
	System.out.println(str.replace('l', 'L'));
    }
    
    /**
     * 测试开头和结尾的字符。
     * */
    static void testStartsAndEndWith() {
	String str = "liuhuipeng";
	System.out.println(str.startsWith("iuh", 1));
	System.out.println(str.endsWith("peng"));
    }
    
    /**
     * 测试拼接方法。
     * */
    static void testContact() {
	String str = "liuhuipeng";
	System.out.println(str.concat("dashuaige"));
    }
    
    /**
     * 测试++,后面的话就是先返回再计算。
     * */
    static void testAdd() {
	int i = 5;
	System.out.println(i++);
    }
    
    /**
     * 测试charAt方法、indexOf。
     * */
    static void test() {
	String str = "hello string";
	System.out.println(str + " 索引为2的字符 " +str.charAt(2));
	System.out.println(str + " 索引为0的代码点 " +str.codePointAt(0));
	System.out.println(str + " 字符串e的位置 " +str.indexOf("e"));
	System.out.println(str + " 字符e的位置 " +str.indexOf('e'));
	System.out.println(str + " 字符串e的最后的位置 " +str.lastIndexOf("e"));
	System.out.println(str + " 字符e的最后的位置 " +str.lastIndexOf('e'));
    }
    
    /**
     * charSequence和三个实现类
     */ 
    static void testCharSequence() {
	CharSequence cs = "aa";
	String s1 = "aa";
	StringBuffer sbu = new StringBuffer("aa");
	StringBuilder sb = new StringBuilder("aa");
	System.out.println("stringbuffer and string " + sbu.equals(sb));
	System.out.println("CharSequence and string " + cs.equals(s1));
	System.out.println("StringBuffer and string " + sbu.equals(s1));
	System.out.println("StringBuilder and string " + sb.equals(s1));
	
	System.out.println("string and CharSequence " + s1.contentEquals(cs));
	System.out.println("string and StringBuffer " + s1.contentEquals(sbu));
	System.out.println("string and StringBuilder " + s1.contentEquals(sb));
    }

}
/**
 * 字符串操作的高级方法
 * @author	hz16092620 
 * @date	2018年4月8日 下午3:36:34
 * @version      
 */
public class TestSeniorString {
    
    public static void main(String[] args) {
	//testTrimSenior();
	//testTrimReplaceAll();
	//testStringBuilder();
	//testDeleteRepeatChar();
	testStringBuilderReverse();
    }
    
    /**
     * 测试字符串是否回文,即前后读都是一样的
     * */
    static void testStringBuilderReverse() {
	String str = "abcba";
	StringBuilder sb1 = new StringBuilder(str);
	sb1.reverse();
	System.out.println("sb1 " + sb1);
	for (int i = 0; i < str.length(); i++) {
	    if (!(str.charAt(i) == sb1.charAt(i))) {
		System.out.println("不是回文");
		break;
	    }
	}
    }
    
    /**
     * 去除重复的字符串/字符,原理就是利用StringBuilder可变的特性
     * */
    static void testDeleteRepeatChar() {
	String str = "liuhuipengliuhuipeng";
	StringBuilder sb = new StringBuilder(str);
	for (int i = 0; i < sb.length(); i++) {
	   for (int j = i+1; j < sb.length(); j++) {
	       if (sb.charAt(i) == sb.charAt(j)) {
		   sb.deleteCharAt(j);
	       }
	   }
        }
	System.out.println(sb.toString());
    }
    
    /**
     * 将两个字符串拼接,删除
     * */
    static void testStringBuilder() {
	String s1 = "int";
	String s2 = "ser";
	StringBuilder sb = new StringBuilder(s1);
	sb.insert(2, s2);
	System.out.println(sb.toString());
	System.out.println(sb.delete(1, 3));//这个其实和时间那个是一样的,1-2,2-3=2个
    }
    
    /**
     * 去除空格,方法一。
     * */
    static void testTrimSenior() {
	String str = " we are family ";
	StringTokenizer st = new StringTokenizer(str, " ");
	StringBuilder sb = new StringBuilder();
	while (st.hasMoreElements()) {
	    sb.append(st.nextElement());
        }
	System.out.println(sb.toString());
    }

    /**
     * 去除空格,方法二。
     * */
    static void testTrimReplaceAll() {
	String str = " we are family ";
	System.out.println("replaceAll(正则表达式)=" + str.replaceAll(" ", ""));
	System.out.println("replace=" + str.replace(" ", ""));
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值