java基础的一些东西
1,分析:HashMap TreeMap 键怎么做到唯一的,不重复的
HashMap判断键唯一的方式与HashSet是一样
当我们使用Map集合,添加自定义了对象[元素],注意判断元素唯一,
HashMap需要:自定义元素的类,中,需要覆写hashCode equals
HashMap 代码示例:
public static void main(String[] args) {
HashMap hmp = new HashMap();
Student stu1 = new Student("小明",10);
Student stu2 = new Student("小明",20);
hmp.put(stu1, 18);
hmp.put(stu2, 18);
System.out.println(hmp.size());
System.out.println(hmp);
}
class Student{
int age;
String name;
public Student(String name,int age) {
super();
this.name = name;
this.age = age;
}
//@Override
//public int hashCode() {
//
return 0;
//}
//@Override
//public boolean equals(Object obj) {
//return false;
//}
@Override
public String toString() {
// TODO Auto-generated method stub
return name+"-"+age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
TreeMap判断键唯一的方式与TreeSet一样
TreeMap需要:具有自然排序的能力,或者给指定定制比较器
下面是 指定定制比较器代码
public static void main(String[] args) {
//
Student stu1 = new Student("小明",10);
Student stu2 = new Student("小明",20);
Comparator<Object> aa = new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return 1;
}
};
TreeMap tm = new TreeMap(aa);
tm.put(stu1, 50);
tm.put(stu1, 50);
System.out.println(tm.size());
System.out.println(tm);
}
class Student{
int age;
String name;
public Student(String name,int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return name+"-"+age;
}
}
2,LinkedList和ArrayList问题
ArrayList底层使用时数组。LinkedList使用的是链表。
数组查询具有所有查询特定元素比较快。而插入和删除和修改比较慢(数组在内存中是一块连续的内存,如果插入或删除是需要移动内存)。
链表不要求内存是连续的,在当前元素中存放下一个或上一个元素的地址。查询时需要从头部开始,一个一个的找。所以查询效率低。插入时不需要移动内存,只需改变引用指向即可。所以插入或者删除的效率高
ArrayList使用在查询比较多,但是插入和删除比较少的情况,而LinkedList使用在查询比较少而插入和删除比较多的情况。
但是:
实际情况在数据少时linklist比较快,而数据多是arraylist要快的多。
3,
下一篇: HashMap源码及线程不安全分析