黑马程序员——集合(二)

上一部分了解了集合中的Collection中的list和set.

在set中除了HashSet,还有另外一个TreeSet


下面来了解TreeSet

可以对Set集合中的元素进行排序。

在set集合中可以对集合中的元素进行排序,但是如果遇到对象,就需要调用Comparable接口的compareTo(o)进行比较对象的指定要素,如果指定的要素不能比较大小就开始次比较,也就是拿对象其他的属性元素进行相应的比较。例如下代码


package cn.heima;


import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Student("ewrr",22));
ts.add(new Student("qweaa",50));
ts.add(new Student("aaa",33));
ts.add(new Student("dfaa",22));
Iterator it = ts.iterator();
while (it.hasNext()) {
Student stu = (Student)it.next();
// System.out.println(it.next());
System.out.println(stu.getName() +"....."+ stu.getAge());
}}}
// Comparable//强制让学生类具有比较性
class Student implements Comparable {
private static final Exception RuntimeException = null;
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Object o) {
if (!(o instanceof Student))
throw new java.lang.RuntimeException("不是学生对象没法比较");
Student s = (Student) o;
if (this.age > s.age)
return 1;
if (this.age == s.age)// 次比较,即在年龄相等的情况下进行比较名字字符串
{
return this.name.compareTo(s.name);
}
return -1;

}}



深层分析TreeSet底层的存储结构:


在底层采取二叉树结构存储,用二叉树的遍历来存储去取出元素。

保证元素唯一的条件是compareTo() return 0;

TreeSet的排序方式:

(1)让元素自身具备比较性,元素对象需要调用实现comparable接口,覆盖compareTo()方式。

(2)当元素不具备比较时候,或者具备的比较性不是需要的,这时候就需要让集合自身具备比较性,定义了比较器将比较器对象作为参数传递给TreeSet集合的构造函数;

当两种比较方式都存在的时候以比较器为主,因为接口灵活性更好,也可以吧比较器写成匿名内部类。

在jdk1.5之后出现泛型,将运行时期出现的ClassCastExceotion,转移到编译时期,方便开发者解决问题。


泛型格式:通过<>来定义要操作引用数据类型



(二)Map集合(双列集合)

Map<k,v>,k,v为映射关系。

该集合存在键值对,一对一的存储,而且要保证键的唯一性。


基本操作:

1,添加:put(); putAll();

2,删除 clear();remove(Object ,key);

3,判断 containsKey(Object key);containsValue(Object value)

4,获取get(Object key);size();values();keySet(); entrySet();

其中最重要的两个方法keySet();entrySet();



Map主要分三个子类:HashTable,HashMap,TreeMap

三者的区别:

HashTable:底层是哈希表数据结构,不可以存入null键和null值,该集合是线程同步的,jdk1.0效率低

HashMap: 底层是哈希表结构,可以使用null,null,该集合不同步,jdk1.2,效率高

TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行排序

基本操作代码实例:

package cn.heima;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String,String> map=new HashMap<String,String>();
map.put("lihao", "20");
map.put("zhangji", "30");
map.put("hhh", "52");
map.put("wqdd", "62");
map.put("cccc", "18");
System.out.println("内容"+map.containsKey("lihao"));
//System.out.println("内容"+map.remove("lihao"));
System.out.println(map);
System.out.println(map.get("lihao"));
Collection<String> coll=map.values();
//map.values();

System.out.println(map);
}
}


重点来看看keyset();和entrySet()

1.Set<> keySet:将map中所有的键存入到Set集合中,因为Set具备迭代器,所有可以迭代方式取出的所有的键,再根据get方法获取每一个键的对应值。

Map集合取出原理:将Map集合转为set集合,再通过迭代器取出

如下代码块:

Map<String,String>  map=new HashMap<String,String>();
map.put("lihao", "20");
map.put("zhangji", "30");
//先获取map集合的所有键值的set集合
Set<String> keyset=map.keySet();
//有了Set集合就可以获取其迭代器
Iterator<String> it=keyset.iterator();
while(it.hasNext()){
String key=it.next();
String value=map.get(key);
System.out.println("key"+key+"...."+"value"+value);
}

2.Set<Map.Entry<k,v>>entrySet;返回此映射中包含的映射关系的 Set 视图

也是一个Set,而Set中每个元素是内部类Map.Entry。

实现代码:

Map<String,String> map=new HashMap<String,String>();
map.put("lihao", "20");
map.put("zhangji", "30");
map.put("hhh", "52");
map.put("wqdd", "62");

Set<Map.Entry<String, String>>  entrySet= map.entrySet();
Iterator<Map.Entry<String, String>> it=entrySet.iterator();

while(it.hasNext()){
Entry<String, String> me =it.next();

String key=me.getKey();
String value =me.getValue();
System.out.println(key+".."+value);

}


自学心得:通过学习集合下半部分Map,我感觉到Map和clloection接口其实都是一种处理对象的方式,只是在处理规大模数据的时候,用集合操作更合适

,管理大量数据的数据,比普通操作更规范化。再学习Map集合中,我是从学习collection中基础上来学习,二者类似,但是却各自有各自的不同。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值