当前位置: 首页 > news >正文

关于 Java JDK 中内置的一个类:java.lang.String

关于 Java JDK 中内置的一个类:java.lang.String
1、String 表示字符串类型,属于引用数据类型,不属于基本数据类型。
2、在 java 中随便使用双引号括起来的都是 String 对象。例如:“abc”, “def”, “hello world!”,这是 3 个 String 对象。
3、java 中规定,双引号括起来的字符串,是不可变的,也就是说 “abc” 自出生到最终死亡,不可变,
不能变成 “abcd”,也不能变成 “abd”。
4、在JDK当中双引号括起来的字符串,例如:“abc”, “def” 都是直接存储在“方法区”的“字符串常量池”当中的。
为什么SUN公司把字符串存储在一个“字符串常量池”当中呢?
因为字符串在实际的开发中使用太频繁。为了执行效率,所以把字符串放到了方法区的字符串常量池当中。
注意:凡是双引号括起来的都在字符串常量池中有一份。

关于String类中的构造方法。
第一个:String s = new String(“”);
第二个:String s = “”; 最常用
第三个:String s = new String(char数组);
第四个:String s = new String(char数组 ,起始下标, 长度);
第五个:String s = new String(byte数组);
第六个:String s = new String(byte数组, 起始下标, 长度);

对于直接声明的字符串,形如:String x = “”; 则变量x直接指向常量池中;
对于new出来的字符串,new String(“”); 则存储于堆中,但存储的是指向常量池的引用;
intern方法可以向常量池存储字符串,并返回一个常量池的引用对象;
作者:单名一个冲
链接:https://www.jianshu.com/p/1fad17376b49
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
例:
@Test
public void test1(){
String str1 = new String(“This is String”);
String str2 = “This is String”;
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
}

StringBuffer:
思考:我们在实际的开发中,如果需要进行字符串的频繁拼接,会有什么问题?
因为 java 中的字符串是不可变的,每一次拼接都会产生新字符串。
这样会占用大量的方法区内存。造成内存空间的浪费。
String s = “abc”;
s += “hello”;
就以上两行代码,就导致在方法区字符串常量池当中创建了3个对象:
“abc”
“hello”
“abchello”
String s = “”;
// 这样做会给 java 的方法区字符串常量池带来很大的压力。
for(int i = 0; i<100; i++){
// s += i;
s = s + i;
System.out.println(s);
}

如果以后需要进行大量字符串的拼接操作,建议使用JDK中自带的:
java.lang.StringBuffer
java.lang.StringBuilder
不建议使用 “+”连接字符串的方式,这样做会给java的方法区字符串常量池带来很大的压力。

byte 数组:
StringBuffer 底层实际上是一个 byte[] 数组。往 StringBuffer 中放字符串,实际上是放到 byte 数组当中了。
StringBuffer 的初始化容量是 16。

StringBuffer 不会产生新的对象,因为之前的对象都被垃圾回收器GC回收了。

如何优化StringBuffer的性能?
在创建StringBuffer的时候尽可能给定一个初始化容量。
最好减少底层数组的扩容次数。预估计一下,给一个大一些初始化容量。
关键点:给一个合适的初始化容量。可以提高程序的执行效率。

StringBuffer和StringBuilder的区别?
StringBuffer中的方法都有:synchronized关键字修饰。表示StringBuffer在多线程环境下运行是安全的。
StringBuilder中的方法都没有:sychronized关键字修饰,表示StringBuilder在多线程环境下运行是不安全的。

StringBuffer是线程安全的。
StringBuilder是非线程安全的。

相关文章:

  • java+vue基于Spring Boot的渔船出海及海货统计系统
  • AI与编程学习
  • npm报错error:03000086:digital envelope routines::initialization error
  • C#/.NET学习值得推荐的在线论坛和技术社区
  • 即时设计:设计稿与PPT完美结合,让您的创意作品更具影响力
  • 代码随想录算法训练营Day23|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
  • 实验五:动态路由配置
  • Rust-类型
  • 论文阅读1---OpenCalib论文阅读之factory calibration模块
  • 【linux】tcpdump 使用
  • Codeforces Round 761 (Div. 2) D2. Too Many Impostors (hard version)(交互+构造 最小次数)
  • DNS 在互联网中的作用是什么?
  • 01背包问题简单思路
  • QT下的几种实现modbus的库,记录
  • CSS水平垂直居中(最常见的三种方案flex、grid、absolute)
  • Angular2开发踩坑系列-生产环境编译
  • Apache的80端口被占用以及访问时报错403
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • JAVA SE 6 GC调优笔记
  • MySQL主从复制读写分离及奇怪的问题
  • SpringCloud集成分布式事务LCN (一)
  • Vue.js-Day01
  • 技术发展面试
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • ionic入门之数据绑定显示-1
  • MPAndroidChart 教程:Y轴 YAxis
  • raise 与 raise ... from 的区别
  • 如何在招聘中考核.NET架构师
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • ###项目技术发展史
  • #define 用法
  • (0)Nginx 功能特性
  • (a /b)*c的值
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (ZT)薛涌:谈贫说富
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (一) springboot详细介绍
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net web项目 调用webService
  • .NET 反射的使用
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • /etc/sudoer文件配置简析
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @property括号内属性讲解
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ IO.File ] FileSystemWatcher
  • [Android 数据通信] android cmwap接入点
  • [C#7] 1.Tuples(元组)
  • [Codeforces] combinatorics (R1600) Part.2
  • [codevs 2822] 爱在心中 【tarjan 算法】
  • [CSS]文字旁边的竖线以及布局知识