20160125--集合Set-Map+总结

来源:互联网 发布:rec播放软件 编辑:程序博客网 时间:2024/06/05 06:15
Set
①HashSet-快速定位
无序-foreach遍历
增加-set.add("");
插入重复元素,覆盖已存在
添加时判断两个对象hashCode,equals判断
例:
/**
* 覆写Account类的equals方法
* @param obj必须是Object类型,否则不能实现覆写
*/
public boolean equals(Object obj) {
if (this == obj) { // 基于性能优化的地址相等判断
return true;
}
if (!(obj instanceof Account)) { // 不是Account对象
return false;
}
Account acc = (Account) obj; // 向下转型
if (acc.getId().equals(this.getId())
&& acc.getPassword().equals(this.getPassword())
&& acc.getBalance() == this.getBalance()) {
return true;
} else {
return false;
}
}
/**
* 覆写hashCode()方法。质数和避免偶然相等
*/
public int hashCode() {
return this.getId().hashCode() * 11
+ this.getPassword().hashCode() * 13
+ ((int) this.getBalance()) * 17;
}
②TreeSet--类转换(ClassCastException)异常
当需要把一个对象放入TreeSet集合时,如果重写该对象对应类的equals方法,应保证该方法与compareTo方法有一致的结果。如果两个对象通过equals方法比较得true,通过compareTo方法比较应得到0。
如果改变TreeSet集合中某个对象的属性,可能会导致与其他对象的大小发生了改变,TreeSet不会再次调整它们的顺序,甚至还会导致出现相同的对象。


Map-键值对(Key,value)
①HashMap
Key是无序存放的,并且Key值不可重复,Key和value是一一对应的,不同key的value可以重复
如果要加入的键值对的key值和HashMap中某个键值对的Key值是相同的,就会将这个Key所对应的value值进行覆盖。
当迭代所有键值对时,其遍历顺序与插入顺序不一样
map.put("key",value);
map.containsKey("key");//查找指定key是否存在
map.containsValue("value");查找指定value是否存在
Set<String> keys = map.keySet(); // 全部的key-foreach
Collection<String> values = map.values(); // 全部的value-foreach
Set<String> keys = map.keySet();//foreach{"key:"+e+"value:"+map.get(e);}
③HashMap
Map.Entry接口可以在外部通过"外部类.内部类"的形式直接调用
for(Map.Entry<String, String> me : map.entrySet()) {me.getKey()+me.getValue();}
可使用自定义类作为value
④Hashtable--Map.Entry
HashMap非线程安全,异步处理方式,性能更高
Hashtable线程安全,同步处理方式,性能较低
⑤TreeMap-可以按key排序
Set<String> keys = map.keySet(); // 得到全部的key-foreach{e+map.get(e);}


集合总结
①集合工具类
提供了一个操作List、Set和Map集合的工具类:Collections。该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设为不可变,对集合对象实现同步控制等方法。
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.reverse(list); // 将集合次序反转
Collections.sort(list); // 将集合排序
print(Collections.max(list)); // 输出集合中的最大元素
print(Collections.min(list)); // 输出集合中的最小元素
Collections.replaceAll(list,6,0); // 将集合中值为6的元素替换为0
Collections.frequency(list, 8); // 判断8在集合中出现的次数
Collections.sort(list); // 将集合排序
print(Collections.binarySearch(list, 8)); // 只有排序以后的集合才可以使用二分法查询
②List接口--有序列表,允许存放重复的元素,通过索引访问
ArrayList:实质是一个会自动增长的数组,查询快,增删慢。
LinkedList:用双向循环链表实现,增删快,查询慢。
ArrayList和LinkedList在用法上没有区别。
③Set接口--没有重复的元素集合
HashSet:元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复。
TreeSet:基于(平衡)树的数据结构,有序
④Map接口
Map是由Key,value组成的键值对。Key是没有顺序,不可重复的。value是可以相同的, Key和value一一对应。
HashMap:键值对,key不能重复,但是value可以重复;无序。
TreeMap: 对key排好序的Map。
处理Map的三种集合:
·key集KeySet()
·value集values()
·key-value集enrySet()
⑤集合遍历方式
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
Iterator it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
for(Object obj:list){
System.out.println(obj);
}

0 0
原创粉丝点击