(尊重劳动成果,转载请注明出处:http://write.blog.csdn.net/postedit/53586469 冷血之心的博客)
1、各大集合的主要特点:
Map接口和Collection接口是所有集合框架的父接口;
Collection接口的子接口包括:Set接口和List接口;
Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等
Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
接口 |
简述 |
实现 |
操作特性 |
成员要求 |
Set |
成员不能重复 |
HashSet |
外部无序地遍历成员 |
成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。 |
TreeSet |
外部有序地遍历成员;附加实现了SortedSet, 支持子集等要求顺序的操作 |
成员要求实现caparable接口,或者使用 Comparator构造TreeSet。成员一般为同一类型。 |
||
LinkedHashSet |
外部按成员的插入顺序遍历成员 |
成员与HashSet成员类似 |
||
List |
提供基于索引的对成员的随机访问 |
ArrayList |
提供快速的基于索引的成员访问,对尾部成员的增加和删除支持较好 |
成员可为任意Object子类的对象 |
LinkedList |
对列表中任何位置的成员的增加和删除支持较好,但对基于索引的成员访问支持性能较差 |
成员可为任意Object子类的对象 |
||
Map |
保存键值对成员,基于键找值操作,compareTo或compare方法对键排序 |
HashMap |
能满足用户对Map的通用需求 |
键成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。 |
TreeMap |
支持对键有序地遍历,使用时建议先用HashMap增加和删除成员,最后从HashMap生成TreeMap;附加实现了SortedMap接口,支持子Map等要求顺序的操作 |
键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。 |
||
LinkedHashMap |
保留键的插入顺序,用equals 方法检查键和值的相等性 |
成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。 |
||
IdentityHashMap |
使用== 来检查键和值的相等性。 |
成员使用的是严格相等 |
||
WeakHashMap |
其行为依赖于垃圾回收线程,没有绝对理由则少用 |
|
2、List和Set中去重机制:
代码如下:
import java.util.ArrayList;
import java.util.HashSet;
]
public class quChong {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add(new Student(29));
HashSet hashSet = new HashSet();
hashSet.add(new Student(29));
System.out.println(hashSet.contains(new Student(29)));
System.out.println(arrayList.contains(new Student(29)));
}
}
class Student{
int age;
public Student(int age){
this.age=age;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Student){
return ((Student) obj).age==this.age;
}else{
return false;
}
}
}
我们在Student类中重写了equals方法,没有重写hashCode方法,则hashSet.contains(new Student(29)) 输出为false。
arrayList.contains(new Student(29)) 输出为 true
原因如下:
1、对于arraylist来说,当equals方法返回为true时,就会认为是重复元素。
2、对于hashSet来说,只有equals方法和hashCode方法返回值都为true时,才会认为是重复元素。此例中没有重写hashCode方法。
再来看下JDK中对hashCode方法的解释,可以看出JVM创建的每一个对象,都会根据该对象的内部地址转换出一个整数来作为hashCode的返回值,故如果不重写hashCode方法,两个对象的hashCode返回值不一样。
public int hashCode()
java.util.Hashtable
提供的哈希表)的性能。
hashCode
的常规协定是:
hashCode
方法都必须生成相同的整数结果。 equals(java.lang.Object)
方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
3、请找出两处以下代码的优化之处:
String tem="";
for(int i=0;i
优化点1:如果arrayList已经确定,则可将arrayList.size计算出来,不必每次都在循环中进行计算。
优化点2:由于使用了String,以上代码会在字符串缓冲池中建立好多个字符串,浪费内存,应该使用StringBuffer或者StringBuilder。
(2)相似的题目还有:
以下语句会创建几个字符串对象?
String str = “Hello” + “world” + “have a nice day”;
答:五个 ,三个标红的毋庸置疑。另外两个也会在字符串缓冲池中被建立哦。
详见 关于Java中equal函数和==的一些区别做一个总结
“Hello”、“world”、“Hello world”、“have a nice day”、“Hello world have a nice day”
(3)String,StringBuffer以及StringBuilder之间的关系
1) 线程安全
StringBuffer 线程安全
StringBuilder 线程不安全
2)速度
一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。
3)总结
如果要操作少量的数据用 = String
单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
4、给出两张表,使用SQL语句进行增删改查操作,主要是查询。
以后注意自己找点SQL语句的笔试题进行定期练习。
5、给出一个字符串1234,如何分别打印出以下字符串:
1234、123、234、23、34、1、2、3、4等
如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以加群交流讨论技术问题哦~