【从零开始的Java开发】1-5-3 String常用方法、字符串与byte数组间的相互转换、==运算符与equals方法、字符串的不可变性、StringBuilder概述与常用方法

String常用方法(输出长度、索引对应字符、子串)

  1. length输出长度
  2. charAt输出某个索引对应的字符
  3. substring输出子串

代码:

public class StringDemo1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str="Java 编程 基础";
		
		//打印输出字符串的长度
		System.out.println(str.length());
		
		//取出字符"程"并输出
		System.out.println(str.charAt(6));
		
		//输出“编程 输出”
		System.out.println(str.substring(5));
		
		//输出“编程”
		System.out.println(str.substring(5,7));//左闭右开
	}

}

关于索引:
在这里插入图片描述

String常用方法(indexOf,lastIndexOf)

indexOf,求字符或子串在字符串中第一次出现的位置。
lastIndexOf,求字符或子串在字符串中最后一次出现的位置。

public class StringDemo1 {

	public static void main(String[] args) {

		String str = new String("Java编程基础,我喜欢java编程");

		// 输出“a”第一次出现的位置
		System.out.println(str.indexOf('a'));

		// 输出“编程”第一次出现的位置
		System.out.println(str.indexOf("编程"));

		// 输出“a”最后一次出现的位置
		System.out.println(str.lastIndexOf('a'));

		// 输出“编程”最后一次出现的位置
		System.out.println(str.lastIndexOf("编程"));
	}

}

输出:

1
4
15
16

字符串与byte数组间的相互转换

将字符串转换成byte数组
代码:

public static void main(String[] args) {
		String str = new String("JAVA 编程 基础");
		byte[] arrs = str.getBytes();
		for (int i = 0; i < arrs.length; i++) {
			System.out.print(arrs[i] + " ");
		}

	}

eclipse在Mac电脑上的编码语言是UTF-8,在Windows上是GBK,可以在这里看到:
在这里插入图片描述
在这里插入图片描述

在UTF-8中,1个汉字用3个字节表示;
在GBK中,1个汉字用2个字节表示。

将byte数组转换成字符串
ps:这里不加throws UnsupportedEncodingException会报错。

用UTF-8编码:

public static void main(String[] args) throws UnsupportedEncodingException {
		String str = new String("JAVA 编程 基础");
		byte[] arrs = str.getBytes();
		
		String str1=new String(arrs,"UTF-8");
		System.out.print(str1);
	}

输出:JAVA ??? ????

用GBK编码:

public static void main(String[] args) throws UnsupportedEncodingException {
		String str = new String("JAVA 编程 基础");
		byte[] arrs = str.getBytes();
		
		String str1=new String(arrs,"GBK");
		System.out.print(str1);
	}

输出:JAVA 编程 基础

如果想改变UTF-8的乱码,则需要:byte[] arrs = str.getBytes("UTF-8");
代码:

public static void main(String[] args) throws UnsupportedEncodingException {
		String str = new String("JAVA 编程 基础");
		byte[] arrs = str.getBytes("UTF-8");
		
		String str1=new String(arrs,"UTF-8");
		System.out.print(str1);
	}

输出:JAVA 编程 基础

==运算符与equals方法的区别

equals:内容相同。
==:地址相同。

代码:

public static void main(String[] args) {
		// ==与equals方法的区别
		String str1 = "abc", str2 = "abc", str3 = new String("abc");

		// equals:内容相同
		System.out.println(str1.equals(str2));
		System.out.println(str1.equals(str3));

		// ==:地址相同
		System.out.println(str1 == str2);
		System.out.println(str1 == str3);
	}

输出:

true
true
true
false

在内存空间中:

  • 栈:存放类的引用
  • 常量池:存放字符串常量
  • 堆:存放用new创建的字符串对象

我们的String str1 = "abc";,其实是在栈中有一个str1,在常量池中有一个“abc”,且str1指向"abc"。
当我们有String str2 = "abc";时,在栈中也有了一个str2,且它也指向“abc”,实际上他们指向的是同一块内存。所以str1==str2true
str3 = new String("abc");,是在栈里有一个str3,在堆里有一个对象new String("abc"),且str3指向堆里的对象,则它与str1、str2的地址都不同。

字符串的不可变性

String的不可变性是指,String对象一旦被创建,则不能修改,是不可变的。所谓修改其实是创建了新的对象,所指向的内存空间不变。

语句System.out.println(System.identityHashCode(str1));可以查看str1的内存地址,我们可以通过此语句得知修改后的str1是否指向相同的内存地址。

代码:

public static void main(String[] args) {
		// String的不可变性:
		// String对象一旦被创建,则不能修改,是不可变的
		// 所谓修改其实是创建了新的对象,所指向的内存空间不变

		String str1 = "aaa";
		System.out.println(System.identityHashCode(str1));
		str1 = "hello," + str1;
		System.out.println(str1);// 输出 hello,aaa
		System.out.println(System.identityHashCode(str1));
	}

输出:

1586600255
hello,aaa
474675244

由此可见,str1修改前指向的地址为1586600255,修改后str1指向的地址为474675244,也就是说——str1 = "hello," + str1;其实是在常量池里新建了一个字符串常量hello,aaa,然后让str1指向他。

在这里插入图片描述
再来看一段代码:

String str2=new String("abc");
System.out.println(str2.substring(1,3));

这段代码输出bc

在这里,内存空间中堆将会有一个new String("abc"),str2将始终指向它,而子串bc将会在常量池中。

StringBuilder概述

StringStringBuilder的区别:String具有不可变性,而StringBuilder不具备。
建议:当频繁操作字符串时,使用StringBuilder

StringBuilderStringBuffer:二者基本相似,但StringBuffer线程安全,而Stringbuilder没有线程安全,故性能略高。

在这里插入图片描述
相关构造方法:
在这里插入图片描述
具体方法等用的时候查文档就行。

StringBuilder常用方法

  1. append:增加字符
  2. 转换字母大小写
  3. delete:删除索引范围内的字符串(左闭右开)
  4. insert:在某个索引插入某字符串
  5. replace:替换
  6. substring:求子串

代码:

public static void main(String[] args) {

		StringBuilder str = new StringBuilder("你好");

		// 在“你好”后添加内容,使之称为“你好,JAVA”
		System.out.println(str.append(",JAVA"));

		// 将JAVA变为java
		// 方法1:删除大写的,加上小写的
		StringBuilder str1 = new StringBuilder("你好,JAVA");
		System.out.println(str1.delete(3, 7).insert(3, "java"));

		// 方法2:
		StringBuilder str2 = new StringBuilder("你好,JAVA");
		System.out.println(str2.replace(3, 7, "java"));

		// 输出“你好”
		System.out.println(str.substring(0, 2));
	}

输出:

你好,JAVA
你好,java
你好,java
你好

小结

StringBuilder append(String str);
StringBuilder delete(int start,int end);
StringBuilder insert(int offset,String str);
StringBuilder replace(int start,int end,String str);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karshey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值