java的String类理解
来源:互联网 发布:甲骨文java培训班骗局 编辑:程序博客网 时间:2024/06/09 16:17
Java String是一个“不可变常量字符串”对象,final属性定义。之所以这么说,是从String内部在盛放字符串时候的容器char数组而言。比如当用户在初始化阶段定义了一个String对象String s=”hello,world!”,而此时再次对s进行操作改变s的值时候,如再次给s赋值使得s=xy”,那么Java的JVM其实是再次创建了一个新的String对象,然后移动指针s指向了新的String对象(对象内部的字符串是“xy”)。由此可见,假如在代码中需要频繁的修改String对象中的字符内容,那么应该尽量避免使用String,原因在于每一次修改String内容后,其实就是JVM在内存堆上创建了一个新的String对象,由此导致的问题有三:
(一)如果代码中的String对象频繁的修改,表面仍然是在一个String对象中修改赋值,但其实底层的JavaJVM在内存的堆上创建了更多新的String对象,同时与之相伴随的是更多死去的String对象,此过程简单总结就是Java JVM在频繁的创建对象,也产生死去的对象,即,生成一个新的String对象,死去一个String对象。这样将产生大量JVM内存碎片,极大概率提高Java了系统触发Java GC的时机,由此降低了系统性能 。
(二)String对象的产生、赋值修改操作过程是多线程不安全操作,原因如前所述,每一次对String对象的赋值、操作,导致Java JVM在底层创建了新的String对象,在操作系统的CPU时机片上,线程不保证安全。如果多线程在操作此String对象,那么就极有可能在操作系统调度切换CPU时间片时,操作的目标对象不一致,有的指向新的String s对象,有的线程却仍指向旧的String s对象。
(三)每一次修改赋值String s对象,是创建了新的String对象,然后把新的对象引用赋给s。这个操作是在堆上创建 ,若频繁操作,势必造成较大系统开销。
小结:如果是在代码启动后,String对象不再修改重新赋值,那么可以考虑使用String,比如在代码中定义一些public static final String常量。如果需要在代码中频繁修改和赋值操作字符串对象具体内容,建议使用StringBuffer。
不同于String字符串常量,StringBuffer是字符串变量。StringBuffer不会产生String那样的问题:每一次修改就重新创建一个新的String对象。在某种程度上讲,StringBuffer内部维持一个可变长度的char数组盛放用户字符数据,因此StringBuffer是线程安全的。由于StringBuffer是在一个字符char数组进行原子赋值、操作,不是像String那样以“乾坤大挪移”的方式改变引用进行字符串赋值、操作,在理论上讲,字符的操作层面,StringBuffer的性能优于String。
StringBuilder是在后续新版Java中引入的字符类,StringBuilder和StringBuffer类似,均是字符串变量,但是StringBuilder多线程不安全,而单线程安全,StringBuilder在单线程中性能优于StringBuffer,所,如果仅仅是在单线程中使用字符串变量,优先可考虑使用StringBuilder。
- java的String类理解
- java中对于String类的理解
- Java中String类的一些理解
- java String类字符串常量的理解
- Java String 的简单理解
- Java基础之010-深入理解Java的String类
- 深入理解java String类
- Java String类深入理解
- 深入理解Java:String类
- 深入理解Java String类
- Java入门学习-理解int,String,理解类、方法,理解return的用法。
- 我理解的Java栈与堆,String类
- 对Java中String类的一点点理解
- 个人理解Java中String与StringBuffer类的区别
- Java中String类的intern()方法深入理解。
- Java中String类的equals方法理解
- java中String的透彻理解
- 对java中String的理解
- 10.30作业
- 部署私有Docker Registry
- JS获取节点的兄弟,父级,子级元素(原生和基于jquery) 、动态创建文档元素 、this和$(this)区别
- erlang高性能网络库esockd的编译和使用(二)-application
- JavaSecurity和JAAS——Java标准安全体系概述(上)
- java的String类理解
- 针对recyclerView的adapter封装
- ndarray数组的索引与切片
- Linux下开发文件规范常用处理
- JVM知识点总览-中高级Java工程师面试必备
- HTML5语义标签
- JAVA方法参数
- Android Gradle项目同步失败错误
- Python3之Django Web框架F对象,Q对象