@chyoo1991
2015-09-03T14:41:12.000000Z
字数 1824
阅读 1440
java
笔试、面试、浏览技术博客和日常工作时遇到自己没有见过的,或者是比较特别的用法、特性等汇总。相信点滴积累,才是技术成熟的基石。
Abstract类声明使用它和接口一样,可以声明使用,而不只是继承。
// 此处声明AbstractMap<String, Integer> am = new HashMap<String, Integer>();am.put("young", 23);am.put("strongyoung", 26);// keySet()返回实现Set()接口的对象,因Set接口继承Collection接口,而Collection继承// Iterable接口,所以包含iterator()方法Iterator<String> itr = am.keySet().iterator();while(itr.hasNext()){String key = itr.next();System.out.println(key + " : " + am.get(key));}
在设计时,优先选用接口而不是抽象类。原因在于Java是单继承,如果设计成抽象类,就会导致子类化时只能继承该抽象类。这样的结果是,子类不能继承其他类,此外,子类与抽象类的耦合度也比用接口时要高。
另外,抽象类的作用在Java的集合框架中体现的很好:实例接口的某些公用部分,对于不同的部分,则由子类各自具体实现。
static String str0="0123456789";static String str1="0123456789";String str2=str1.substring(5);String str3=new String(str2);String str4=new String(str3.toCharArray());str0=null;
问:假定str0,...,str4后续代码都是只读引用。Java 7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为多少?
这里面需要考虑的是字符串常量池是放在PermGen(永久代)里面的。str0和str1都指向PermGen里面的字符串,不会存在堆里。str2相当于new,因而放在堆里。str3和str4都是如此。所以堆里存放的字符是15个。
查看一下String.substring(int x)的实现源码,看是不是new出来的:
public String substring(int beginIndex) {if (beginIndex < 0) {throw new StringIndexOutOfBoundsException(beginIndex);}int subLen = value.length - beginIndex;if (subLen < 0) {throw new StringIndexOutOfBoundsException(subLen);}return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);//此处new}
下属Java代码会输出什么?
public class Example{String str=new String("hello");char[] ch={'a','b'};public static void main(String args[]){Example ex=new Example();ex.change(ex.str,ex.ch);System.out.print(ex.str+" and ");Sytem.out.print(ex.ch);}public void change(String str,char ch[]){str="test ok";ch[0]='c';}}
这个问题最开始我并没有理解清楚。ch[]肯定是会被改变,因为基本类型的数组变量实际上是引用。根据Java只有传值这个特点,引用传过来了,ch[0]='c'则修改了堆中的对象。
同样String也是传引用的,因此change()函数里面的str也是指向hello的一个引用。但是,String对象是不可修改对象,str='test ok'则会新建一个对象test ok,并让str指向它。随着change()函数结束,str消失,则原有的hello并没有任何改变。所以输出结果是:hello and cb。