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

这篇具有很好参考价值的文章主要介绍了关于 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是非线程安全的。

1、String为啥是不可变的?
源代码,String 类中有一个 byte[] 数组,这个 byte[] 数组采用了 final 修饰,因为数组一旦创建长度不可变。
并且被 final 修饰的引用一旦指向某个对象之后,不可再指向其它对象,所以 String 是不可变的!
“abc” 无法变成 “abcd”
2、StringBuilder/StringBuffer 为什么是可变的呢?
源代码,StringBuffer/StringBuilder 内部实际上是一个 byte[] 数组,这个 byte[] 数组没有被 final 修饰,
StringBuffer/StringBuilder 的初始化容量是16,当存满之后会进行扩容,底层调用了数组拷贝的方法。
System.arraycopy() . . .是这样扩容的。所以 StringBuilder/StringBuffer 适合于使用字符串的频繁拼接操作。
3、字符串不可变是什么意思?是说双引号里面的字符串对象一旦创建不可变。
String s4 = “abc”;
s4 变量是可以指向其它对象的。字符串不可变是说以上变量 s4 不可变。说的是”abc“这个对象不可变。
s4 = “xyz”;
例:
public static void main(String[] args) {
String a = “hello”;
a = “hello hello”;
System.out.println(a); // hello hello
}文章来源地址https://www.toymoban.com/news/detail-792538.html

到了这里,关于关于 Java JDK 中内置的一个类:java.lang.String的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,b

    异常信息提示:  添加坐标后,一启动服务就报错,启动失败。 解决方法是添加虚拟机选项: 再次启动效果:成功启动。  

    2024年01月16日
    浏览(42)
  • 已解决java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String异常的

    已解决java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String异常的正确解决方法,亲测有效!!! java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String的错误通常发

    2024年01月21日
    浏览(45)
  • java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified问题

    问题如图: 1.问题描述 IllegalArgumentException 顾名思义,非法参数异常(差点看出来了,但凡我英文好点......) Name for argument of type [java.lang.String] not specified, and parameter name information not found in class file either. 未指定 [java.lang.String] 类型的参数的名称,并且在类文件中也找不到参数名称

    2024年03月13日
    浏览(48)
  • java设计模式-观察者模式(jdk内置)

    上一篇我们学习了 观察者模式。 观察者和被观察者接口都是我们自己定义的,整个设计模式我们从无到有都是自己设计的,其实,java已经内置了这个设计模式,我们只需要定义实现类即可。 下面我们不多说明,直接示例代码,例子依然同 观察者模式篇章,建议先去看看。

    2024年02月15日
    浏览(29)
  • java.lang.NumberFormatException: For input string: ““问题修复

    在进行数字的格式化时出现了异常,比如我这里遇到的就是使用Long.parseLong(param)方法时,参数param传入了一个空的字符串\\\"\\\",导致了异常的发生。 在使用Long.parseLong(参数)方法时,先判断参数param是否不为空字符串,即可避免该问题。 对于java.lang.NumberFormatException: For input strin

    2024年02月09日
    浏览(40)
  • Can not set java.lang.String field com.iS.UserEntity.name to java.lang.Class

    通过反射获取运行时对象的属性时遇到 java.lang.IllegalArgumentException: Can not set java.lang.String field com.iS.UserEntity.name to java.lang.Class 通过field.get(obj)引用错误,这里的obj应该是运行时的obj对象,而非.getClass()后的类型 错误的: 正确的:

    2024年02月16日
    浏览(38)
  • 已解决java.lang.String cannot be cast to java.lang.Integer异常的正确解决方法,亲测有效!!!

    已解决java.lang.String cannot be cast to java.lang.Integer异常的正确解决方法,亲测有效!!! 开发中经常会遇到java.lang.String cannot be cast to java.lang.Integer异常,记录下我怎么解决的。 这个错误是因为你试图将一个字符串对象转换为整数对象,但是类型不匹配。 下滑查看解决方法 在

    2023年04月08日
    浏览(62)
  • java.math.BigDecimal cannot be cast to java.lang.String 报错

    “java.math.BigDecimal cannot be cast to java.lang.String”错误信息表示您正在尝试将BigDecimal对象转换为String。但是,BigDecimal和String是两个不同的类型,它们不能直接相互转换。 BigDecimal是Java“math”包中的一个类,用于进行精确的小数运算。它可以处理任意位数的小数,包括小数部分。

    2024年02月10日
    浏览(33)
  • 解决Failed to convert value of type ‘java.lang.String‘ to required type ‘java.lang.Integer

    项目:网上商城练习 问题:使用postman测试接口报错:类型转换异常 上代码: 改为: 直接去掉{}和@PathVariable注释,容易找不到对应的参数类型,希望对大家有用,问题已解决。

    2024年02月11日
    浏览(44)
  • jdk版本冲突,java.lang.UnsupportedClassVersionError: JVMCFRE003

    主要是编辑器所用的jdk版本和项目用的不一致导致的,虽然编译通过了,但是运行是会报错 选好后点击Apply点击ok,然后重新编译一遍项目就可以了

    2024年04月26日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包