18.Java集合框架(二)

01.集合框架(TreeSet)

Set:无序,不可以重复元素
 HashSet:数据结构是哈希表,线程时非同步的。
 保证元素唯一性的原理,判断元素的hashcode是否相同,如果相同,还会继续判断元素的equals方法,是否为true。
 TreeSet:可以对set集合中的元素排序
 底层数据结构是二叉树,保证元素唯一性的依据:compareTo方法return 0;
 TreeSet排序的第一种方式:让元素自身具备比较性,元素需要实现Compareable接口,覆盖compareTo方法,这种顺序也叫自然顺序,也叫默认顺序。
 
02.集合框架(TreeSet存储自定义对象)

TreeSet里存储的自定义对象的类必须实现Comparable接口,并覆盖compareTo(Object obj)方法。
该方法返回负数,零或正数,分别代表该对象小于,等于或大于该对象。

记住:排序时,当主要条件相同时,一定要判断一下次要条件。

03.集合框架(二叉树)
 
04.集合框架(comparator方式实现排序)

TreeSet集合的第二种排序方式:
当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时需要让集合自身具备比较性。

在集合一初始化时,就有了比较方式。
定义一个比较器,
class MyCompare implements Comparator
{
 public int compare(Object o1,Object o2)
 {
  排序方式;
 }
}
然后在创建TreeSet对象时,传进一个MyCompare对象
TreeSet TS=new TreeSet(new MyCompare());
那么这个TS就会以实现Comparator接口的MyCompare类的对象的排序方式进行排序。
 
总结两种比较方式:一是让容器自身具有比较性,容器初始化时实传入Comparator接口对象;二是让对象具有比较性,对象实现Compareable接口。
 
05.集合框架(TreeSet练习)

需求:按字符串长度进行排序

建议使用方式:让TreeSet初始化时传入Comparator接口对象。
不仅需要比较长度,当产度相等时,还要判断,长度相等时可以自然排序。
 
06.集合框架(泛型概述)

jdk1.5版本之后出现新特性,用于解决安全问题的,是一个安全机制。

如下:只能存储String的ArrayList
ArrayList<String> AL=new ArrayList<String>();
//取出的时候也要用泛型
Iterator<String> It=AL.iterator();
while(It.hasNext())
{
 取出元素:It.next();
}


好处一:
将运行时期的出现的问题ClassCastException转移到了编译时期,方便程序员解决问题,让运行时的问题减少,安全。
2.避免了强制转换麻烦。
 
07.集合框架(泛型使用)

泛型格式:通过<>来定义要操作对象的引用类型。

在使用java时,什么时候可以使用泛型呢?
通常在集合框架中很常见,只要见到<>就可以使用。
其实<>是用来接收类型的,当使用集合时,将集合中要存储的数据类型作为参数传递到<>即可。
泛型只能接受引用数据类型。 
 
08.集合框架(泛型类)

没有泛型时的工具类:
class Tool
{
 private Object obj;
 public void setObject(Object obj)
 {
  this.obj=obj;
 }
 public Object getObject()
 {
  return obj;
 }
}
泛型出现后的工具类:
class Tool<QQ>
{
 private QQ q;
 public void setObject(QQ q)
 {
  this.q=q;
 }
 public QQ getObject()
 {
  return q;
 }
}
这就是传说中的泛型类。

什么时候需要泛型类:当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型来完成扩展。
 
09.集合框架(泛型方法)

class Demo<T>
{
 public void show(T t)//该方法的参数类型随着该类的泛型走
 {
  
 }
 public <Q> void print(Q q)//泛型方法,该方法的参数类型是Q
 {
  
 }

泛型类定义的泛型在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所以要操作的类型就已经固定了。
为了让不同方法可以操作不同类型,而且类型还不确定,那么就可以将泛型定义在方法上。
 
10.集合框架(静态泛型方法)
 
记住:特殊之处:
静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。public static <W> void method(W w)
{
 

 
11.集合框架(泛型接口) 
 
泛型定义在接口上
interface Inter<T>
{
 void show(T t);

class InterSon<T> implements Inter<T>
{
 public void show(T t)
 {
  
 }
}

12.集合框架(泛型限定) 
 
通用的泛型:如ArrayList<?> al;

public static <T> void print(ArrayList<T> al)
{
 Iterator<T> it=al.iterator();
 while(it.hasNext())
 {
  打印;
 }

通用泛型可以把上面的T换成?号。但要注意传入对象的特有方法。

泛型限定:
?:通配符,也可以理解为占位符。 
<? extends E>:可以接受E类型或E的子类型,这是上限固定。
<? super E>:可以接受E类型或者E的父类型。这是下限固定。
 
13.集合框架(泛型限定2)

泛型限定是为了泛型扩展用的

posted on 2012-04-21 11:05  Barclay.Xu  阅读(826)  评论(0编辑  收藏  举报