[关闭]
@chyoo1991 2015-09-03T14:41:12.000000Z 字数 1824 阅读 1371

Java 小知识汇总(一)

java


笔试、面试、浏览技术博客和日常工作时遇到自己没有见过的,或者是比较特别的用法、特性等汇总。相信点滴积累,才是技术成熟的基石。


1. Abstract类声明使用

它和接口一样,可以声明使用,而不只是继承。

  1. // 此处声明
  2. AbstractMap<String, Integer> am = new HashMap<String, Integer>();
  3. am.put("young", 23);
  4. am.put("strongyoung", 26);
  5. // keySet()返回实现Set()接口的对象,因Set接口继承Collection接口,而Collection继承
  6. // Iterable接口,所以包含iterator()方法
  7. Iterator<String> itr = am.keySet().iterator();
  8. while(itr.hasNext()){
  9. String key = itr.next();
  10. System.out.println(key + " : " + am.get(key));
  11. }

2. 抽象类与接口

   在设计时,优先选用接口而不是抽象类。原因在于Java是单继承,如果设计成抽象类,就会导致子类化时只能继承该抽象类。这样的结果是,子类不能继承其他类,此外,子类与抽象类的耦合度也比用接口时要高。
  
   另外,抽象类的作用在Java的集合框架中体现的很好:实例接口的某些公用部分,对于不同的部分,则由子类各自具体实现。


3. Java字符串的问题

  1. static String str0="0123456789";
  2. static String str1="0123456789";
  3. String str2=str1.substring(5);
  4. String str3=new String(str2);
  5. String str4=new String(str3.toCharArray());
  6. str0=null;

问:假定str0,...,str4后续代码都是只读引用。Java 7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为多少?

  这里面需要考虑的是字符串常量池是放在PermGen(永久代)里面的。str0str1都指向PermGen里面的字符串,不会存在堆里。str2相当于new,因而放在堆里。str3str4都是如此。所以堆里存放的字符是15个。

  查看一下String.substring(int x)的实现源码,看是不是new出来的:

  1. public String substring(int beginIndex) {
  2. if (beginIndex < 0) {
  3. throw new StringIndexOutOfBoundsException(beginIndex);
  4. }
  5. int subLen = value.length - beginIndex;
  6. if (subLen < 0) {
  7. throw new StringIndexOutOfBoundsException(subLen);
  8. }
  9. return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);//此处new
  10. }

下属Java代码会输出什么?

  1. public class Example{
  2. String str=new String("hello");
  3. char[] ch={'a','b'};
  4. public static void main(String args[]){
  5. Example ex=new Example();
  6. ex.change(ex.str,ex.ch);
  7. System.out.print(ex.str+" and ");
  8. Sytem.out.print(ex.ch);
  9. }
  10. public void change(String str,char ch[]){
  11. str="test ok";
  12. ch[0]='c';
  13. }
  14. }

  这个问题最开始我并没有理解清楚。ch[]肯定是会被改变,因为基本类型的数组变量实际上是引用。根据Java只有传值这个特点,引用传过来了,ch[0]='c'则修改了堆中的对象。
   
  同样String也是传引用的,因此change()函数里面的str也是指向hello的一个引用。但是,String对象是不可修改对象,str='test ok'则会新建一个对象test ok,并让str指向它。随着change()函数结束,str消失,则原有的hello并没有任何改变。所以输出结果是:hello and cb


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注