在我们类中方法上定义泛型
* 1、如果类上面定义了泛型,可以直接使用类上面定义的泛型
* 2、如果方法有返回值,而且返回值不确定是什么类型,我们也可以使用泛型来作为方法的返回值
* 返回值的类型不一定和我们类上面的泛型一直
* 3、如果方法是静态方法的时候,那么就需要在static和返回值中间指定要使用的泛型
* 我们发现,泛型也是有局限性的:一旦指定类上的泛型之后,在方法调用的时候就只能使用指定类型
在接口上定义泛型
我们也可以使用?(通配符)来完成上面方法sop的功能,
* 不同之处在于我们无法使用?来接收it.next()的返回值
* 而且也不用在static方法上面进行<T>声明了,这种方式的书写要比上面简便一点
* ?在那种场合下会使用的多一些呢?
* 在我们的泛型限定中经常来使用?通配符
Set:是一个无序的元素不可重复的集合 (存入的顺序和取出的顺序,不一定一致)
* |--HashSet:底层采用的数据结构是哈希表,如何判断其中元素唯一性呢?
* 是不是通过元素本身的hashCode返回值,如果hashCode返回值相等?
* 就要判断元素本身的equals是否返回为true?
* true--->不存
* false-->存
* |--TreeSet:可以对我们Set集合进行排序。
* 用String做例子,我们发现,这种排序是对字符串进行的自然排序
treeSet的第二种比较的方式:
* 当我们的元素不具备比较性,或者元素自身的比较性不能满足我们业务需求的时候,
* 我们这时就哟采用第二种比较的方式——让我们集合具备比较性。
* 要说明一点的是:需要再我们集合创建的时候就要指定相应的自定义的比较器Comparator
* 要求:
* 按照person的姓名进行比较,当姓名相同的时候再按照person进行比较进行比较。
*
* 当我们的主要比较条件无法满足比较(分不出大小的时候),我们就需要按照次要条件进行比较了
* 记住:当我们的元素和集合都具备了比较性的时候,优先使用集合提供的比较器
我们发现无法存入自定义的对象,因为我们自定义的对象不能转化为Compareable
* ClassCastException: cn.crxy.collection.treeset.BeautifulGirl
* cannot be cast to java.lang.Comparable
* 也就是说,我们自定义的对象不具备比较性
* 如果要让我们自定义的对象存入TreeSet,那就必须要让自定义的对象实现implements Comparable接口
* 那么就必须要覆盖Comparable接口中的唯一方法compareTo(Object)
* 要求:
* 按照bg的年龄进行比较,当年龄相同的时候再按照bg的姓名进行比较。
* 当我们的主要比较条件无法满足比较(分不出大小的时候),我们就需要按照次要条件进行比较了
要求:给定一堆字符串,按照字符串的长度进行排序(升序)
* 如果长度相同,按照自然顺序进行排序
*Collecion
* |--List:可以重复且有序
* |--ArrayList:数组;查询快,增删慢;线程不安全,jdk1.2
* |--LinkedList:链表,查询慢,增删快;线程不安全;jdk1.2
* |--vector:数组,查询慢,增删慢;线程安全,jdk1.0
* |--Set:元素无序且不重复
* |--HashSet:hash表;如果判断元素的唯一性:
* 比较它的hashCode,如果hashCode值相等,
* ==》equals,是否返回true
* true?==》认为是同一个元素,不存
* false?==》不是同一个元素,存入
* |--TreeSet:二叉树,是一个有序的set,这个顺序默认是自然顺序
* 有两种比较的方式:
* 元素具备比较性,需要实现Comparable接口,复写compareTo(obj)方法
* 集合具备比较性:需要再集成创建的时候,指定相应的比较器
* 推荐大家使用第二种的前提下,看我们的具体的业务需求
* 执行顺序:当集合和其中的元素都具备比较性的时候,会优先使用集合的比较器。