Java基础随笔总结2-String相关

  String是java中比较特殊的引用类型(java除了八大基本类型和枚举类型,其他都是引用类型),因为他本身是final的,final类不能被继承(继承String本身就是一个错误的行为,对String类型最好的重用方式是关联(HAS-A)而不是继承(IS-A))。

1、String类为什么被定义为final

答:宏观解释:为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。

  微观解释:String基本约定中最重要的一条是immutable(不可变)。声明String为final 和immutable没有必然关系,但是假如String没有声明为final, 那么你的StringChilld就有可能是被复写为mutable的,这样就打破了成为共识的基本约定。

  例子: 

  如果String不可被继承(也就是方法不可能被重写)时,传入String 的s="test", 他不会修改已有的"test", 而是直接新建立一个新的"TEST"返回。
  如果String可以继承,子类就可以重写(override)你的toUpperCase()为mutable(可变的),然后你调用重写后的子类toUpperCase(), 那么整体(依赖于(过)方法uppperString()的所有类)的行为就有可能出现错乱。
 
2、String 和StringBuilder、StringBuffer 的区别?
答:Java 平台提供了两种类型的字符串:String和StringBuffer / StringBuilder,它们可以储存和操作字符串。
  String是只读字符串,也就是说String引用的字符串内容是不能被改变的。而StringBuffer和StringBuilder类表示的字符串对象可以直接进行修改。(append(),delete())
  StringBuilder和StringBuffer的方法完全相同,只不过StringBuilder所有方法均不被synchronized修饰,所以StringBuilder适用于单线程使用(多线程不安全),且效率也略高。
  如果String字符串+后的字符串在静态存储区中早就存在,那么用+做字符串连接是优于StringBuffer / StringBuilder的append()的。
 
3、String s=new String(“xyz”);创建了几个字符串对象?
答:两个对象,一个是静态存储区的"xyz",一个是用new创建在堆上的对象。 
 
4、怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
答:String s1 = “你好”;
  String s2 = new String(s1.getBytes(“GB2312”),“ISO-8859-1”);
 
5、字符串比较相关问题
答:(1)

 

  (2)

 

6、解释内存中的栈(stack)、堆(heap)和静态存储区的用法。

答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;

  而通过new关键字和构造器创建的对象放在堆空间;

  程序中的字面量(literal)如直接书写的100、“hello”和常量都是放在静态存储区中。

  栈空间操作最快但是也很小,通常大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用。

  例子:String str = new String(“test”);

  其中str放在栈上,用new创建出来的字符串对象放在堆上,而“test”这个字面量放在静态存储区。

 

 
 
 
posted @ 2017-07-26 17:30  没有理想的人不伤心  阅读(172)  评论(0)    收藏  举报