java中String类详解

更多Java学习资源尽在B站账号:
https://space.bilibili.com/591988762
欢迎个位小伙伴前来观看,更多优质学习资源持续更新中…

String类

这里对java中的String(字符串)类做一个详解!

String 字符串类:

  1. 代码引入:
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(str4)? "+(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("回答错误!");
		}
	}
}

对以上代码分析:
(1)String str = "hello"这种方式创建字符串的时候,jvm首先会检查字符串常量池中是否存在该字符串的对象,如果已经存在,那么就不会在字符串常量池中再创建了,直接返回该字符串在字符串常量池中的内存地址,如果该字符串还不存在字符串常量池中,那么就会在字符串常量池中先创建该字符串的对象,然后再返回。
(2) new String(“hello”)这种方法创建字符串对象的时候,jvm首先会检查字符串常量池中是否存在"hello"的字符串,如果已经存在,则不会再字符串常量池中创建了,如果还没有存在,那么就会在字符串常量池中创建"hello"字符串对象,然后还会去到堆内存中再创建一份字符串对象,把字符串常量的"hello"字符串内容拷贝至堆内存中的字符串对象,然后返回堆内存中的字符串对象的内存地址。

笔试题目分享: new String(“abc”);创建了几个对象?
解答: 两个对象,一个对象是位于字符串常量池中的,一个对象是位于堆内存中的。

  1. 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) 使用一个int型数组构建一个字符串对象。
    String(String original) 初始化一个新的String对象。

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

代码演示:

public class Demo2 {

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

  1. String类常用的方法:
    (1) 获取的方法
    int length() 获取字符串的长度。
    char charAt(int index) 获取特定位置的字符(角标越界)
    int indexOf(String str) 查找子串第一次出现的索引值,如果子串没有出现在字符串中,就返回-1表示。
    int lastIndexof(int ch) 查找子串最后一次出现的索引值,如果找不到,则返回-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("中国"));
   }
}

(2) 判断的方法
boolean endsWith(String str) 是否以指定的字符串结束
boolean isEmpty() 是否长度为0
boolean contains(CharSequences) 是否包含指定序列应用。 用于搜索的。
boolean equals(Object anObject) 是否相等
boolean equalsIgnoreCase(String anotherString) 忽略大小写是否相等。

(3) 转换的方法
String(char[] value) 将字符数组转换为字符串
String(char[] value, int offset, int count)
static String valueOf(char[] data)
static String valueOf(char[] data, int offset, int count)
char[] toCharArray() 将字符串转换为字符数组。
byte[] getBytes(); //把字符串转换成字节数组

注意: 字节数组与字符数组、字符串它们三者之间是可以相互转换的。

代码演示:

public class Demo4 {

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

	}
}

(4) 其它的方法
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() 去除字符串首尾的空格

代码演示:

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 = "广州传智播客";
		System.out.println("指定开始的索引值截取子串: "+str.substring(2));
		System.out.println("指定开始与结束的索引值截取子串: "+str.substring(2,4)); //包头不包尾 注意: 截取的内容是包括开始的索引值,不包括结束的索引值,截取的位置是结束的索引值-1。
		
		str = "abc中国";
		System.out.println("转大写: "+str.toUpperCase());
		
		str = "AbdFgH";
		System.out.println("转小写: "+str.toLowerCase());
		
		str = "     大家  最近         都非常努力                 ";
		System.out.println("去除字符串首尾的空格: "+str.trim());
	}
}

String字符串类题解演示:

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

	public static void main(String[] args) {
		String str = "        传智       播客           ";
		System.out.println(str);
		System.out.println(myTrim(str));
		
		str = "D:\\20120512\\day12\\Demo1.java";
		getFileName(str);
		
		str = "新中国好啊";
		System.out.println("反转后的字符串: "+reverse(str));
		
		str = "abcjavaabcjavajavaphpjava"; //java
		getCount(str, "java");
	}
	
	// 需求4: 求一个子串在整串中出现的次数。
	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);
	}
	
	// 需求3: 将字符串对象中存储的字符反序。  新中国好啊----->啊好国中新
	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);*/
		
		//方式2: 切的方法
		String[] arr = path.split("\\\\");
		System.out.println("文件名: "+arr[arr.length-1]);
	}
	
	// 需求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);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值