Java 关于String字符串原理上的问题
作者:崇尚学技术的科班人 发布时间:2021-05-26 12:48:44
1、String 是最基本的数据类型吗?
不是。
Java 中的基本数据类型只有 8
个 :byte、short、int、long、float、double、char、boolean
;除了基本类型,剩下的都是引用类型,Java 5 以后引入的枚举类型也算是一种比较特殊的引用类型。
2、字符型常量和字符串常量的区别?
形式上: 字符常量是单引号引起的一个字符,字符串常量是双引号引起的若干个字符;
含义上: 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算;字符串常量代表一个地址值(该字符串在内存中存放位置,相当于对象;
占内存大小:字符常量只占
2
个字节;字符串常量占若干个字节(至少一个字符结束标志) (注意: char 在Java中占两个字节)。
3、什么是字符串常量池?
字符串常量池:jvm为了提升性能和减少内存开销,避免字符的重复创建,其维护了一块特殊的内存空间,即字符串常量池。当需要使用字符串时,先去字符串常量池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符串常量池中。
所处位置说明
在jdk6中,常量池的位置在永久代(方法区)中,此时常量池中存储的是对象。
在jdk7中,常量池的位置在堆中,此时,常量池存储的就是引用了。
在jdk8中,永久代(方法区)被元空间取代了。
4、String str=new String(“aaa”)创建了几个对象?
1个或者2个
第一种情况:字符串常量池中已经有了
"aaa"
字符串常量了,那么此时会在堆中通过new String()方法
创建1
个字符串对象。第二种情况:那就是字符串常量池中没有
"aaa"
字符串常量了,此时会创建2
个对象。首先"aaa"
该表达式会查看字符串常量池中是否含有"aaa"
常量,如果没有的话,那么在字符串常量池中就会生成一个值为"aaa"
的字符串常量,然后再在堆中通过new String()方法
创建一个值为"aaa"
的对象。
5、字符串的 intern 方法的执行过程是怎样的?
你学 Java
的别这个高频知识点都不知道呀,不知道的赶紧偷摸补一下。
在解析这个问题之前,我们先来做个题目:
public class Test {
public static void main(String[] args) {
String s = new String("2");
s.intern();
String s1 = "2";
System.out.println(s == s1);
String s3 = new String("3") + new String("3");
s3.intern();
String s4 = "33";
System.out.println(s3 == s4);
}
}
输出结果
//jdk6
false
false
//jdk7
false
true
intern
方法在JDK1.6以前 和 JDK1.7以后有不同的处理:
在JDK1.6中,
intern
的处理是 先判断字符串常量是否在字符串常量池中,如果存在直接返回该常量,如果没有找到,则将该字符串常量加入到字符串常量区,也就是在字符串常量区建立该常量;在JDK1.7中,
intern
的处理是 先判断字符串常量是否在字符串常量池中,如果存在直接返回该常量,如果没有找到,说明该字符串常量在堆中,则处理是把堆区该对象的引用加入到字符串常量池中,以后别人拿到的是该字符串常量的引用,实际存在堆中。
6、String,StringBuffer,StringBuilder 的区别是什么?
可变与不可变
String
// 源码
private final char value[];
String
类中使用字符数组保存字符串,因为有 “final”
修饰符,所以 String
对象是不可变的。对于已经存在的 String
对象的修改都是重新创建一个新的对象,然后把新的值保存进去。
StringBuffer
和 StringBuilder
// 源码
char[] value;
StringBuffer
和 StringBuilder
都继承自 AbstractStringBuilder
类,在 AbstractStringBuilder
中也是使用字符数组保存字符串,这两种对象都是可变的。
是否多线程安全
String
中的对象是不可变的,也就可以理解为常量,显然线程安全。StringBuilder
是非线程安全的。StringBuffer
对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
// StringBuffer 的追加操作
public synchronized StringBuffer append(StringBuffer sb) {
toStringCache = null;
super.append(sb);
return this;
}
性能
每次对
String
类型进行改变的时候,都会生成一个新的String
对象,然后将指针指向新的String
对象。StringBuffer
每次都会对StringBuffer
对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StringBuilder
相比使用StringBuffer
仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
7、String为什么要设计成不可变的?
便于实现字符串常量池。
使多线程安全
避免安全问题:在网络连接和数据库连接中字符串常常作为参数,例如,网络连接地址
URL
,文件路径path
,反射机制所需要的String
参数。其不可变性可以保证连接的安全性。如果字符串是可变的,黑客就有可能改变字符串指向对象的值,那么会引起很严重的安全问题。加快字符串处理速度:由于
String
是不可变的,保证了hashcode
的唯一性,于是在创建对象时其hashcode
就可以放心的缓存了,不需要重新计算。这也就是Map
喜欢将String
作为Key
的原因。
来源:https://blog.csdn.net/weixin_56727438/article/details/123442713


猜你喜欢
- java调用Rsync并发迁移数据并执行校验java代码如下RsyncFile.javaimport lombok.NoArgsConstr
- Spring Cloud Gateway是Spring 官方基于Spring 5.0、Spring Boot 2.0和Project Rea
- 现象: 1. 表面现象: 方法中输出的日志, 日志文件中找不到, 也没有任何报错(即@Async标注的方法没有执行, 也没有报错)2. 分析
- 多级缓存在实际开发项目,为了减少数据库的访问压力,都会将数据缓存到内存中比如:Redis(分布式缓存)、EHCHE(JVM内置缓存).例如在
- 曾几何时,我们写代码的时候,每次写Bean的时候都会使用快捷键生成get/set方法,有时候我经常会想,既然每一个Bean我们都会给其提供g
- 前言:如果让大家说出一款国内比较热门的社交软件,那无疑就是QQ和微信了,说到微信,无不例外的会想到微信公众号和小程序,所以现在它们已经是很多
- 前面的文章有讲到微信的一系列开发文章,包括token获取、菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们
- import java.awt.*; import java.util.*; import javax.swing.*; public cl
- Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式
- Java Json的各种处理一、net.sf.json1、Json转MapJSONObject jsonObject = JSONObjec
- 一、什么是iText?在企业的信息系统中,报表处理一直占比较重要的作用,iText是一种生成PDF报表的Java组件。通过在服务器端使用Js
- 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他
- 前言:最近对接了一个第三方的项目,该项目的数据传输格式是XML。由于工作多年只有之前在医疗行业的时候有接触过少量数据格式是XML的接口,之后
- string t = DateTime.Now.Ticks.ToString();  
- 将此实例的子字符串中所有指定字符的匹配项替换为其他指定字符。 命名空间:System.Text 程序集:mscorl
- 一、JAVA简要概述先说一下java之父,詹姆斯·高斯林这是一个爱喝咖啡而又强大的男人。再来看一下JAVA有多火在TIOBE排行榜上JAVA
- 本文讲述了WinForm中实现拖拽效果的功能,即在WinForm中有一个Button,可以实现拖拽这个Button到目标位置后生成一个该控件
- 本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下前言一、游戏规则介绍扫雷是一个十分经典的游戏,一张棋盘中有很多个不
- Compose中我们应该怎么使用地图呢?像之前我们在xml里面创建MapView,都是在Activity里面,管理MapView生命周期,和
- 引言在 java8 中,您可以使用 Arrays.Stream 或 Stream.of 将 Array 转换为 Stream。1. 对象数组