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)
泛型限定是为了泛型扩展用的