程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(1)

关于java特殊对象String的一点知识

发布于2021-05-29 21:54     阅读(1161)     评论(0)     点赞(3)     收藏(1)


String

在这里插入图片描述

通过常量赋值:

  String str = "pingtouge"

使用这种创建string对象时,首先从常量池创建常量“pingtouge”,而在创建常量pingtouge之前在常量池内先进行判断,判断该对象是否被创建,如果创建就返回该对象的引用地址。如果没有被创建那么就创建一个该字符串。

通过String构造函数创建:

  String str = new String("pingtouge")

使用这种方式创建字符串对象比较复杂。首先在编译过程中字符串会被加入到常量结构中,类加载的时候就会在常量池中创建字符串。然后调用new方法,jvm调用String构造函数,并引用常量池中的字符串,并在堆内存中创建String对象并返回堆内存地址。

    在使用==判断两个值是否相等时是false,因为两者一个指向常量池引用的地址,一个指向堆内存的引用地址

String是一个不可变得对象。通过源码可以看到,string对象的方法由一个final修饰,方法内部的char字符串则由private和final修饰,我们可以看到这就是一个从内到外不可变得对象。

Java 公司为什么要将String设置成不可变的,主要从以下三方面考虑:

	1、保证 String 对象的安全性。假设 String 对象是可变的,那么 String 对象将可能被恶意修改。
	2、保证 hash 属性值不会频繁变更,确保了唯一性,使得类似 HashMap 容器才能实现相应的 key-value 缓存功能。
	3、可以实现字符串常量池

你有用过 str = str + i;这样的表达式么;
其实上从原理来讲这样是会再创建一个String对象的,那么他是不是就会影响性能呢?其实上java公司已经帮助我们考虑过这些问题了,在编译器编译过程中会将这段代码进行优化,一点也不会影响性能了。

你知道intern吗?

		String str = new String("pingtouge");
        String str1 = new String("pingtouge");
        System.out.println("未使用intern()方法:"+(str==str1));//返回值:false
    String str2= new String("pingtouge").intern();
    String str3 = new String("pingtouge").intern();
    System.out.println("使用intern()方法:"+(str2==str3));//返回值:true

为什么呢?

因为被intern形容的字符串在被创建之前会先从常量池中判断是否有和这个对象相同的对象;如果没有就将这个对象创建,并将这个String对象放入常量池中;如果有那就直接使用这个对象的内存地址指向当前创建的对象。

而没有被intern形容的string哪怕赋的值相同也会因为String的特性在常量池创建一个内存地址不同的相同对象。
而==判断的是两个对象之间的内存地址,所以普通对象会返回一个false。而intern对象会返回true。

spring的split方法:

split方法是string切割方法,一般用于较多的字符处理,和正则表达式进行联用。这个方法由于处理的字符串有时候比较多,而相对比的他的切割准则也是依赖于正则表达式的,那么一旦正则有一点问题可定能就会出现内存被大量占用,程序运行时间长,程序崩溃等问题。

推荐大家在使用切割时,如果字符串处理难度不高可以使用indexof或者不适用正则split。

原文链接:https://blog.csdn.net/Beatleschasemoon/article/details/117294218



所属网站分类: 技术文章 > 博客

作者:小泽圈儿郎

链接:http://www.javaheidong.com/blog/article/207689/618b9edcaaaaeb680d4b/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

3 0
收藏该文
已收藏

评论内容:(最多支持255个字符)