扬帆起航,再踏征程(二)
(尊重劳动成果,转载请注明出处: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<Student> arrayList = new ArrayList<Student>(); arrayList.add(new Student(29)); HashSet<Student> hashSet = new HashSet<Student>(); 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返回值不一样。
hashCode
public int hashCode()
- 返回该对象的哈希码值。支持此方法是为了提高哈希表(例如
java.util.Hashtable
提供的哈希表)的性能。hashCode
的常规协定是:- 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
- 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用
hashCode
方法都必须生成相同的整数结果。 - 如果根据
equals(java.lang.Object)
方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
- 返回:
- 此对象的一个哈希码值。
3、请找出两处以下代码的优化之处:
String tem=""; for(int i=0;i<arrayList.size();i++){ tem+=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等
如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以加群交流讨论技术问题哦~