@chyoo1991
2015-09-03T14:41:12.000000Z
字数 1824
阅读 1371
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
。