集合(2)TreeSet , 泛型

原创 2015年07月07日 22:57:19


TreeSet:  二叉树数据结构,可以对元素进行排序,不同步的。
  如何保证元素唯一性?
  参考的就是比较方法的返回值是否是0,是,就是重复元素,不存。
 **排序方式:需要元素具备比较功能,所以元素需要实现Comparable接口。
              覆盖compareTo方法。
**需求中也有这样一种情况,元素具备的比较功能不是所需要的,也就是说不想按照
  自然排序的方法,而是按照自定义的排序方法,对元素就行排序。
而且,存储到TreeSet中的元素万一没有比较功能,该如何排序呢?
 这时,就只能用第二种比较方式--让集合具备比较功能。

初始化TreeSet集合时明确一个比较器。

实现Comparator接口,覆盖compare方法 。将Comparator接口的对象
         作为参数传递给TreeSet集合的构造器。

比较器更为灵活,自然排序通常作为元素的默认排序。


异常: java.lang.ClassCastException
 原因:因为学生要排序,就需要比较,而没有定义比较方法
比较add方法中使用的是Comparable接口的比较方法.

public int compareTo(Object o) //自然排序以年龄升序排序为主,相同则比较姓名
{
 /* Student stu =(Student)0;
   if(this.age>stu.age)
      return 1;
  if(this.age<stu<age)
           return -1;
   return 0;  */

 int temp=this.age=stu.age;
 return temp==0?this.name.compareTo(stu.name):temp;
}

******list ,Set 集合 名称阅读技巧***********
jdk1.2以后出现的集合框架中常用的子类对象,存在规律
   前缀名是数据结构名,后缀名是所属体系名。

ArrayList:数组结构。看到数组,就知道查询快,看到List,就知道可以重复。可以增删改查。
LinkedList: 链表结构,增删快。xxxFirst  xxxLast
HashSet:哈希表,就要想到元素必须覆盖hashCode equals,不保证有序。看到Set,就知道不可以重复
LinkedHashSet:链表+哈希表。可以实现有序,因为有链表。
TreeSet:二叉树,可以排序。就想要两种比较方式:一种是自然排序Comparable,一种是比较器Comparator



*************Foreach语句*******
 JDK1.5特性:
 增强for循环。作用:用于遍历collection集合or 数组
格式:
  for(元素类型变量:Collection容器or数组)

for(Objecct obj: coll)
{
  syso(obj);
 }
对于数组的遍历,如果不操作其角标,可以使用增强for,如果要操作角标,使用传统for

高级for中不能对数据进行操作,会报并发异常。

***传统for循环和增强for循环有什么区别呢?
 增强for必须有被遍历的目标,该目标只能是Collection or 数组


*****Enumeration接口*************
Enumeration:枚举。
  具备枚举取出方式的容器只有Vector。

Vector v =new Vector();
//获取枚举
for(Enumeration en =v.elements();en.hashMoreElements();){
 system.out.print(en.nextElement());
}

***************泛型*********************
 泛型:
     在jdk1.4版本之前,容器什么类型的对象都可以存储。但是在取出时。需要用到对象的特有内容时,需要做向下转型。
  但是对象的类型不一致,导致了向下转型发生了ClassCastException 异常。
 为了避免这个问题,只能主观上控制,往集合中存储的对象保持一致。

jdk1.5以后解决了该问题,在定义集合时,就直接明确集合中存储元素的具体类型。
     这样,编译器在编译时,就可以对集合中存储的对象类型进行检查。
一旦发现类型不匹配,就编译失败。这个技术就是泛型技术。

好处:
    1,将运行时期的问题转移到了编译时期,可以更好的让程序员发现问题并解决问题。
   2,避免了向下转型的麻烦

总结:泛型就是应用在编译时期的一项安全机制。


泛型的擦除:编译器通过泛型对元素类型进行检查,只要检查通过,就会生成class文件,
         但在class文件中,就将泛型标识去掉了。
      

静态方法是无法访问类上定义的泛型的。如果静态方法需要定义泛型,泛型只能定义在方法上。

泛型的表现:
       泛型技术在集合框架中应用的范围很大。
    什么时候需要填写泛型呢? 1,只要看到类,或者接口在描述时 右边定义<>,就需要泛型。
 其实是,容器在不明确操作元素的类型的情况下,对外提供了一个参数<>。
 使用容器时,只要将具体的类型实参传递给该参数即可。
说白了,泛型就是,传递类型参数。


****当要操作的类型不确定的时候,为了扩展,
 可以使用Object 类型来完成。
但是这种方式一些小弊端,会出现转型,向下转型容易在运行时期发生ClassCastException。

jdk1.5以后,新的解决方案。
类型不确定时,可以对外提供参数。有使用通过传递参数的形式完成类型的确定。

泛型类: 在类定义时就明确参数。有使用该类的调用者,来传递具体的类型。


通配符:在不明确具体类型的情况下,可以使用通配符来表示。  <?>

泛型的限定:
 ? extands E : 接收E类型或者E的子类型 // 上限
 ? super E : 接收E类型或者E的父类型   // 下限

什么时候会用到上限呢?
 **一般往集合存储元素时。如果集合定义了E类型通常情况下应该存储E类型的对象
对E的子类型的对象E类型也可以接受,所有这时可以将泛型从E改成 ? extends E .

什么时候用到下限呢?
  当从容器中取出元素操作时,可以用E类型接收,也可以用E的父类型接收。 ? super E


java中的几种泛型类——HashSet、HashMap、TreeSet、TreeMap,遍历map,排序,HashTable比较

HashSet HashSet泛型类在数据组织上类似于数学上的集合,可以进行“交”、“并”、“差”等运算。 HashSet泛型类创建的对象称为集合,如:     HashSet set =  H...
  • u013159040
  • u013159040
  • 2015年05月08日 09:17
  • 1301

JAVA 泛型,集合使用方法

工作内容: 1.集合学习 2.泛型学习 学习分享: 1.典型泛型集合List,HashMap 常用定义泛型集合: List list = new ArrayList(); 【存储类型必须是T类型,可以...
  • yingtian648
  • yingtian648
  • 2016年06月28日 09:55
  • 871

泛型(一)集合中使用泛型

Why 1.解决元素存储的安全性问题 2.解决获取数据元素时,需要类型强转的问题 泛型的使用 1.在集合中使用泛型 2.自定义泛型类、泛型接口、泛型方法 3.泛型与继承的关系 4.通配符...
  • u010892841
  • u010892841
  • 2016年05月23日 16:24
  • 932

Java基础(集合框架——Collection、List、Set、泛型)

为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多 个对象的操作,就对对象进行存储,集合就是存储对象常用的一 种方式。 数组和集合类同是容器,有何不同? 数组...
  • zzamk
  • zzamk
  • 2015年03月18日 19:03
  • 997

集合1--List集合及泛型

泛型、集合框架中的List集合
  • LGM_Hakka
  • LGM_Hakka
  • 2015年08月12日 08:09
  • 1649

Java中集合泛型带来了什么好处?

首先,了解一下Java关于泛型的概念。泛型,在C++中被称为模板,就是一种抽象的编程方式。当我们定义类和方法的时候,可以用一种通用的方式进行定义,而不必写出具体的类,这些未知的东西会在真正使用的时候在...
  • qq_33642117
  • qq_33642117
  • 2016年08月16日 21:50
  • 1752

Java 集合与泛型

Java集合框架与泛型 首先整体概览,下图是Java集合框架的类图 高清类图的PDF下载地址:http://download.csdn.net/detail/mydream201...
  • mydream20130314
  • mydream20130314
  • 2015年04月04日 22:46
  • 507

[我眼中的C#]集合和泛型

当我们有很多类型一样的数据的时候,前面我们一般使用数组来进行管理,但是这样有个缺点就是数组的大小是固定的。如果我们很多类型一样的数据,比如游戏得分,我们可以集合类来进行管理,比如列表List,我们可以...
  • Hui110110
  • Hui110110
  • 2017年03月16日 15:58
  • 202

Java集合框架上机练习题(泛型、JFrame)

编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。 Student.java public class Student i...
  • zzjjss001
  • zzjjss001
  • 2017年12月07日 20:41
  • 46

TreeSet集合的一个比较器排序去重案例

Student基础信息package TreeSetDemo;public class Student implements Comparable{ //学生姓名 private St...
  • euller
  • euller
  • 2017年04月15日 17:35
  • 496
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:集合(2)TreeSet , 泛型
举报原因:
原因补充:

(最多只允许输入30个字)