八
17
2010
注意:建议使用org.apache.tools.zip.*包下相关类,否则可能会出现中文乱码问题。
参考:java 实现zip与unzip
no comments | tags: java, zip | posted in 编程实践
八
5
2010
对于简单的对象,只要实现Cloneable接口,并且重写Object类的clone()方法即可。对于复杂的对象,必需将其中的复杂成员变量也进行clone,实现起来太繁琐。这里有一种简便方法,先将对象序列化到内存,然后再其反序列化。主要代码如下所示:
参照:java clone方法使用详解
1 comment | tags: java | posted in 编程实践
五
2
2010
3 comments | tags: google, java, rss | posted in 编程实践
二
25
2010
今天工作中遇到一个问题,虽然在Employee中重写了equals方法,但是往HashSet中存放Employee对象的时候还是出现了重复值。
于是查看了JDK源码,发现HashSet竟然是借助HashMap来实现的,利用HashMap中Key的唯一性,来保证HashSet中不出现重复值。具体参见代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<E,Object>();
}
public boolean contains(Object o) {
return map.containsKey(o);
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
} |
由此可见,HashSet中的元素实际上是作为HashMap中的Key存放在HashMap中的。下面是HashMap类中的put方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
} |
从这段代码中可以看出,HashMap中的Key是根据对象的hashCode() 和 euqals()来判断是否唯一的。
结论:为了保证HashSet中的对象不会出现重复值,在被存放元素的类中必须要重写hashCode()和equals()这两个方法。
no comments | tags: java | posted in 编程实践
二
6
2010
前一段时间写过的一个集合排序的方法,可以按照集合中存放Bean的任意属性进行排序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| /**
* 按照指定属性,对List集合进行排序。
*
* @param list bean集合
* @param sortBy 要进行排序的bean中的属性
* @param sort 升序或降序
*/
public static <T> void sort(List<T> list, final String sortBy,final String sort) {
if (list == null || sortBy == null ||sortBy.equals("")|| list.isEmpty())
return;
Collections.sort(list, new Comparator<T>() {
@SuppressWarnings("unchecked")
public int compare(T t1, T t2) {
Object o1 = null;
Object o2 = null;
try {
o1 = ReflexUtil.getObjFieldValue(t1, sortBy);
o2 = ReflexUtil.getObjFieldValue(t2, sortBy);
} catch (Exception e) {
e.printStackTrace();
}
int result = 0;
if(o1==null){
result=-1;
}
else if(o2==null){
result=1;
}
//字符串按照拼音排序
else if (o1 instanceof String) {
result = Collator.getInstance(Locale.CHINA).compare(o1, o2);
} else {
result = ((Comparable) o1).compareTo(o2);
}
if(DESC.equalsIgnoreCase(sort)){
result=0-result;
}
return result;
}
});
} |
注:ReflexUtil.getObjFieldValue(t1, sortBy) 用反射技术获取对象t1中sortBy属性的值。
no comments | tags: java | posted in 编程实践
八
3
2009
1 comment | tags: architecture, java | posted in 编程实践
四
13
2009
用Properties读取Java属性文件的时候,会出现中文乱码的情况,这时就需要用JDK Bin目录下小工具native2ascii.exe了,native2ascii 转换实用程序允许进行源码编码,生成以 ISO 8859-1 编码的输出。在命令提示符下执行:
native2ascii -encoding gb2312 source.properties object.properties
另外也可以用UltralEdit另存为Unicode-ASCII Escaped格式进行转换。
为什么要进行转换呢?
Properties的输入/输出流采用的 ISO 8859-1 字符编码的格式,所以就用到了Unicode转义,来处理此编码中无法直接表示的字符。
1 comment | tags: java | posted in 编程实践
四
9
2009
Google App Engine开始支持Java了,一个振奋人心的消息,以后可以将自己写得Java Web程序放到GAE上了。
如何在Google App Engine上开发、部署Java程序:http://code.google.com/appengine/docs/java/gettingstarted/
刚刚下载完Google Plugin for Eclipse ,对于开发部署过程还需要仔细研究一下。
no comments | tags: gae, java | posted in 编程实践
三
23
2009
评论关闭 | tags: java, thread | posted in 编程实践, 网络资源
三
18
2009
1、作用域public,private,protected,以及不写时的区别?
答:区别如下:
作用域 当前类 同一packag 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不写时默认为friendly
2、char型变量中能不能存贮一个中文汉字?为什么?
答:是能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文字符是没问题的。
3、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
答:匿名的内部类是没有名字的内部类,不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
4、Static Nested Class 和Inner Class的不同?
答:Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象。
5、&和&&的区别?
答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。
6、Collection 和Collections的区别?
答:Collection是集合类的上级接口,继承与他的接口主要有Set 和List。
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
Continue reading
1 comment | tags: java, 就业面试 | posted in 就业面试