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

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的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);

以上是关于从零开始的Java开发1-5-3 String常用方法字符串与byte数组间的相互转换==运算符与equals方法字符串的不可变性StringBuilder概述与常用方法的主要内容,如果未能解决你的问题,请参考以下文章

从零开始的Java开发1-5-4 ArrayListHashSetHashMap 概述与案例

从零开始搭建Java开发环境第三篇:最新版IDEA常用配置指南,打造你的最酷IDE

从零开始学c++———模拟实现string类(常用接口的实现)

Java从零开始学习——Java基础

Java从零开始学习——Java基础

从零开始学微服务07.微服务常用的开发框架