黑马程序员--字符串以及字符串缓冲区

                                                                                 -----------android培训java培训、java学习型技术博客、期待与您交流!------------

字符串以及字符串缓冲区

String字符串:★★★

java中用String类进行描述。对字符串进行了对象的封装。这样的好处是可以对字符串这种常见数据进行方便的操作。对象封装后,可以定义N多属性和行为。

 

如何定义字符串对象呢?String s = "abc";只要是双引号引起的数据都是字符串对象。

 

特点:字符串一旦被初始化,就不可以被改变,存放在方法区中的常量池中。

------------------------------------------------------

String s1 = "abc"; // s1指向的内存中只有一个对象abc。

String s2 = new String("abc"); // s2指向的内容中有两个对象abc、new 

 

System.out.println(s1==s2);//false

System.out.println(s1.equals(s2));//true ,字符串中equals比较的是字符串内容是否相同。

-------------------------------------------------------

字符串的方法:

 

1:构造方法:将字节数组或者字符数组转成字符串。

String s1 = new String();//创建了一个空内容的字符串。 

String s2 = null;//s2没有任何对象指向,是一个null常量值。

String s3 = "";//s3指向一个具体的字符串对象,只不过这个字符串中没有内容。

//一般在定义字符串时,不用new

String s4 = new String("abc");

String s5 = "abc"; 一般用此写法

new String(char[]);//将字符数组转成字符串。

new String(char[],offset,count);//将字符数组中的一部分转成字符串。

 

2:一般方法:

按照面向对象的思想:

2.1 获取:

2.1.1:获取字符串的长度。length();

2.1.2:指定位置的字符。char charAt(int index);

2.1.3:获取指定字符的位置。如果不存在返回-1,所以可以通过返回值-1来判断某一个字符不存在的情况。

int indexOf(int ch);//返回第一次找到的字符角标

int indexOf(int ch,int fromIndex); //返回从指定位置开始第一次找到的角标

int indexOf(String str); //返回第一次找到的字符串角标

int indexOf(String str,int fromIndex);

 

int lastIndexOf(int ch);

int lastIndexOf(int ch,int fromIndex);

int lastIndexOf(String str);

int lastIndexOf(String str,int fromIndex);

2.1.4:获取子串。

String substring(int start);//start位开始,到length()-1为止.

String substring(int start,int end);//start开始到end为止。//包含start位,不包含end位。

substring(0,str.length());//获取整串

2.2 判断:

2.2.1:字符串中包含指定的字符串吗?

boolean contains(String substring);

2.2.2:字符串是否以指定字符串开头啊?

boolean startsWith(string);

2.2.3:字符串是否以指定字符串结尾啊?

boolean endsWith(string);

2.2.4:判断字符串是否相同

boolean equals(string);//覆盖了Object中的方法,判断字符串内容是否相同。

2.2.5:判断字符串内容是否相同,忽略大小写。

boolean equalsIgnoreCase(string) ;

 

2.3 转换:

2.3.1:通过构造函数可以将字符数组或者字节数组转成字符串。

2.3.2:可以通过字符串中的静态方法,将字符数组转成字符串。

static String copyValueOf(char[] );

static String copyValueOf(char[],int offset,int count);

static String valueOf(char[]);

static String valueOf(char[],int offset,int count);

2.3.3:将基本数据类型或者对象转成字符串。

static String valueOf(char);

static String valueOf(boolean);

static String valueOf(double);

static String valueOf(float);

static String valueOf(int);

static String valueOf(long);

static String valueOf(Object);

2.3.4:将字符串转成大小写。

String toLowerCase();

String toUpperCase();

2.3.5:将字符串转成数组。

char[] toCharArray();//转成字符数组。

byte[] getBytes();//可以加入编码表。转成字节数组。

2.3.6:将字符串转成字符串数组。切割方法。

String[] split(分割的规则-字符串);

2.3.7:将字符串进行内容替换。注意:修改后变成新字符串,并不是将原字符串直接修改。

String replace(oldChar,newChar);

String replace(oldstring,newstring);

2.3.8: String concat(string); //对字符串进行追加。

String trim();//去除字符串两端的空格

int compareTo();//如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 的值。

例子:

package pack;
// String类时用于描述字符串事物。
// 那么他就提供了多个方法对字符串进行操作。
// 常见的操作有哪些?“abcd”
// 1,获取。
//	1.1:字符串中包含的字符数,也就是字符串的长度。
//		int length:获取长度。
//	1.2:根据位置获取位置上的某个字符。
//		char charAt(int index);获取某一位置上的字符。
//	1.3:根据字符获取该字符在字符串中的位置。
//		int indexOf(int ch);返回的是ch在字符串中第一次出现的位置。
//		int indesOf(int ch,int fromIndex);从fromIndex指定位置开始,获取ch在字符串中出现的位置。
//		int indexOf(String str);返回的是str在字符串中第一次出现的位置。
//		int indesOf(String str,int fromIndex);从fromIndex指定位置开始,获取str在字符串中出现的位置。	
//		
//		int lastIndexOf(int ch);反向索引。
// 2,判断。
//	2.1:字符串中是否包含某一个子串。
//		boolean contains(str);判断字符串是否存在,判断字符串是否包含。
//		特殊之处:indexOf(str);可以索引str第一次出现的位置,如果返回-1,表示该str不再字符串中存在。
//		所以,也可以使用对指定判断是否包含。
//		if(str.indexOf("aa"!=-1));而且该方法既可以判断,又可以获取出现的位置。
//	2.2:字符串中是否有内容。
//		boolean isEmpty();原理就是判断长度是否为0。
//	2.3:字符串是否是以指定内容开头。
//		boolean startsWith(str);
//	2.4:字符串是否是以指定内容结尾。
//		boolean endsWith(str);
//	2.5:判断字符串内容是否相同。复写了Object类中的equals方法。
//		booleam equals(str);
//	2.6:判断内容是否相同,并忽略大小写。
//		boolean equalsIgnoreCase();
// 3,转换。
//	3.1:将字符数组转成字符串。
//		构造函数:String(char[])
//				  String(char[],offset,count):将字符数组中的一部分转成字符串。
//		静态方法:
//				static String copyValueOf(char[]);
//				static String copyValueOf(char[] data,int offset,int count);
//				static String valueOf(char[]);
//	3.2:将字符串转成字符数组。**
//		char[] toCharArray();
//	3.3:将字节数组转成字符串。
//		String(byte[]);
//		String(byte[],offset,count);将字节数组中的一部分转成字符串。
//	3.4:将字符串转成字节数组。
//		byte[] getBytes();
//	3.5:将基本数据类型转换成字符串。
//		static String valueOf(int);
//		static String valueOf(double);
//		3+"";//String.valueOf(3);
//	特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
// 4,替换。
//	String replace(dchar,newchar);
// 5,切割。
//	String[] split(regex);
// 6,字串。获取字符串中的一部分。
//	String substring(begin);
//	String substring(begin,end);
// 7,转换,去除空格,比较。
//	7.1:将字符串转成大写或者小写。
//		String toUpperCase();
//		String toLowerCase();
//	7.2:将字符串两端的多个空格去除。
//		String trim();
//	7.3:对两个字符串进行自然顺序的比较。
//		int compareTo(string);
class StringMethodDemo{
	public static void sop(Object obj){
		System.out.println(obj);
	}
	public static void main(String[] args){
		
	}
	public static void method_get(){
		String s="abcdefg";
		sop(s.length());// 打印长度
		sop(s.charAt(2));// 根据索引获取字符。
		// 当访问到字符串中不存在的角标时,
		// 会发生StringIndexOutOfBoundsException:字符串角标越界异常。
		sop(s.indexOf("a"));//根据字符获取索引。如果没有找到,返回-1.
		sop(s.lastIndexOf("a"));// 反向索引一个字符出现的位置。角标不被反向。所以打印的还是0角标
	}
	public static void method_is(){
		String s="ArrayTool.java";
		sop(s.startsWith("Array"));// 判断文件名称是否是Array单词开头。
		sop(s.contains("Tool"));// 判断文件名中是否包含Tool。
		sop(s.endsWith(".java"));// 判断文件名称是否是.java的文件。
	}
	public static void method_trans(){
		char[] arr={'a','b','c','d','e'};
		String s=new String(arr,1,3);// 将字节数组中的一部分转成字符串。
		sop("s="+s);
		String s1="abcdefg";
		char[] chs=s1.toCharArray();// 将字符串转成字节数组。
		for(int x=0; x<chs.length; x++){
			sop(chs[x]);
		}
	}
	public static void method_replace(){
		String s="Hello JAVA";
		String s1=s.replace("a","b");// 如果要替换的字符不存在,返回的还是原字符串。
		sop(s);sop(s1);
	}
	public static void method_7(){
		String s="  Hello JAVA  ";
		sop(s.toUpperCase());// 将字符串转成大写。
		sop(s.toLowerCase());// 将字符串转成小写。
		sop(s.trim());// 去除字符串两端的空格。
		String s1="aaa";
		String s2="abc";
		sop(s.compareTo(s2));// 对字符串进行比较排序。
	}
}

练习1:

package pack;
// 1,模拟一个trim方法,去除字符串两端的空格。
//	思路:
//	1,判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。
//		结尾处判断空格也是如此。
//	2,当开始和结尾都判断到不是空格,就是要获取的字符串。
// 2,将一个字符串进行反转,将字符串中指定部分进行反转,"abcdefg";abfedcg.
//	思路:
//	1,曾静学习过对数组的元素进行反转。
//	2,将字符串变成数组,对数组进行反转。
//	3,将反转后的数组变成字符串。
//	4,只要将或反转的部分的开始和结束为止作为参数传递即可。
class StringTest1{
	public static void main(String[] args){
		
	}
	// 练习一:去除字符串两端空格。
	public static String myTrim(String s){
		int start=0,end=s.length()-1;
		while(start<=end&&s.charAt(start)==' ')
			start++;
		while(start<=end&&s.charAt(end)==' ')
			end--;
		return s.substring(start,end+1);
	}
	// 练习二:将字符串反转。
	// 将字符串变成数组,对数组进行反转,将数组变成字符串。
	public static String reverseString(String s,int start,int end){
		char[] chs=s.toCharArray();
		reverse(chs,start,end);
		return new String(chs);
	}
	public static String reverseString(String s){
		return reverseString(s,0,s.length()-1);
	}
	public static void reverse(char[] arr,int x,int y){
		for(int start=x,end=y; start<end; start++,end--){
			swap(arr,start,end);
		}
	}
	public static void swap(char[] arr,int x,int y){
		char temp=arr[x];
		arr[x]=arr[y];
		arr[y]=temp;
	}
}

练习2:

package pack;
// 3,获取一个字符串在另一个字符串中出现的次数。
//	“adkkkcdkkefkkskk”
//	思路:
//	1,定义一个计数器。
//	2,获取kk第一次出现的位置。
//	3,从第一次出现的位置后剩余的字符串中继续获取kk出现的位置。
//		每获取一次就计数一次。
//	4,当获取不到时,计数完成。
class StringTest2{
	public static void sop(Object obj){
		System.out.println(obj);
	}
	public static void main(String[] args){
		
	}
	// 方式一。
	public static int getSubCount(String s,String key){
		int count=0;
		int index=0;
		while((index=s.indexOf(key))!=-1){
			sop(s);
			s=s.substring(index+key.length());
			count++;
		}
		return count;
	}
	// 方式二。
	public static int getSubString(String s,String key){
		int count=0;
		int index=0;
		while((index=s.indexOf(key,index))!=-1){
			sop(index);
			index=index+key.length();
			count++;
		}
		return count;
	}
}

练习2:

package pack;
// 4,获取两个字符串中最大相同子串,第一个动作:将断的哪个串进行长度一次递减的子串打印。
//	“abcwerthelloyuiodef”
//	“cvhellobnm”
//	思路:
//	1,将短的哪个子串按照长度递减的方式获取到。
//	2,将每获取到的子串去长传中判断是否包含。
//		如果包含,已经找到。
class StringTest3{
	public static void main(String[] args){
		String s1="abcwerthelloyuiodef";
		String s2="cvhellobnm";
		System.out.println(getMaxSubString(s1,s2));
	}
	public static String getMaxSubString(String s1,String s2){
		String max="",min="";
		max=(s1.length()>s2.length())?s1:s2;
		min=(max==min)?s1:s2;
		System.out.println(max);
		System.out.println(min);
		for(int x=0; x<min.length(); x++){
			for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++){
				String temp=min.substring(y,z);
				if(max.contains(temp))
					return "相同子串: "+temp;
			}
		}
		return "";
	}
}



------------------------------------

StringBuffer字符串缓冲区:★★★

构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。

特点:

1可以对字符串内容进行修改。

2:是一个容器。

3:是可变长度的。

4:缓冲区中可以存储任意类型的数据。

5:最终需要变成字符串。

 

容器通常具备一些固定的方法:

1,添加。

StringBuffer append(data):在缓冲区中追加数据。追加到尾部。

StringBuffer insert(index,data):在指定位置插入数据。

2,删除。

StringBuffer delete(start,end);删除从startend-1范围的元素

StringBuffer deleteCharAt(index);删除指定位置的元素

//sb.delete(0,sb.length());//清空缓冲区。

3,修改。

StringBuffer replace(start,end,string);将startend-1替换成string

void setCharAt(index,char);替换指定位置的字符

void setLength(len);将原字符串置为指定长度的字符串

4,查找。(查不到返回-1

int indexOf(string); 返回指定子字符串在此字符串中第一次出现处的索引。

int indexOf(string,int fromIndex);从指定位置开始查找字符串

int lastIndexOf(string); 返回指定子字符串在此字符串中最右边出现处的索引。

int lastIndexOf(string,int fromIndex); 从指定的索引开始反向搜索

5获取子串。

string substring(start); 返回start到结尾的子串

string substring(start,end); 返回startend-1的子串

6,反转。

StringBuffer reverse();字符串反转


StringBuilder字符串缓冲区:★★★

JDK1.5出现StringBuiler构造一个其中不带字符的字符串生成器,初始容量为 16 个字符。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。

方法和StringBuffer一样;

 

StringBuffer 和 StringBuilder 的区别:

StringBuffer线程安全。

StringBuilder线程不安全。

 

单线程操作,使用StringBuilder 效率高。

多线程操作,使用StringBuffer 安全。


//想要使用缓冲区,先要建立对象。

StringBuffer sb = new StringBuffer();

sb.append(12).append("haha");//方法调用链。

String s = "abc"+4+'q';

s = new StringBuffer().append("abc").append(4).append('q').toString();

t-size:10.5000pt; mso-font-kerning:1.0000pt; " >

 

单线程操作,使用StringBuilder 效率高。

多线程操作,使用StringBuffer 安全。


练习:

package pack;
// StringBuffer是字符串缓冲区,是一个容器。特点:
// 1,而且长度是可变化的。
// 2,可以直接操作多个数据类型。
// 3,最终会通过toString方法变成字符串
// c create U update Rread Ddelete
//	1,存储。
//		StringBuffer append();将指定数据作为参数添加到已有数据的结尾处。
//		StringBuffer insert(index,数据);可以将数据插入到指定index位置。
//	2,删除。
//		StringBuffer delete(start,end);删除缓冲区中的数据,包含start,不包含end。
//		StringBuffer deleteCharAt(index);删除指定位置的字符。
//	3,获取。
//		char charAt(int index);
//		int indexOf(String str);
//		int laseIndexOf(String str);
//		int length();
//		String substring(int start,int end);
//	4,修改。
//		StringBuffer replace(start,end,string);
//		void setCharAt(int index,char ch);
//	5,反转。
//		StringBuffer reverse();
//	6,缓冲区中指定数据存在到指定数组中。
//		void getChars(int srcBegin,int srcEnd,char[]dst,int dstBegin)
// 在JDK1.5版本之后出现了StringBuilder
// 不同在于:StringBuffer是线程同步。
//			StringBuilder是线程不同步。
//	以后开发,建议使用StringBuilder。
// 升级三个因素:1,提高效率。2,简化书写。3,提高安全性。
class StringBufferDemo{
	public static void sop(Object obj){
		System.out.println(obj);
	}
	public static void main(String[] args){
		
	}
	public static void method_add(){
		StringBuffer sb=new StringBuffer();
		sb.append("abc");sb.append(123);sb.append(true);
		StringBuffer sb1=sb.append(123);
		sop("sb: "+sb);sop("sb1: "+sb1);
		sb.insert(1,"qq");
		sop(sb.toString());
		sop(sb1.toString());
	}
	public static void method_delete(){
		StringBuffer sb=new StringBuffer("abcdefg");
		sb.delete(1,3);
		sb.delete(0,sb.length());
		sb.delete(2,3);sb.deleteCharAt(2);
		sop(sb.toString());
	}
	public static void method_udapter(){
		StringBuffer sb=new StringBuffer("abcdefg");
		sb.replace(1,3,"java");
		sb.setCharAt(2,'K');
		sop(sb.toString());
	}
	public static void getChars(){
		StringBuffer sb=new StringBuffer("abcdefg");
		char[] chs=new char[4];
		sb.getChars(1,4,chs,1);
		for(int x=0; x<chs.length; x++)
			sop("chs["+x+"]"+chs[x]+";");
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值