从零开始的Java开发1-5-3 String常用方法字符串与byte数组间的相互转换==运算符与equals方法字符串的不可变性StringBuilder概述与常用方法
Posted karshey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的Java开发1-5-3 String常用方法字符串与byte数组间的相互转换==运算符与equals方法字符串的不可变性StringBuilder概述与常用方法相关的知识,希望对你有一定的参考价值。
文章目录
String常用方法(输出长度、索引对应字符、子串)
length
输出长度charAt
输出某个索引对应的字符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==str2
是true
。
而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概述
String
和StringBuilder
的区别:String
具有不可变性,而StringBuilder
不具备。
建议:当频繁操作字符串时,使用StringBuilder
。
StringBuilder
与StringBuffer
:二者基本相似,但StringBuffer
线程安全,而Stringbuilder
没有线程安全,故性能略高。
相关构造方法:
具体方法等用的时候查文档就行。
StringBuilder常用方法
append
:增加字符- 转换字母大小写
delete
:删除索引范围内的字符串(左闭右开)insert
:在某个索引插入某字符串replace
:替换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