黑马程序员_API_String

----------- android培训java培训期待与您交流!------------

一、字符串
类类型的变量一定指向对象
String s = "abc";
s = "aaa";
字符串是个常量,值是不能被改变的。
s是个引用,指向“abc",后面又指向了"aaa"

字符串在底层都是字符数组
字符串也称之为字符序列

String s1 = "abc";
String s2 = "abc";
s1 == s2 在常量池中是共享的
==比较的是地址值

String s = "abc";
String s1 = new String("abc");
一个是一个对象,一个是两个对象(一个是堆内存对象,一个是常量池的"abc")

凡是运算完结果是3种的情况,返回值必然是int,整数,负数,0
基本数据值用比较运算符比大小>< 
对象用方法比大小,compareTo

二、字符串缓冲区
特点: 
1,可以存储任意类型的数据。
2,长度不固定。
3,无论存储什么类型的元素,存储进来以后最终都会变成字符串。

缓冲区就是存储临时数据的地方,底层是字符数组
StringBuffer sb = new StringBuffer();
StringBuffer sb1 = sb.append("aaa"); //返回的还是原来的缓冲区
sb == sb1;

升级有三种
简化书写,提高效率,提高安全性

StringBuffer保证多线程访问容器的时候一次只能执行一个动作,要么添加,要么删除,单线程还要判断锁,效率低
StringBuilder不安全,添加删除可以同时进行,容易导致数据错误

三、练习
1、

/*
	 * 1,获取一个字符串中指定子串出现的次数。 "nbaernbatynbauklnba"
	 * 
	 * 思路: 1,通过计数器,找到一次,就记录一次。获取最终次数。
	 * 		 2,查找indexOf方法。 该方法只能获取第一次出现的位置。
	 * 			可以通过改变查找的起始点来完成下一次位置的查找。 
	 * 		 3,因为要不断的查找和计数,需要使用循环。
	 */
	public static int getSubstringCount(String str, String substr) {
		// 1,定义一个变量用于计数器。
		int count = 0;
		// 2,定义变量记录每次查找的其实位置。
		int index = 0;
		// 3,因为查找动作重复,所以使用循环解决。在通过indexOf方法确定条件。只要等于了-1,说明查找结束。
		while ((index = str.indexOf(substr, index)) != -1) {
			// 通过获取到的查找的位置,来确定下一次查找的起始位置。
			index = index + substr.length();
			// 计数器要计数。
			count++;
		}
		return count;
	}
2、
//去除字符串两端的空白。 "   ab c    " --> "ab c"
	
	public static String myTrim(String str) {
		// 1,定义两个变量 .用于记录头和尾的角标。
		int start = 0;
		int end = str.length() - 1;
		// 对头角标的位置进行空格的判断,如果是继续循环判断下一个是否是空格。
		while (start <= end && str.charAt(start) == ' ')
			start++;

		// 对尾角标的位置进行空格的判断,如果是继续循环判断下一个是否是空格。
		while (start <= end && str.charAt(end) == ' ')
			end--;

		return str.substring(start, end + 1);
	}
3、
//获取两个字符串最大相同子串。 "xcvcctvbsdf" "tyuicctvonmyui"
	public static String sub(String s1, String s2) {
		/**
		 * 获取两个字符串最大相同子串。 "xcvcctvbsdf" "tyuicctvonmyui"
		 * 
		 *  0~length							xcvcctvbsdf
		 *  0~length-1  1~length				xcvcctvbsd	cvcctvbsdf
		 *  0~length-2  1~length-1  2-length	xcvcctvbs   cvcctvbsd  vcctvbsdf
		 */
		String max, min;
		max = s1.length() > s2.length() ? s1 : s2;

		min = s1.length() <= s2.length() ? s1 : s2;

		// 定义外层循环用于控制子串的个数。
		for (int i = 0; i < min.length(); i++) {
			for (int j = 0, k = min.length() - i; k != min.length() + 1; j++, k++) {
				String temp = min.substring(j, k);
				if (max.contains(temp))
					return temp;
			}
		}
		return null;
	}
4、Arrays.toString()的实现
public static String toString(long[] a) {
		if (a == null)
			return "null";
		int iMax = a.length - 1;
		if (iMax == -1)
			return "[]";

		StringBuilder b = new StringBuilder();
		b.append('[');
		for (int i = 0;; i++) {
			b.append(a[i]);
			if (i == iMax)
				return b.append(']').toString();
			b.append(", ");
		}
	}

5、字符串反转

public class Test1 {
	public static void main(String[] args) {

		String s = "abcde";
		StringBuilder sb = new StringBuilder();
		
		for (int i = s.length() - 1; i >= 0; i--) {
			sb.append(s.charAt(i));
		}
		s = sb.toString();

		System.out.println(s);

	}
}


你可能感兴趣的:(黑马程序员_API_String)