java的String字符串类详解

String 字符串类

String类构造的内存剖析

 笔试题目:new String("abc")创建了几个对象?

  两个对象, 一个对象是 位于字符串常量池中,一个对象是位于堆内存中。

public class Demo1 {
	
	public static void main(String[] args) {
		
		String str1 = "hello";
		String str2 = "hello";
		String str3 = new String("hello");
		String str4 = new String("hello");
		System.out.println("str1==str2?"+(str1==str2));  // true  
		System.out.println("str2==str3?"+(str2==str3));  //false
		System.out.println("str3==str4?"+(str3==str4));  // false
		System.out.println("str3.equals(str2)?"+(str3.equals(str4))); //true
		//是String类重写了Object的equals方法,比较的是两个字符串对象 的内容 是否一致。
		// "=="用于比较 引用数据类型数据的时候比较的是两个对象 的内存地址,equals方法默认情况下比较也是两个对象 的内存地址。
		
		test(null);
	}
	
	public static void test(String str){
		if("中国".equals(str))
		{
			System.out.println("回答正确");
		}else{
			System.out.println("回答错误");
		}
	}
	
}


运行结果:

str1==str2?true
str2==str3?false
str3==str4?false
str3.equals(str2)?true
回答错误


原因分析:


 String 的构造方法

  String()  创建一个空内容 的字符串对象。
  String(byte[] bytes)  使用一个字节数组构建一个字符串对象
  String(byte[] bytes, int offset, int length) 
  bytes :  要解码的数组
  offset: 指定从数组中那个索引值开始解码。
  length: 要解码多个元素。
 
  String(char[] value)  使用一个字符数组构建一个字符串。
  String(char[] value, int offset, int count)  使用一个字符数组构建一个字符串, 指定开始的索引值,与使用字符个数。
String(int[] codePoints,int offset,int count)
String(String original) 


记住: 使用字节数组或者字符数组都可以构建一个字符串对象。

public class Demo2 {
	
	public static void main(String[] args) {
		String str = new String();
		System.out.println("字符串1的内容:"+str);
		
		byte[] buf = {97,98,99};		
		str = new String(buf); //使用一个字节数组构建一个字符串对象
		System.out.println("字符串2的内容:"+str);
		
		str = new String(buf,1,2);   //使用一个字节数组构建一个字符串对象,指定开始解码 的索引值和解码的个数。
		System.out.println("字符串3的内容:"+str);	
		
		char[] arr = {'明','天','是','圣','诞'};
		System.out.println("字符串4的内容:"+str);
		
		str = new String(arr); //使用字符数组构建一个字符串
		System.out.println("字符串5的内容:"+str);	
		
		str = new String(arr,3,2);
		System.out.println("字符串6的内容:"+str);
		
		int[] 	buf2 = {65,66,67};
		System.out.println("字符串6的内容:"+str);
		
		str = new String(buf2,0,3);
		System.out.println("字符串7的内容:"+str);	
		
		str = new String("abc");		
		System.out.println("字符串8的内容:"+str);				
	}
	
}


运行结果:

字符串1的内容:
字符串2的内容:abc
字符串3的内容:bc
字符串4的内容:bc
字符串5的内容:明天是圣诞
字符串6的内容:圣诞
字符串6的内容:圣诞
字符串7的内容:ABC
字符串8的内容:abc

获取方法

int length()  获取字符串的长度
char charAt(int index) 获取特定位置的字符 (角标越界)
int indexOf(String str) 查找子串第一次出现的索引值,如果子串没有出现 在字符串中,那么则返回-1表示。
int lastIndexOf(String str) 查找子串最后一次出现的索引值 , 如果子串没有出现 在字符串中,那么则返回-1表示

public class Demo3 {
	
	public static void main(String[] args) {
		String str = "abc中国ab中国";
		System.out.println("字符串的字符 个数: " + str.length() );
		System.out.println("根据索引值获取对应 的字符:"+ str.charAt(3));
		System.out.println("查找子串第一次出现的索引值:" + str.indexOf("中国"));
		System.out.println("查找子串最后一次出现的索引值:" + str.lastIndexOf("中国"));
		
	}


运行结果:

字符串的字符 个数: 9
根据索引值获取对应 的字符:中
查找子串第一次出现的索引值:3
查找子串最后一次出现的索引值:7


判断方法

boolean endsWith(String str) 是否以指定字符结束
boolean isEmpty()是否长度为0 如:“” null V1.6
boolean contains(CharSequences) 是否包含指定序列 应用:搜索
boolean equals(Object anObject) 是否相等
boolean equalsIgnoreCase(String anotherString) 忽略大小写是否相等

转换方法     

char[] toCharArray()  将字符串转换为字符数组
byte[] getBytes();

字节数组与字符数组、字符串他们三者之间是可以互相转换。

public class Demo4 {
	
	public static void main(String[] args) {
		String str = "Demo.java";
		System.out.println("是否以指定 的字符串结束:"+ str.endsWith("ja"));
		//str = "";
		System.out.println("判断字符串是否为空内容:"+str.isEmpty());
		System.out.println("判断字符串是否包含指定的内容:"+ str.contains("Demo"));
		System.out.println("判断两个 字符串的内容是否一致:"+ "DEMO.JAVA".equals(str));
		System.out.println("判断两个字符串的内容是否一致(忽略大小写比较):"+ "DEMO.JAVA".equalsIgnoreCase(str));
		
		
		//转换的方法
		char[] buf = str.toCharArray();  //把字符串转换字符数组
		System.out.println("字符数组:"+ Arrays.toString(buf));
		byte[] buf2 = str.getBytes();	//把字符串转字节数组
		System.out.println("字节数组:"+ Arrays.toString(buf2));
	}

}


运行结果:

是否以指定 的字符串结束:false
判断字符串是否为空内容:false
判断字符串是否包含指定的内容:true
判断两个 字符串的内容是否一致:false
判断两个字符串的内容是否一致(忽略大小写比较):true
字符数组:[D, e, m, o, ., j, a, v, a]
字节数组:[68, 101, 109, 111, 46, 106, 97, 118, 97]


 其他方法

String replace(String oldChar, String newChar) 替换
String[] split(String regex) 切割

String substring(int beginIndex)   指定开始 的索引值截取子串
String substring(int beginIndex, int endIndex)指定开始 与结束的索引值截取子串

String toUpperCase() 转大写
String toLowerCase() 转小写
String trim() 去除字符串首尾的空格

import java.util.Arrays;
public class Demo5 {
	
	public static void main(String[] args) {
		String str = "今天晚上不考试";
		System.out.println("指定新内容替换旧 的内容:"+ str.replace("不", "要好好"));
		
		str = "大家-下-午-好";
		String[] arr = str.split("-"); //根据指定的字符进行切割 。
		System.out.println("字符串数组的内容:"+ Arrays.toString(arr));
		
		str = "广州1234";
		System.out.println("指定开始的索引值截取子串:"+ str.substring(2));
		System.out.println("指定开始的索引值截取子串:"+ str.substring(2,6)); //包头不包尾  注意:截取的内容是包括开始的索引值,不包括结束的索引值, 截取的位置是结束的索引值-1.
		
		str = "abC中国";
		System.out.println("转大写:" + str.toUpperCase());
		str = "AbdfSDD"; 
		System.out.println("转小写:"+ str.toLowerCase());
		
		str = "         大家最近        都非常努力            ";
		System.out.println("去除字符串首尾的空格:"+ str.trim());
		
		
	}
	
	


}


运行结果:

指定新内容替换旧 的内容:今天晚上要好好考试
字符串数组的内容:[大家, 下, 午, 好]
指定开始的索引值截取子串:1234
指定开始的索引值截取子串:1234
转大写:ABC中国
转小写:abdfsdd
去除字符串首尾的空格:大家最近        都非常努力

String类编程练习

需求1:自己实现trim的方法。
需求2: 获取上传文件名  "D:\\20120512\\day12\\Demo1.java"。
需求3: 将字符串对象中存储的字符反序。    新中国好     -----> 好国中新
需求4: 求一个子串在整串中出现的次数 。 

import java.util.Arrays;
public class Demo6 {
	
	public static void main(String[] args) {
		String str  ="        12        34             ";	
		System.out.println(myTrim(str));
		
		str =  "D:\\20120512\\day12\\Demo1.java";
		getFileName(str);
		
		str = "新中国好";
		System.out.println("翻转后的字符串:"+ reverse(str));
		
		str = "abcjavaabcjavaphpjava";  //java
		getCount(str, "java");
		
	}
	
	
	//统计子串出现 的次数
	public static void getCount(String str,String target){
		int count = 0 ; //用于记录出现的次数
		int fromIndex  = 0; // 记录从那个索引值开始寻找目标子串
		while((fromIndex = str.indexOf(target, fromIndex))!=-1){
			//如果indexof方法返回 的不是-1,那么就是已经找到了目标 元素。
			count++;
			fromIndex = fromIndex+target.length();
		}
		System.out.println("出现的次数:"+ count);
	}
	
	
	
	public static String reverse(String str){
		char[] arr = str.toCharArray();
		for(int startIndex = 0 , endIndex=arr.length-1 ; startIndex<endIndex; startIndex++,endIndex--){
				char temp = arr[startIndex];
				arr[startIndex] = arr[endIndex];
				arr[endIndex] = temp;
		}
		//使用字符数组构建一个字符串。
		return new String(arr);
	}
	
	
	
	
	
	//需求2: 获取上传文件名  "D:\\20120512\\day12\\Demo1.java"。
	public static void getFileName(String path){
		int index = path.lastIndexOf("\\");
		String fileName = path.substring(index+1);
		System.out.println("文件名:"+ fileName);
	}
	
	
	
//	需求1:自己实现trim的方法。
	public static String myTrim(String str){
		//先转换成字符 数组
		char[] arr = str.toCharArray();
		//定义两个 变量记录开始与结束 的索引值
		int startIndex = 0 ;
		int endIndex = arr.length -1;
		//确定开始 的索引值
		while(true){
			if(arr[startIndex]==' '){
				startIndex++;
			}else{
				break;
			}
		}
		//确定结束 的索引值:
		while(true){
			if(arr[endIndex]==' '){
				endIndex--;
			}else{
				break;
			}
		}
		//截取子串返回
		return str.substring(startIndex,endIndex+1);		
	}
	

}


运行结果:

12        34
文件名:Demo1.java
翻转后的字符串:好国中新
出现的次数:3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值