String 详解
String
String对象不可变,当对象创建完毕之后,如果内容改变则会创建一个新的String对象,返回到原地址中。
不可变优点:
多线程安全。
节省空间,提高效率。
源码:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
private final byte[] value;
private final byte coder;
private int hash; // Default to 0
public String(String original) {
this.value = original.value;
this.coder = original.coder;
this.hash = original.hash;
}
//new String()都是在堆上创建字符串对象。当调用 intern() 方法时,编译器会将字符串添加到字符串常量池中,并返回指向该常量的引用。
public native String intern();
}
第一种:直接赋一个字面量
String str1 = "ABCD";
最多创建一个String对象(先在字符串常量池先创建"ABCD"内存空间,再引用)
最少不创建String对象( 如果字符串常量池中存在"ABCD",那么str1直接引用。)
第二种:通过构造器创建
String str2 = new String("ABCD");
new 创建字符串时,首先查看池中是否有相同的字符串,如果有则拷贝一份放到堆中,然后返回堆中的地址。
如果池中没有则在堆中创建一分,然后返回堆中的地址。
常量字符串和变量拼接时(String str = baseStr + "01";),会调用StringBuilder.append()在堆上创建新的对象:
String s1 = "abc";
String s2 = "a";
String s3 = "bc";
String s4 = s2 + s3;
System.out.println(s1 == s4);
A:false,因为s2+s3实际上是使用StringBuilder.append()来完成,会生成不同的对象。
JVM确实对形如 String str = "java"; 的对象放在常量池中,但是它是在编译时做的。
而 String s = s2 + s3; 是在运行时候才能知道的,也就是说 s2 + s3 是在堆里创建的。
String s1 = "abc";
final String s2 = "a";
final String s3 = "bc";
String s4 = s2 + s3;
System.out.println(s1 == s4);
A:true,因为final变量在编译后会直接替换成对应的值,所以实际上等于s4="a"+"bc",而这种情况下,编译器会直接合并为s4="abc",所以最终s1==s4。
StringBuffer(可变字符串)
StringBuffer 与 StringBuilder 中的方法和功能完全是等价的。
线程安全(该对象方法中所有的方法都是用了synchronized修饰符),因此开销也会大。
StringBuilder(可变字符串)
StringBuffer 始于 JDK 1.0
StringBuilder 始于 JDK 1.5
从 JDK 1.5 开始,带有字符串变量的连接操作"+",JVM 内部采用的是 StringBuilder 来实现的,而之前这个操作是采用 StringBuffer 实现的。
StringBuilder是为了提高java中字符串连接的效率:
JVM内部采用了StringBuilder来连接字符串(即"+"操作),但是每次有执行"+"操作的语句时,
JVM都要new一个StringBuilder对象来处理字符串的连接,这在涉及很多的字符串连接操作时开销会很大。
所有我们自己使用StringBuilder来处理字符串的连接,可以提高java中字符串连接的效率
底层原理:
AbstractStringBuilder中采用一个byte[]来保存需要append的字符串,
byte[]有一个初始大小,当append的字符串长度超过当前byte[]容量时,则对byte[]进行动态扩展,
也即重新申请一段更大的内存空间,然后将当前byte[]拷贝到新的位置,
因为重新分配内存并拷贝的开销比较大,所以每次重新申请内存空间都是采用申请大于当前需要的内存空间的方式,这里是2倍
StringBuilder是JDK1.5发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。
常量池详解
https://www.cnblogs.com/loveer/p/11519739.html
String 详解的更多相关文章
- Java的String详解
Java的String详解 博客分类: Java javaStringString详解常用方法 Java的String类在开发时经常都会被使用到,由此可见String的重要性.经过这次认真仔细的学习 ...
- Python操作redis字符串(String)详解 (三)
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...
- [读书笔记]C#学习笔记八:StringBuilder与String详解及参数传递问题剖析
前言 上次在公司开会时有同事分享windebug的知识, 拿的是string字符串Concat拼接 然后用while(true){}死循环的Demo来讲解.其中有提及string操作大量字符串效率低下 ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- Java堆、栈和常量池以及相关String详解
一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- java String 详解
1.java语言的字符串序列是通过字符串类实现的.java提供了3个字符串类:String类.StringBuilder类和StringBuffer类.String类是不变字符串,StringBuff ...
- String详解
在开发中,我们都会频繁的使用String类,掌握String的实现和常用方法是必不可少的,当然,我们还需要了解它的内部实现. 一. String的实现 在Java中,采用了一个char数组实现Stri ...
- C#String详解
字符串:stringLength - 字符串的长度. TrimStart() 压缩空格即消除字符串开始空格TrimEnd() 消除结尾空格Trim() 同时消除开头和结尾空格.注:中间空格不消除,因为 ...
随机推荐
- react-swiper 如何实现滑动小卡片的移动?
1.引入插件 import ReactSwipes from 'react-swipes'; import './swiperCard.css'; 2.代码构成 export default clas ...
- Unity中实现网格轮廓效果,选中边框效果
问题背景: 最近要实现选中实体的高亮效果,要那种类似于unity中Outline的效果,网格轮廓高亮效果. 效果图: 具体代码: OutlineEffect.cs 实体高亮效果类: 轮廓边总控制类,该 ...
- linux7查看时间同步服务器的匹配源
当服务器时间与设定好的同步时间源的时间有差异的时候,一般都需要先查看本机的时间同步服务功能是否在正常的运转,以及同步的时间源是哪里,在这里为大家提供一个检查时间用的命令. linux/centos 7 ...
- RabbitMQ学习第四记:路由模式(direct)
1.什么是路由模式(direct) 路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据.与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机 ...
- vue for 循环例子 2
demo <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf- ...
- Webstorm 、ECMAScript 6 、AngularJS
突然接到一智障询问以上内容,大发善心总结(其实就是CV大法)一下下,希望能帮助某智障.....上干活! WebStorm 刚看到我是懵逼的,但是看到和其他两个在一起,猜想到是前台的一开始以为是前台框架 ...
- java两个栈实现一个队列&&两个队列实现一个栈
栈:先进后出 队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...
- webstorm常见快捷方法与遇到的一些问题
1.动态添加标签快捷写法 例子:生成10个文字按顺序编号的class为task-item的div 2.win10下webstorm的terminal无法输入? 打开一个 cmd.exe,标题栏 右键 ...
- kafaka集群部署
1.集群规划 kafka集群配置是依赖zookeeper的,所以需要保证先安装了zookeeper和jdk注意:kafka内自带zookeeper,我们不使用自带的. hadoop101 hadoop ...
- 剑指offer——25链表中环的入口节点
题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题解: 使用快慢指针即可,若快慢指针会相遇,则有环,否则快指针先到空节点: 此时,快指针从此处一次移一步遍历, ...