您的位置:首页 > 其它

扬帆起航,再踏征程(二)

2016-12-12 19:35 218 查看
(尊重劳动成果,转载请注明出处: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等

如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以加群交流讨论技术问题哦~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: