java 自学日志【十】---String类

String 类

String类特点:是一个特殊的类,定义时被final修饰,所以它没有子类;
字符串一旦初始化,就不可以被改变;
① String s1 = "abc";
② String s2 =new String("abc");
两者有什么区别呢?
①中,s1是一个类类型,"abc"在内存中是一个对象,如果 s1="kk";其中"abc"没变,只是s1不指向"abc"而指向"kk";
②中,s2在内存中有两个对象,判断s1==s2吗?答案是false,==比较的是两个对象地址值,但是s1.equals(s2)是true,此时判断的是字符串中对象内容是否相同,因为String类复写了Object类中的equals方法。

String类常见的操作方法:
① 获取:
字符串中包含字符的个数,即字符串的长度: int  length() :获取长度;

根据位置获取位置上的某个字符: char  charAt(int index):如果访问不存在角标,会出现角标越界异常;

根据字符获取该字符在字符串中的位置: int indexOf(int  ch): 返回的是ch在字符串中第一次出现的位置;
int indexOf(int ch,int fromIndex):从指定位置开始获取ch在字符串中出现的位置;

同理: int indexOf(String str); int  indexOf(String str, fromIndex); int lastIndexOf(int ch):从后索引;
代码演示:
class StringDemo 
{
	public static void main(String[] args) 
	{
		String s = "adfdklfjdfjk";

		sop("s的长度:"+s.length());
		
		char c = s.charAt(3);
		sop("角标3上的字符是:"+c);

		sop("d在字符串中第一次出现的位置:"+s.indexOf('d'));

		sop("从2角标开始,第一次出现df的位置:"+s.indexOf("df",2));

		sop(s.lastIndexOf('d'));//从后索引


	}
	public static void sop(Object o)
	{
		System.out.println(o);
	}
}

②判断
字符串中是否包含某一字符串:
boolean  contains(String str);
特殊之处:indexOf可以索引str第一次出现的位置,如果返回-1,则说明str不在字符串中,所以也可以用于判断是否包含一个字符子串;

判断字符串是否为空: boolean  isEmpty(); 原理就是判断字符串长度是否为0;
注意:""和null的区别,""是空字符串,是对象,null是空;

字符串是否以指定内容开头或结尾:
boolean  startsWith(str);   boolean  endsWith(str);

判断字符串内容提要是否相同,原理就是复写了object类中的equals方法;
boolean equals(str);
判断字符串内容提要是否相同,并忽略大小写:
boolean equalsIgnoreCase(str);
示例代码:
class StringDemo 
{
	public static void main(String[] args) 
	{
		String s = "adpy.java";
		String s1 = "ADPY.JaVA";

		sop("s是否为空:"+s.isEmpty());
		
		sop("是否包含dfdk:"+s.contains("dfdk"));

		sop("是否以 ad  开头:"+s.startsWith("ad"));

		sop("是否以.java结尾:"+s.endsWith(".java"));

		sop(s.equalsIgnoreCase(s1));


	}
	public static void sop(Object o)
	{
		System.out.println(o);
	}
}

③ 转换
将字符数组转换成字符串:
构造函数方法:String(char [ ]); 
String ( char [ ] ,offset,count):将字符数组的一部分转成字符串;
静态方法:static String copyValueOf(char [ ]);
static String copyValueOf(char [ ],offset,count);
static String valueOf(char [ ]);
3+""和 String. valueOf(3)是一样的效果;

将字符串转成字符数组:
char[] toCharArray();
将字节数组转成字符串;
String(byte [ ]); String (byte [ ], offset, count );
将字符串转成字节数组:
byte[] getBytes();
将基本数据类型转成字符串: static String valueOf(int \double);
注意:字节数组和字符串转换过程中是可以指定字节编码表的;
代码演示:
class StringDemo 
{
	public static void main(String[] args) 
	{
		char [] arr = {'a','b','c','d','e','f'};  
  
        String s = new String(arr,1,4);  
        sop("s="+s);  

        String s1="erqwerwewr";  
        char [] chr = s1.toCharArray();  
        for(int x =0;x<chr.length;x++)  
        {  
            sop(chr[x]);  
        }  

	}
	public static void sop(Object o)
	{
		System.out.println(o);
	}
}

④替换
String replace(old char,new char): 如果要替换的字符或字符串串不存在,则还打印原串;
⑤切割
String[ ] split(regex);按照某一规则切割;
⑥获取字符串中的子串:
String subString(begin,end);包含头不包含尾;
⑦转换,比较,去除两端空格
将字符串转换成大小写:
String toUpperCase():大写
String toLowerCase():小写
将字符串两端空格去除:
String trim();
对字符串进行自然顺序比较;
int compareTo(String); 返回的是正数大于,负数小于或0是相等;
代码演示:
class StringDemo 
{
	public static void main(String[] args) 
	{ 
        String s="   HEllo,java   ";
		String s0= "   adfdf   ";
		
		sop(s.replace("java","world"));

		String[] arr = s.split(",");
		for(int x =0;x<arr.length;x++)  
        {  
            sop(arr[x]);  
        } 

		sop(s.substring(2,7));

		sop(s.toUpperCase());
		sop(s.toLowerCase());

		sop(s.trim());
		
		sop(s.compareTo(s0));
     
	}
	public static void sop(Object o)
	{
		System.out.println(o);
	}
}

StringBuffer:是字符串缓冲区,是一个容器,可以对字符串内容进行修改;
特点:长度可变,可以操作多个类型,可通过toString方法转成字符串;
常见操作:
①存储
         StringBuffer append():将指定的数据作为参数添加到已有数据的尾处。
         StringBuffer insert(index,String str):可以将数据插入到指定index位置。
②删除
         StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。
         StringBuffer deleteCharAt(index):删除指定位置的字符。
③获取
          char charAt(int index)
          int indexOf(String str) 
          int lastIndexOf(String str)
          int length() 
          String substring(int start, int end)
④修改。
          StringBuffer replace(int start, int end,String str)
          void setCharAt(int index, char ch)
⑤反转
         StringBuffer reverse();

void getChars(int srcBegin, int srcEnd, char[]dst, int dstBegin)
          将字符从此序列复制到目标字符数组 dst。
代码演示:
class StringBufferDemo 
{
	public static void main(String[] args) 
	{
		//method_update();
		//method_del();
		//method_add();		

		StringBuffer sb = new StringBuffer("abcde");		
		char[] chs = new char[6];
		sb.getChars(1,4,chs,1);
		for(int x =0;x<chs.length;x++)
		{
			sop("chs["+x+"]="+chs[x]+";");
		}
		
	}
	public static void method_update()
	{
		StringBuffer sb = new StringBuffer("abcde");
		sop(sb.toString());
		//sb.replace(1,4,"java");
		sb.setCharAt(2,'k');
		sop(sb.toString());


	}
	public static void method_del()
	{
		StringBuffer sb = new StringBuffer("abcde");
		sop(sb.toString());
		//sb.delete(1,3);

		//清空缓冲区
		//sb.delete(0,sb.length());
		sb.deleteCharAt(2);
		sop(sb.toString());
	}
	public static void method_add()
	{
		StringBuffer sb = new StringBuffer();
		//1.存储功能
		sb.append("abc").append(true).append(34);//方法调用链。
		sop(sb.toString());
		sb.insert(1,"qq");
		sop(sb.toString());

		/*
		StringBuffer sb1 = sb.append(14);
		sop("sb==sb1"+(sb==sb1));//结果为true
		sop(sb.toString());
		sop(sb.toString());
		*/

	}

	public static void sop(String str)
	{
		System.out.println(str);
	}
}

JDK1.5出现了StringBuilder,它是StringBuffer简易代替方案;
两者不同之处:
①StringBuffer是线程同步的,用于对线程;
②StringBuilder 线程不同步,单线程使用效率高;多线程要自己加锁;
建议使用StringBuilder,效率高;

jdk升级的三个核心:提高效率,简化书写,提高安全性;

基本数据类型包装类:
int----Integer ; char --------Character; byte ----Byte; short-----Short;
常见操作:基本数据类型与字符串类型之间转换

①基本数据类型转换成字符串:
方法1:基本数据类型+"";如 23+""
方法2:String.valueOf(32);
方法3:Integer.toString(23);

②字符串转换成基本数据类型:
int a = Integer.parseInt(String);

③十进制转其他进制:
toBinaryString(); toHexString(); toOctalString();

④其他转十进制:静态方法 Integer.parseInt(String, radix) radix:2进制,8进制,16进制

非静态方法: Ingere i = new Integer("110");
int x = i.intValue();

JDK1.5出现的新特性:
① Integer a = new Integer(4) 可以写成 Integer a = 4;
这是因为自动装箱的缘故,此时,a是引用类型,4是一个对象,而不是整数,还可以进行运算,如:
a = a+4;,a+4,a进行自动拆箱,变成int类型和4运算,再将结果自动装箱赋给a;

② Integer m = 128;Integer n =128; 判断 m==n?? 结果是 false ;
Integer a = 127; Integer b =127; 判断 m==n 结果是 true ;
因为a和b指向同一个对象,当数值在byte范围内,对于新特性,如果该数值已存在,则不会再开辟新空间,所以a和b指向同一对象,m和n指向不同对象.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值