`
java_hanyu
  • 浏览: 71484 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

core java学习笔记(八)

阅读更多

数组:固定长度

集合框架
 
集合(集合类的对象)是用来管理其他若干对象的。它类似于C++标准模板库中的容器,不过在JAVA的集合类的对象中可以用来存放多种类型的对象。

接口和类共同构成了一个集合框架,集合的概念,一个对象可以装载多个对象,这个对象就是集合对象。


1,接口
       Collection
                   ↑
             |ˉˉˉˉˉˉ|    
            Set          List        Map
             ↑                      ↑
             |                        |
          SortedSet              SortedMap


集合中用到的类,接口在java.util包中,在使用时注意将其引入import。

Collection 接口: 用来管理多个对象,集合中的每个元素都是对象。

 1)List接口: 一个List的实现类的对象在管理多个对象时会按顺序组织对象(即按照将对象放入的顺序存储)

                List实现类的对象是有顺序的,List实现类对象中的内容是可重复的。(注意,顺序和排序的区别)

       List接口的特点:有序存放,允许重复,可放不同类型对象

 2)Set接口: 一个Set的实现类表示一个数学概念上的集合,Set的实现类的对象中的元素是无顺序的,也就是不会按照输入顺序来存放,
       Set的实现类对象中的元素是不重复的。

      Set接口的特点:无序存放,不允许重复,也可以存放不同类型对象

 3)SortedSet接口:它是Set的子接口,他的实现类会对集合中的元素进行排序。但是要指定排序规则,他会按排序规则进行排序。


Map,Map中没有对象,而是键值对,由Key,value组成的键值对
     Key是没有顺序,不可重复的。
     value是可以相同的,一个Key和一个value一一对应。

Map 接口(以下介绍其子接口)

SortedMap,这个接口的实现类同样可以实现,不过是对键值对中的Key进行排序,这个接口的实现类也是要指定排序规则的


2、List接口的实现类

  Collection
                   ↑
             |ˉˉˉˉˉˉ|    
          HashSet     LinkedList       Hashtable
           (Set)    Vector, ArrayList   Hashmap
                        (List)           (Map)
             ↑                           ↑
             |                             |
           TreeSet                     TreeMap
         (SortedSet)                 (SortedMap)


Collection接口的方法:
 add(Object o)   
 addAll(Collection c)
 contains(Object o)
 containsAll(Collection c)
 remove(Object o)
 removeAll(Collection c)
 clear()
 equals(Object o)
 isEmpty()
 iterator()
 size()
 toArray()
 toArray(Object[] o)


 Iterator it=hs.iterator();
 for(Object obj;it.hasNext();){
   obj=it.next();
     ...
   System.out.println(obj);
 }

 
 1> ArrayList是接近于功能的集合类,ArryList的实质就是一个会自动增长的数组,ArrayList是用封装的数组来实现的List接口的,底层用数组实现的。

  Collection的实现类对象的遍历方式是用迭代来实现的。
  在使用迭代器时先要获得一个迭代器的对象,Iterator(迭代器接口)这是一个接口,迭代器是在集合类中实现的,
  也就是说,他是一个内部类(匿名内部类)实现的。
  Iterator接口中定义的常用方法方法hasNext(),next()。
  hasNext(),这个方法会使用一个游标,并通过判断游标指向的位置是否存放有对象。
  next()方法也是Iterator接口中定义好的方法,这个方法会使游标指向下一个元素的位置,游标会跳过第一个元素,并返回其中的内容。

  Collections 这是一个工具类,也是java.util包中的,这个类中的sort(list接口的实现类的对象)方法,其参数是一个集合类的对象,
  这个方法使用来对集合类的对象进行排序的。以后,我将以集合这个名字来称呼集合类的对象。对于字符串对象内容的集合来说会按字典顺序排序(升序),
  对于数字内容的集合排序也会按照升序排序。

  排序可分为两部分内容,一个是排序的规则,也就是按照什么来进行排序,并且排成什么样的顺序。
  第二个就是排序的算法,他决定了排序的效率。

  在对自定义的集合内容类型排序时,需要先定义那个类型的排序规则。
  Comparable接口,这个接口中只定义了一个compareTo(Object o),方法的返回至类型是整型,如果当前对象大于参数对象就返回正数,当前对象等于参数对象  是就返回0,当前对象小于参数对象时就返回负值,这样写就是升序排列,反之则是进行降序排列,在实现这个接口中的方法时,返回值定义方式,只有这两种

  根据指定类型的排序规则实现了Comparable接口,那么就可以对存有这个类型的集合进行整体排序。Comparable接口,也叫做可比较接口。
  这个接口在java.lang包下。只要实现了这个接口,就是可排序的。

  接下来介绍另外一种对自定义类型对象的集合整体排序的方法,也就是实现比较器接口(Comparator),
  这个接口中定义了一个compare(Object o1,Object o2)方法来比较两个对象,这个方法的返回值定义和上面介绍的那个方法是一样。

  注意:在API,帮助文档中以上两个方法的参数类型是T,这代表的模板类型,也就是集合中存放的内容的类型,在JDK1.4中其参数就是Object类型,
  模板类型的详细内容会在最后的JDK5.0新特性中讲到。

  Comparator接口可以在匿名内部类中实现,Collections 中的sort(集合了的对象,比较器)方法,可以对自定义类型内容的集合进行整体排序。

 2> LinkedList,它是List接口的实现类,其底层是用双向循环链表来实现的。

 注意:ArrayList的查询效率比较高,增删动作的效率比较差,适用于查询比较频繁,增删动作较少的元素管理的集合。
             LinkedList的查询效率低,但是增删效率很高。适用于增删动作的比较频繁,查询次数较少的元素管理集合。

      ArrayList,LinkedList都是线程不安全的。

 3> Vector: 底层用数组实现List接口的另一个类
     特点:重量级,占据更多的系统开销 线程安全
          (与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比较多。)
  结论:在考虑并发的情况下用Vector(保证线程的安全)。
  在不考虑并发的情况下用ArrayList(不能保证线程的安全)。

  面试经验(知识点):
  java.util.stack(stack即为堆栈)的父类为Vector。可是stack的父类是最不应该为Vector的。因为Vector的底层是数组,
  且Vector有get方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全)。
  对于堆栈和队列只能用push类和get类。
  Stack类以后不要轻易使用。
  实现栈一定要用LinkedList。


 实现堆栈 1,数组(ArrayList,增删效率比较低,不适合)
   2,LinkedList(实现堆栈的好方法)
   3,java.util.Stack类,Stack是Vector的子类,Vector类是一个线程安全的(是一个重量级的类),并继承了Vector的方法,
  Verctor类和ArrayList的功能近乎相同。(不推荐使用Stack类来实现堆栈)。

 

3、Set接口的实现类

 3.1 HashSet

 Set的实现类的集合对象中不能够有重复元素,HashSet也一样他是使用了一种标识来确定元素的不重复,HashSet用一种算法来保证HashSet中的元素是不重复的,   HashSet采用哈希算法,底层用数组存储数据。默认初始化容量16,加载因子0.75

 Object类中的hashCode()的方法是所有子类都会继承这个方法,这个方法会用Hash算法算出一个Hash(哈希)码值返回,HashSet会用Hash码值去和数组长度取模,
 模(这个模就是对象要存放在数组中的位置)相同时才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才会添加进去。

 Hash算法是一种散列算法。

  Set hs=new HashSet();
 
  hs.add(o);
     |
         o.hashCode();
     |
  o%当前总容量  (0--15)
     |            
     |           不发生冲突
        是否发生冲突-----------------直接存放
     |
     | 发生冲突
     |              假(不相等)
        o1.equals(o2)-------------------找一个空位添加
     |
     |  是(相等)
         不添加
 
 覆盖hashCode()方法的原则:
  1、一定要让那些我们认为相同的对象返回相同的hashCode值
  2、尽量让那些我们认为不同的对象返回不同的hashCode值
         3、尽量的让hashCode值散列开(两值用异或运算可使结果的范围更广)


 注意:所以要存入HashSet的集合对象中的自定义类必须覆盖hashCode(),equals()两个方法,才能保证集合中元素不重复。在覆盖equals()和hashCode()方法时,
 要使相同对象的hashCode()方法返回相同值,覆盖equals()方法再判断其内容。为了保证效率,所以在覆盖hashCode()方法时,
 也要尽量使不同对象尽量返回不同的Hash码值。

 如果数组中的元素和要加入的对象的hashCode()返回了相同的Hash值(相同对象),才会用equals()方法来判断两个对象的内容是否相同。

 3.2  SortedSet接口是Set的子接口。TreeSet是SortedSet接口的实现类

 TreeSet底层用二叉树实现。它可以对集合中的元素进行排序。
 要存放在TreeSet中自定义类的对象,这个类要么是已经实现了Comparable接口,要么是能给出Comparator比较器,
 TreeSet可以自动过滤掉重复元素所以不用重载hashCode()方法,TreeSet会根据比较规则判断元素内容是否相同,TreeSet会在元素存入时就进行了排序。
 (在TreeSet给出排序规则时,一定要注意对象内容相等的条件,一定要注意在主观的认为两个对象内容相同时,才可以使用比较少的条件来进行判断)

 在要排序时才使用TreeSet类(存储效率比较低),HashSet的,,存储效率比较高,在需要为HashSet的对象排序时,就可以把HashSet中的元素放入TreeSet。

 

 Iterator:迭代器      java.util    
 Iterable:可迭代的    java.lang
 
 Comparator:比较器    java.util
 Comparable:可比较的  java.lang

分享到:
评论

相关推荐

    CoreJava学习笔记

    ### CoreJava学习笔记 #### 一、JAVA特点与运行原理 **JAVA特点:** 1. **简单性**:Java的设计者们将C++语言中许多不易理解和容易混淆的部分去除,使得Java更容易理解与掌握。 2. **面向对象**:Java几乎一切都...

    达内core_java学习笔记

    Java是世界上最流行的编程语言之一,...以上就是“达内Core Java学习笔记”中涉及的主要知识点。通过深入学习和实践,初学者可以逐步建立起坚实的Java编程基础,并为进一步学习Java的高级特性和框架打下坚实的基础。

    corejava学习笔记

    Java是一种广泛使用的面向对象的编程语言,其基础知识构成了"Core Java"的学习内容。在学习Java时,遵循"多花时间、多动手、多问题"的原则至关重要,因为理论理解与实践操作相结合能更好地掌握知识。 1. **Java语法...

    Java学习笔记及心得

    ### Java学习笔记及心得知识点详细解析 #### 标题:Java学习笔记及心得 #### 描述:Core Java 学习笔记及心得 pdf格式可打开。涵盖了java的基础入门知识,非常适合自学的及想深入学习理解的同学。 #### 标签:...

    Core Java 学习笔记

    《Core Java》学习笔记。 我把自己的笔记都以注释的形式写在代码里面了,这样方便理解。 尽管有些部分被标记为“已完成”,但实际上以后说不定我还会折返回来进行修改或者添加一些注释。 当然如果你有什么不理解...

    corejava学习笔记.doc

    Java是一种由Sun Microsystems在1995年推出的高级编程语言,现由Oracle公司维护。...以上就是Core Java学习笔记的主要内容概述,涵盖了从基础语法到高级特性的广泛知识,为深入理解和应用Java打下了坚实的基础。

    core java 学习笔记

    这篇学习笔记主要讨论了Java集合框架,包括Collection、List、Set和Map四大接口以及它们的相关方法。 首先,Collection是所有集合类的顶级接口,它定义了一些基本的操作,如添加元素(add)、获取元素数量(size)、...

    达内java学习笔记全套

    【Java学习笔记全套】是针对Java编程语言的一套全面学习资料,涵盖了Unix操作系统基础、SQL数据库操作、核心Java编程、Hibernate持久化框架、以及Spring框架等多个关键知识点。这些笔记旨在帮助初学者系统地掌握Java...

    CoreJava学习笔记.doc

    《CoreJava学习笔记》 Java,作为一种广泛使用的高级编程语言,以其独特的特性和优势深受开发者喜爱。本学习笔记旨在深入浅出地介绍Java的核心概念,帮助初学者快速掌握这一强大的工具。 1. Java特点 Java语法...

    学习笔记 java\CoreJava笔记\CoreJava_day12

    在Java编程语言中,SortedSet接口是Set接口的一个子接口,它添加了对集合元素排序的能力。SortedSet接口要求其实现类必须维护元素的排序顺序,这种顺序可以是元素的自然顺序(即元素自身可比较),也可以是通过提供...

    达内COREJAVA学习笔记.doc

    ### 达内COREJAVA学习笔记知识点详述 #### 一、Java版本与平台概述 - **J2SE**: Java Standard Edition,即Java标准版,针对桌面应用开发。 - **JAVA SE**: 指的是Java SE 5.0,发布于2004年,增加了泛型、枚举等...

    java学习笔记 达内笔记(经典)

    (二)面向对象技术总结.pdf (三)corejava高级特性总结 (四)接口学习总结 (五)异常和内部类 (六)集合框架学习总结 (七)GUI和AWT事件模型 (八)多线程学习总结 (九)输入输出流学习总结 (十)网络编程学习总结

    学习笔记 java\CoreJava笔记\CoreJava_day11

    CoreJava_day11的学习笔记主要涵盖了集合框架,特别是关于List、Set和Map接口,以及ArrayList、Vector和LinkedList等具体实现类的知识点。 首先,集合框架是用来存放对象的对象,它提供了一组接口和类,使得我们...

    学习笔记 java\CoreJava笔记\CoreJava_day06

    在Java编程语言中,继承是面向对象编程的一个关键特性,它允许子类继承父类的属性和方法,从而实现代码的复用和扩展。在Java中,类的继承是单继承的,即一个子类只能有一个直接父类,但可以通过接口实现多继承的效果...

    java学习笔记(corejava)部分.rar

    这份"java学习笔记(corejava)部分.rar"文件很显然是针对Java初学者或者希望巩固基础知识的开发者准备的。下面我们将深入探讨Java Core的一些关键知识点。 1. **Java基础**:Java是一种面向对象的编程语言,其设计...

    java学习笔记 自己的笔记都以注释的形式写在代码里面

    java学习笔记 简介: java 学习笔记。 我把自己的笔记都以注释的形式写在代码里面了,这样方便理解。 尽管有些部分被标记为“已完成”,但实际上以后说不定我还会折返回来进行修改或者添加一些注释。 当然如果你...

    CoreJava卷一学习笔记

    自己学习corejava核心技术卷一时的学习笔记和心得,提出的一些问题

Global site tag (gtag.js) - Google Analytics