public class ArrayListDemo {
private static class Person{
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()){
return false;
}
Person person = (Person) o;
//两个对象是否等值,通过id 和 name来确定
return this.id == person.id && name.equals(name);
}
@Override public int hashCode() {
return Objects.hash(id, name);
}
@Override public String toString() {
return "Person{" + "id=" + id + ", name='" + name + '\'' + '}';
}
}
public static void main(String []args){
HashMap<Person,String> map = new HashMap<Person, String>();
for(int i = 0; i < 4000000; i ++){
map.put(new Person(i+1,"key_" + i),"value_" + i);
}
long methodStart1 = System.currentTimeMillis();
//取出元素键 找值方式, 这种方式是遍历key,根据key获取映射的vlaue,需要大量调用get(),效率肯定不高
//建议在数据量较大时不用此方式遍历hashMap
Set<Person> keySet = map.keySet();
for(Person person : keySet){
String value = map.get(person);
// System.out.println(person.toString() + " ..... " + value);
}
long methodEnd1 = System.currentTimeMillis();
System.out.println("方法一使用的时间统计为 : " + (methodEnd1 - methodStart1));
System.out.println(" ---------------------------------------------------- ");
long methodStart2 = System.currentTimeMillis();
//取出元素键值对方式
Set<Map.Entry<Person,String>> entrySet = map.entrySet();
for (Map.Entry<Person, String> entry : entrySet){
Person key = entry.getKey();
String value = entry.getValue();
// System.out.println(key.toString() + " ..... " + value);
}
long methodEnd2 = System.currentTimeMillis();
System.out.println("方法二使用的时间统计为 : " + (methodEnd2 - methodStart2));
System.out.println(" ---------------------------------------------------- ");
long methodStart3 = System.currentTimeMillis();
Iterator<Person> keys = map.keySet().iterator();
while (keys.hasNext()) {
Person key = keys.next();
String value = map.get(key);
// System.out.println(key.toString() + " ..... " + value);
}
long methodEnd3 = System.currentTimeMillis();
System.out.println("方法三使用的时间统计为 : " + (methodEnd3 - methodStart3));
System.out.println(" ---------------------------------------------------- ");
long methodStart4 = System.currentTimeMillis();
Iterator<Map.Entry<Person, String>> entryIt = map.entrySet().iterator();
while(entryIt.hasNext()){
Map.Entry<Person, String> entry = entryIt.next();
Person key = entry.getKey();
String value = entry.getValue();
// System.out.println(key.toString() + " ..... " + value);
}
long methodEnd4 = System.currentTimeMillis();
System.out.println("方法四使用的时间统计为 : " + (methodEnd4 - methodStart4));
}
}
//经过试验,发现大数据量的情况下,四者之间的差距还是非常明显的,方法二和方法四的效率明显比其他方式高,推荐使用
方法一使用的时间统计为 : 724
----------------------------------------------------
方法二使用的时间统计为 : 188
----------------------------------------------------
方法三使用的时间统计为 : 3664
----------------------------------------------------
方法四使用的时间统计为 : 195