黑马程序员—Java基础学习笔记之String&&StringBuffer&&StringBuilder


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

一、

1,字符串是一个特殊的对象

String s1 = “abc”//s1是一个类类型变量,”abc”是一个对象;

2,字符串最大的特点:一旦被初始化就不可以改变

   String s1 = “abc”;

   S1 = “aaa”;

   System.out.println(s1);

   结果:aaa

   注意:这里虽然结果是aaa,但是字符串并没有改变,abc依然在()内存中,改变的只是s1,它所指向的内存地址改变了

String s = new String();

   String s1 = ““;

二者一样,只是后者简单,一般都选择后者

举例:

分析控制台结果:

1,s1是一个对象而s2是两个对象,所以false,equals比较的是内存地址,s1s2指向的内存地址相同

2,Sting类重写了Object类中的equals方法,该方法用于判断字符串是否相同

举例:

package com.heima.biji;

public class Demo_String {
	public static void main(String[] args) {
		String s1 = "abc";
		String s2 = new String("abc");
		String s3 = "abc";
		// System.out.println(s1==s2);
		//System.out.println(s1.equals(s2));
		System.out.println(s1==s3);
		
		
	}
}

控制台:

true

分析结果:对于字符串常量,存放在常量池中,s1指向一个字符串,s3也指向字符串,s3在初始化时候发现abc已经在内存中存在,所以就不用再开辟空间

二、String类的常用方法

1,判断
  1.1 boolean equals(Object);    //判断传入的字符串是否与调用的字符串字符序列是否相同,相同就返回true否则false
  1.2 boolean equalsIgnoreCase(string); //判断传入的字符串是否与调用的字符串字符序列是否相同,不区分大小写,相同就返回true否则false
  1.3 boolean contains(string);   //判断传入的字符串是否被调用的字符串包含
  1.4 boolean startsWith(string);   //判断调用的字符串是否以传入的字符串开头
  1.5 boolean endsWith(string);   //判断调用的字符串是否以传入的字符串结尾
  1.6 boolean isEmpty();     //判断字符串是否为空

 2,获取
  2.1 int length();      //获取字符串的长度
  2.2 char charAt(index);     //通过索引获取对应的字符
  2.3 int indexOf(int ch);    //通过传入int数或者是字符找对应索引
   int idnexOf(int ch,fromIndex);  //在指定fromIndex的位置查找传入的字符
  2.4 int indexOf(string str);   //通过传入字符串查找字符串所对应的索引
      int idnexOf(string str,fromIndex); //通过指定fromIndex的位置查找传入的字符串
  2.5 int lastIndexOf(ch);    //通过传入的字符从后向前找字符的索引值,把从后向前第一次找到的索引值返回
   int lastIndexOf(ch,fromIndex):  //通过指定fromIndex的位置,从后向前查找字符,把从后向前第一次找到的索引值返回
  2.6 int lastIndexOf(string);   //通过传入的字符串,从后向前查找,将第一次找到字符串中第一个字符的索引返回
   int lastIndexOf(string,fromIndex): //通过指定fromIndex的位置,从后向前查找对应字符串,将第一次找到字符串中第一个字符的索引返回
  2.7 String substring(start);   //通过传入的索引值开始向后截取,截取的是索引到length
   String substring(start,end);  //通过传入的两个索引值截取,有开始有结尾,包含头不包含尾
  
 3,转换
  3.1 byte[] getBytes();     //编码,让计算机看的懂的,用默认的编码表,将字符串转换成字节数组
   byte[] getBytes(String)    //用指定的编码表进行编码
  3.2 char[] toCharArray();    //将字符串转换成字符数组
  3.3 static String copyValueOf(char[]); //将字符数组转换成字符串
      static String copyValueOf(char[] data, int offset, int count);//将字符数组转换字符串,通过offset开始,截取count个
  3.4 static String valueOf(char[]);  //将字符数组转换成字符串
      static String valueOf(char[] data, int offset, int count);//将字符数组转换字符串,通过offset开始,截取count个
  3.5 static String valueOf(int);   //将一个int数转换成字符串
   static String valueOf(double);
   static String valueOf(boolean);
    ...
   
  3.6 static String valueOf(object);  
   和object.toString():结果是一样的。
  3.7 String toLowerCase():    //将字符串全部转换为小写
   String toUpperCase():    //将字符串全班转换为大写
  3.8 "abc".concat("kk");     //将两个字符串相连接,产生新的字符串
     
 4,替换。
  4.1 String replace(oldChar,newChar); //将newChar替换OldChar,如果OldChar不存在,原字符串直接赋值给替换后字符串
  4.2 String replace(string,string);  
  
 5,切割。
  String[] split(regex);     //通过regex切割字符串,切割后会产生一个字符串数组
  String s = "金三胖 郭美美 李天一";
  String[] arr = s.split(" ");
  
 6,去除字符串两端空格。
  String trim();       
  
 7,比较
  String str = "ab";
  String str1 = "bc";
  int num = str.compareTo(str1);   //如果str比str1大的话,返回的正数

8,练习

/**
 * 需求:获取一个字符串在另一个字符串中出现的次数
 * aaoocdooefoohoo
 * 思路:1,定义一个计数器
 *   2,获取oo第一次出现的位置
 *   3,从第一次出现的位置后剩余字符串中继续获取oo出现的位置,每获取一次就计数一次
 *   4,当获取不到时候,计数完成
 */

package com.heima.biji;

//定义计数器
public class getSubCount {
	public static void main(String[] args) {
		String str = "aaoocdooefoohoo";
		sop("count=" + getSubCount(str, "oo"));
	}

	private static int getSubCount(String str, String key) {
		int count = 0;
		int index = 0;
		while ((index = str.indexOf(key)) != -1) {
			sop("str=" + str);// 输出原字符串
			str = str.substring(index + key.length());
			count++;
		}
		return count;
	}
	//定义输出方法
	private static void sop(String str) {
		System.out.println(str);
	}

}
控制台:
str=aaoocdooefoohoo
str=cdooefoohoo
str=efoohoo
str=hoo
count=4

1,其中关键代码理解:kk出现位置2+kk长度2=4,即下个子字符串从4开始

2,substring返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾。

 

注意:这里不适合用切割split(regs),因为会有kk在最左边和最右边的情况,这样切割的话,左右就会出现null

三、

1,StringBuffer是字符串缓冲区

                      是一个容器

 特点:长度可以变化

        可以字节操作多个数据类型

        最终会通过toString方法变成字符串

2,StringBuffer方法

/**
 * 1,添加,插入
 * StringBuffer append():始终将这些字符添加到生成器的末端
 * StringBuffer insert(index,数据):在指定的点添加字符。
 * 2,删除delete
 * StringBuffer delete():删除缓冲区中的数据,包含start,不包含end
 * StringBuffer deleteCharAt(index);删除指定位置的字符
 * 3,获取
 * char charAt(int Index): 返回此序列中指定索引处的 char值。
 * int indexOf(String str): 返回第一次出现的指定子字符串在该字符串中的索引
 * int lastIndexOf(String str):返回最右边出现的指定子字符串在此字符串中的索引
 * int length():返回长度(字符数
 * String substring(int start,int end):返回一个新的 String,它包含此序列当前所包含字符的子序列
 * 4,修改
 * StringBuffer replace(start,end,string):使用给定 String 中的字符替换从[start,end)
 * void setCharAt(int index,char ch):替换指定index的字符
 * 5,反转
 * StringBuffer reverse():反转
 * 6,将缓冲区中指定数组存储到指定字符数组中
 * void getChars(int srcBegin, int srcEnd,char[] dst,int dstBegin)
 */

实例:

package com.heima.biji;

public class Demo_StringBuffer {
	public static void main(String[] args) {
		Method_add();
		Method_delete();
		Method_update();
		Method_reverse();
		Method_getChars();
	}

	public static void Method_reverse() {
		StringBuffer sb = new StringBuffer("abcde");
		sb.reverse();
		sop(sb.toString());
	}
	
	public static void Method_add() {
		StringBuffer sb = new StringBuffer();
		//方法调用链,因为此方法返回值是对象,对象可以调用方法,所以可以链式书写
		sb.append("abc").append(true).append(2);
		sb.insert(1,'m');//在index=1处添加字符m
		sop(sb.toString());
	}
	
	public static void Method_delete() {
		StringBuffer sb = new StringBuffer("abcde");
		sb.delete(0, 3);
		sb.deleteCharAt(0);
		//sb.delete(0, sb.length());//清空缓存区
		sop(sb.toString());
	}
	public static void Method_update() {
		StringBuffer sb = new StringBuffer("abcde");
		sb.replace(1, 3, "oo");
		//sb.setCharAt(2, 'o');
		sop(sb.toString());
	}
	
	public static void Method_getChars() {
		StringBuffer sb = new StringBuffer("abcde");
		char[] ch = new char[4];
		sb.getChars(1, 3, ch, 2);
		for(int x=0; x<ch.length;x++) {
			sop("ch["+x+"]="+ch[x]+";");
		}
	}
	
	public static void sop(String str) {
		System.out.println(str);
	}
}

控制台             

ambctrue2
e
aoode
edcba
ch[0]= ;
ch[1]= ;
ch[2]=b;
ch[3]=c;															

注意:JDK1.5 版本后出现了StringBuilder,

StringBuffer是线程同步

StringBuilder是线程不同步,但是效率高

以后开发,建议使用StringBuilder

 注意:升级三个因素 a,提高效率 b,简化代码 c,提高安全性

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值