JAJA collections(Java 集合)



System.out.println(anObject):

这行代码调用anObject.toString()方法。可以覆盖该方法来控制输出。


while(line =read.readLine()!=null)

{

String[] tokens=line.split("/");

songList.add(tokens[0])

}


泛型


http://hllvm.group.iteye.com/group/topic/38414

<>符号代表泛型在作用;

运用泛型可以创建类型安全更好的集合,让问题尽可能在编译器被抓到,而不会等到执行期才冒出来。

不给出泛型E时

class AArrayList<e extends Dog> {

}

AArrayList list=new AArrayList()不等于

AArrayList<Object> list=newA ArrayList();

而由于
1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
2.
移除所有的类型参数。

最终等于AArrayList list<Dog>=new AArrayList<DOG>()

List list = new ArrayList<String>()则等于

List list=new ArrayList();

因为虚拟机在new一个对象的时候用的是同一份的ArrayList的模板,不会有ArrayList与ArrayList<String>两份模板。

所以编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型,是则通过,否则抛出ClassCastException异常。

编译器生成的bytecode是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。

List list=new List<Integer>()

与List list =new List()一样

但是编译器会检查左边的泛型类型与右边的泛型类型是否能匹配(有继承关系),如:

List<Fruit> flist2 = new ArrayList<Apple>();//compile error 即使Apple是Fruit的子类;

List<? extends Fruit> flist2 = new ArrayList<Apple>();//能通过,但filst2的不能ADD元素,受到限制。


public class Erasure{

            public void test(List<String> ls){
                System.out.println("Sting");
            }
            public void test(List<Integer> li){
                System.out.println("Integer");
            }
    }

参数类型明明不一样啊,一个List<String>,一个是List<Integer>,但是,偷偷的说,type erasure之后,它就都是List



System.out.println(anObject):

这行代码调用anObject.toString()方法。可以覆盖该方法来控制输出。


while(line =read.readLine()!=null)

{

String[] tokens=line.split("/");

songList.add(tokens[0])

}


1.<T extends Comparable<? super T>> void sort(List<T> list){ }//除去红色部分就是:
2.<T extends Comparable> void sort(List<T> list){ };  或者
3.void sort(List<T extends Comparable> list){};
与一般的对形参的泛型类型带有限制的方法一样。
这样的方法声明下的list可以引用到泛型类型为T或者T的子类的list ,但不能加入元素

至于红色部分:
假设有类E(或Object<E>)继承Comparable<T>接口,则代表类E有与类T进行比较的方法。
所以一开始的函数声明代表T是个能够与T(或T的超类)进行比较的类。

以泛型的观点来说,extends代表extend或Implement如(T extends Comparable)

比较器接口Comparator<T>
Comparator<T>本身不是比较器,实现该接口的类是比较器模板,通过new创建比较器。
比较的类由T指定
方法摘要
 intcompare(T o1, T o2) 
          比较用来排序的两个参数。

可以知道该比较器只能比较两个来自同类型的类。

one.CompareTo(T two)
int compare(T one ,T two)
都表示one排在two前面时返回负数。




SET
注重独一无二的性质(不允许重复)
元素的hashcode()与元素在堆上的位置有关,为了缩小元素的查找成本,加快在容器内查找一个元素的速度。
检查重复的方法:先判断元素的hashcode(),如果不同则两个元素不同;如果两个元素的hashcode()相同,则再调用equals()进行比较。
注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对 象通过equals方法比较返回true时,其hashCode也应该相同。

public boolean addAll(Collection<? extends E> c)     集合间断传递元素


TreeSet
TreeSet<Book> tree=new TreeSet<Book>(bCompare);指定比较器。

编译器把Animal[] 看作类Animal的引用,所以可以有
Animal[] Ani=new Dog[10];//同理可以有
Ani[0]=new Cat();//运行时报ArrayStoreException
结论;Animal[]不一定是Animal类的引用,可能是Dog类的引用










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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值