博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数据结构】字符串
阅读量:4200 次
发布时间:2019-05-26

本文共 2259 字,大约阅读时间需要 7 分钟。

字符串

String

Java中的String是一个类,而并非基本数据类型。

string是值传入,不是引用传入。

对String的修改其实是new了一个StringBuilder并调用append方法,然后调用toString返回一个新的String。

创建方式

  • String a = “字符串内容”–指向方法区
  • String b = new String(“字符串内容”)–指向堆中的对象

所有 new 的对象都会在 Heap 中

字符串留驻

多次创建相同的字符串文字,只存储每个不同字符串值得副本

编译期字符串常量会被自动留驻

运行期字符串留驻:调用intern()把创建的字符串拘留在方法区

特点

  • 创建的是不可变对象

  • 方法不会改变它自身,而是返回一个新的字符串

  • 如果需要一个字符串被修改,我们最好使用 StringBuffer 或者 StringBuilder,否则,由于每次操作字符串都会创建一个新的对象,而旧的对象不会有引用指向它,这样我们会浪费很多垃圾回收的时间

  • 不可继承

    对String类型最好的重用方式是关联(HAS-A)而不是继承(IS-A)。

字符串操作函数

  • length()获取字符串的长度

  • indexOf()搜索字符串出现的位置

  • charAt()获取指定索引的字符

  • trim()去除首位空格和制表符(\t)

  • replaceAll(reg,s)替换指定的所有字符

  • str.startsWith(),str.endWith()判断字符串的开始和结束

  • str.toLowerCae()和str.toUpperCase()字母大小写转换

  • str.split(String sign)和str.split(String sign,int limited) 字符串分割

  • str.format(格式,参数) 格式化字符串

  • str1.concat(str2); 方法合并字符串:

  • tail()表示取字符串的尾部

  • head()表示取字符串的头

  • concat()表示字符串拼接。

  • slice() 方法可从已有的数组中返回选定的元素。

  • reverse() 方法用于颠倒数组中元素的顺序。

StringBuffer

StringBuffer允许多线程进行字符操作。 这是因为在源代码中StringBuffer的很多方法都被关键字 synchronized 修饰了,而StringBuilder没有。

StringBuffer是在StringBuilder基础上加锁,加锁是一个重量级的操作,需要调用操作系统内核来实现,比较耗时。

StringBuilder

StringBuilder的效率比StringBuffer稍高,如果不考虑线程安全,StringBuilder应该是首选。

StringBuilder是JDK 1.5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer略高。

String 、StringBuffer与StringBuilder的区别

效率

StringString(大姐,出生于JDK1.0时代) 不可变字符序

<StringBuffer(二姐,出生于JDK1.0时代) 线程安全的可变字符序列

<StringBuilder(小妹,出生于JDK1.5时代) 非线程安全的可变字符序列

JVM运行程序主要的时间耗费是在创建对象和回收对象上。

可变性

  • String是只读字符串–String引用的字符串内容是不能被改变的。
  • StringBuffer和StringBuilder类表示的字符串对象可以直接进行修改。

JVM对String的优化

String str = hello"+"java";

在编译时就能确认,编译器会直接将其拼接成一个字符串放在常量池:“hello java”;

String a ="hello";String b = "java";String c = a+b;

运行时才会确认c,编译器不会进行优化

String s = new String (“字符串”)创建了几个字符串对象

  1. 方法区存在“字符串”,创建一个对象
  2. 方法区不存在"字符串",创建两个对象:在方法区创建该对象然后在堆中在创建对象

被 final 修饰的原因

字符串池的需求

字符串池(String intern pool)是方法区域中的一个特殊存储区域。

当创建一个字符串时,如果该字符串已经存在于池中,那么返回现有字符串的引用,而不是创建一个新对象。

所以说,如果一个字符串是可变的,那么改变一个引用的值,将导致原本指向该值的引用获取到错误的值

缓存 hashcode

字符串的hashcode在Java中经常使用。

在HashMap或HashSet中,不可变保证hashcode始终是相同的,这样就可以在不担心更改的情况下兑现它。

这意味着,不需要每次使用hashcode时都计算它。这样更有效率。

安全性

String被广泛用作许多java类的参数,例如网络连接、打开文件等。

如果字符串不是不可变的,连接或文件将被更改,这可能导致严重的安全威胁。

该方法认为它连接到一台机器上,但实际上并没有。可变字符串也可能导致反射中的安全问题,因为参数是字符串

不可变对象天生是线程安全的

由于不可变对象不能被更改,所以它们可以在多个线程之间自由共享。这消除了同步的需求。

转载地址:http://mofli.baihongyu.com/

你可能感兴趣的文章
软件测试内功心法
查看>>
性能测试过程中如何将用户需求转换为测试需求
查看>>
LR测试场景执行过程
查看>>
LR HTTP/HTML脚本中过滤,不需要的请求
查看>>
软件测试内功心法—序
查看>>
应用Wmware workstation 组建自己的局域网
查看>>
通过FTP服务的winsockes录制脚本
查看>>
LoadRunner 培训心得
查看>>
LR参数化详解(朋友写的原创文章)
查看>>
应用Chariot解决网闸通道吞吐量的测试
查看>>
LRwinsocket协议测试AAA服务器
查看>>
Net远程管理实验
查看>>
反病毒专家谈虚拟机技术 面临两大技术难题
查看>>
几种典型的反病毒技术:特征码技术、覆盖法技术等
查看>>
反虚拟机技术
查看>>
性能测试一般过程与LR性能测试过程
查看>>
LoadRunner专题系列——LoadRunner脚本中的参数化
查看>>
将事务插入到 Vuser 脚本(lr用户手册)
查看>>
测试时代新推出《测试员》特刊之软件测试基础
查看>>
关于事务(transaction)
查看>>