您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Java String 字符串 详解
JavaString1理解String类运作方式........................................................................................................22创建String............................................................................................................................23StringBuffer跟StringBuilder.................................................................................................34StringBuilder与StringBuffer相比为什么不是线程安全的.................................................55无意识递归...........................................................................................................................61理解String类运作方式Java中的String是不可变类。何为不可变类,第一String不能被继承,因为它是final的第二String内容不能改变而不是引用,这跟final对象变量有区别。因为你可以将一个Stirng变量赋给另一个String变量。对于String为何要设计不可变这个我不知道,但是非可变类确实有着自身的优势,如状态单一,对象简单,便于维护。其次,该类对象对象本质上是线程安全的,不要求同步。此外用户可以共享非可变对象,甚至可以共享它们的内部信息。2创建String创建一个Stirng对象,主要就有以下两种方式:虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。对于第一种,jvm会马上在堆中创建一个String对象,然后将该对象的引用返回给用户。对于第二种,jvm首先会在内部维护的stringspool(缓冲池)中通过String的equels方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在堆中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在堆中创建新的String对象,将其引用返回给用户,同时将该引用添加至stringspool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到stringspool里面的,除非程序调用String的intern方法。看下面的例子:java代码在堆上创建一个对象在中找不到值为的字符串,因此在堆上创建一个对象,并将该对象的引用加入至中此时堆上有两个对象打印结果是因为它们是堆上两个不同的对象此时,发现中已有对象了,因为因此直接返回指向的对象给,也就是说和是指向同一个对象的引用打印结果为再看下面的例子:java代码在堆上创建一个对象程序显式将放到中,运行过程是这样的:首先查看有没对象的引用,没有,则在堆中新建一个对象,然后将新对象的引用加入至中。执行完该语句后,原来指向的对象已经成为垃圾对象了,随时会被收集。此时,发现中已有对象了,因为因此直接返回指向的对象给,也就是说和引用着同一个对象,此时,堆上的有效对象只有一个。打印结果是为什么jvm可以这样处理String对象呢?就是因为String的非可变性。既然所引用的对象一旦创建就永不更改,那么多个引用共用一个对象时互不影响。3StringBuffer跟StringBuilder这条语句该怎么执行呢?我们知道String是不可变的,这时你会想应该是这样的:”abc”跟相连接形成一个行的对象然后依次类推,这样做可行但一旦这样做了那么会产生很多垃圾对象,毕竟你最后你只想要一个结果对象。那么这么做就太占用空间了,并且效率也太低。所以Sun的设计师是考虑到了这一点。使用编译器对上述语句做了优化。下面是字节码很明显上面出现了StringBuilder,但我们代码中并没有写StringBuilder。可想而知是编译器自动添加的。那么StringBuilder又为何物呢?既然编译器添加代码的初衷是为了效率跟空间。那么什么样的对象能解决该问题呢?对!StringBuilder就是一个可变类。所以编译器为我隐式的提升了效率节省了空间,但StringBuilder有一个问题就是在单线程情况下它工作的没有问题,但在多线程环境下它不是安全的。但Sun为我们提供了StringBuffer类,该类是线程安全的。因为需要同步所以效率没有StringBuilder快。4StringBuilder与StringBuffer相比为什么不是线程安全的代码线程main所打印出的sBuilder的长度不定,也就是说mt线程执行的时候,main函数对sBuilder仍在影响,而下面的例子中,所打印出的(线程是安全的)长度是一定的!代码线程5无意识递归publicStringtoString()方法会导致无限制递归。原因是当一个String碰到一个非String会将非String转换成String,所以这里当碰到会将转换成String,怎么转换呢?调用toString()方法,这里有调用了自身的toString()。因此而递归。
本文标题:Java String 字符串 详解
链接地址:https://www.777doc.com/doc-4471834 .html