Java中String相关问题

目录

1.字符型常量和字符串常量的区别

2.字符串常量池

3.String是基本数据类型吗

4.String为什么是不可变的

5.String不可变,但引用可变

6.如何将字符串反转

7.数组有没有 length()方法?String 有没有 length()方法

8.String 类的常用方法

9.String和StringBuffer、StringBuilder的区别


1.字符型常量和字符串常量的区别

字符型常量:是一个单一的字符,由单引号(')包围。例如:'a'、'1' 。字符型常量在Java中是 char 类型,占用2个字节(16位),可以使用比较操作符(==!=)直接比较两个字符,也可以用字符相关的工具类如 Character 类进行一些操作。

字符串常量:是由双引号(")包围的字符序列。例如,"hello"、"123"。字符串常量在Java中是 String 类型,可以包含零个或多个字符。

2.字符串常量池

        是JVM为字符串提供的一种优化机制。位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。

不同 JDK 版本下字符串常量池的位置以及默认大小是不同的:

JDK 版本字符串常量池位置大小设置
Java 6(方法区)永久代固定大小:1009
Java 7堆中可设置,没有大小限制,默认大小:60013
Java 8堆中可设置,存在大小限制,最小:1009
// 使用常量池创建字符串
String str1 = "Hello";
String str2 = "Hello";

// str1 和 str2 将指向常量池中同一个字符串实例

// 不使用常量池创建字符串
String str3 = new String("World");
String str4 = new String("World");

// str3 和 str4 是 new 操作符创建的新对象,它们在堆内存中具有不同的地址
// 虽然它们的内容相同,但是它们并不是常量池中的同一个字符串的引用

  str4 .intern(); // 将 str4 对象的引用添加到常量池中

3.String是基本数据类型吗

不是。基本数据类型只有 8 个 :byte、short、int、long、float、double、char、boolean。

String 底层就是一个 char 类型的数组

4.String为什么是不可变的

String类利用了final修饰的char类型数组存储字符

5.String不可变,但引用可变

String str = "Hello";
str = str + " World";
System.out.println("str=" + str);

结果:str=Hello World

解析:

实际上,原来String的内容是不变的,只是str由原来指向"Hello"的内存地址转为指向"HelloWorld"的内存地址而已,也就是说多开辟了一块内存区域给"Hello World"字符串

6.如何将字符串反转

使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

// StringBuffer reverse 
StringBuffer stringBuffer = new StringBuffer(); 
stringBuffer.append("abcdefg"); 
System.out.println(stringBuffer. reverse()); // gfedcba 
// StringBuilder reverse 
StringBuilder stringBuilder = new StringBuilder(); 
stringBuilder.append("abcdefg");
System.out.println(stringBuilder. reverse()); // gfedcba

7.数组有没有 length()方法?String 有没有 length()方法

数组没有 length()方法 ,有 length 的属性。String 有 length()方法

8.String 类的常用方法

indexOf():返回指定字符的索引。

charAt():返回指定索引处的字符。

replace():字符串替换。

trim():去除字符串两端空白。

split():分割字符串,返回一个分割后的字符串数组。

getBytes():返回字符串的 byte 类型数组。

length():返回字符串长度。

toLowerCase():将字符串转成小写字母。

toUpperCase():将字符串转成大写字符。

substring():截取字符串。

equals():字符串比较。

9.String和StringBuffer、StringBuilder的区别

可变性

String:不可变

StringBuilder与StringBuffer:可变

线程安全性

String:安全

StringBuilder:不安全

StringBuffer:安全

性能

每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

对于三者使用的总结

如果要操作少量的数据用 = String

单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值