Java初学者学习经验r

上传人:平*** 文档编号:15565486 上传时间:2017-11-05 格式:DOC 页数:36 大小:276.48KB
返回 下载 相关 举报
Java初学者学习经验r_第1页
第1页 / 共36页
Java初学者学习经验r_第2页
第2页 / 共36页
Java初学者学习经验r_第3页
第3页 / 共36页
Java初学者学习经验r_第4页
第4页 / 共36页
Java初学者学习经验r_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《Java初学者学习经验r》由会员分享,可在线阅读,更多相关《Java初学者学习经验r(36页珍藏版)》请在金锄头文库上搜索。

1、达内 java 学习笔记 1集合(从本部分开始涉及 API)集合是指一个对象容纳了多个对象,这个集合对象主要用来管理维护一系列相似的对象。java.util.*定义了一系列的接口和类.集合框架接口的分类:(分 collection 接口 和 map 接口)Collection 接口 Map 接口List 接口 Set 接口 SortedMap 接口SortedSet 接口JAVA 中所有与集合有关的实现类都是这六个接口的实现类。Collection 接口:集合中每一个元素为一个对象,这个接口将这些对象组织在一起,形成一维结构。List 接口代表按照元素一定的相关顺序来组织(在这个序列中顺序是主

2、要的) ,List 接口中数据可重复。Set 接口是数学中集合的概念:其元素无序,且不可重复。 (正好与 List 对应)SortedSet 会按照数字将元素排列,为“可排序集合” 。Map 接口中每一个元素不是一个对象,而是一个键对象和值对象组成的键值对(Key-Value) 。Key-Value 是用一个不可重复的 key 集合对应可重复的 value 集合。 (典型的例子是字典:通过页码的key 值找字的 value 值) 。例子:key1value1;key2value2;key3value3.SortedMap:如果一个 Map 可以根据 key 值排序,则称其为 SortedMap

3、。 (如字典)!注意数组和集合的区别:数组中只能存简单数据类型。Collection 接口和 Map 接口只能存对象。以下介绍接口:List 接口:(介绍其下的两个实现类:ArrayList 和 LinkedList)ArrayList 和数组非常类似,其底层 也用数组组织数据, ArrayList 是动态可变数组。 底层:指存储格式。说明 ArrayList 对象都是存在于数组中。注:数组和集合都是从下标 0 开始。ArrayList 有一个 add(Object o)方法用于插入数组。ArrayList 的使用:(完成这个程序)先 import java.util.*;用 ArrayLis

4、t 在一个数组中添加数据,并遍历。ArrayList 中数组的顺序与添加顺序一致。只有 List 可用 get 和 size。而 Set 则不可用(因其无序) 。Collection 接口都是通过 Iterator()(即迭代器)来对 Set 和 List 遍历。诚信、创新、开放、合作达内 java 学习笔记 2通过语句:Iterator it=c.iterator(); 得到一个迭代器,将集合中所有元素顺序排列。然后可以通过 interator方法进行遍历,迭代器有一个游标(指针)指向首位置。Interator 有 hasNext(),用于判断元素右边是否还有数据,返回 True 说明有。然

5、后就可以调用 next 动作。Next()会将游标移到下一个元素,并把它所跨过的元素返回。 (这样就可以对元素进行遍历)练习:写一个程序,输入对象信息,比较基本信息。集合中每一个元素都有对象,如有字符串要经过强制类型转换。Collections 是工具类,所有方法均为有用方法,且方法为 static。有 Sort 方法用于给 List 排序。Collections.Sort()分为两部分,一部分为排序规则;一部分为排序算法。规则用来判断对象;算法是考虑如何排序。对于自定义对象,Sort 不知道规则,所以无法比较。这种情况下一定要定义排序规则。方式有两种: java.lang 下面有一个接口:C

6、omparable(可比较的)可以让自定义对象实现一个接口,这个接口只有一个方法 comparableTo(Object o)其规则是当前对象与 o 对象进行比较,其返回一个 int 值,系统根据此值来进行排序。如 当前对象o 对象,则返回值0;(可将返回值定义为 1)如 当前对象=o 对象,则返回值=0;如 当前对象o 对象,则返回值0;(可将返回值定义为 1)如 当前对象=o 对象,则返回值=0;如 当前对象o 对象,则返回值0。 (可将返回值定义为-1)看 TestArraylist 的 java 代码。我们通过返回值 1 和-1 位置的调换来实现升序和降序排列的转换。 java.uti

7、l 下有一个 Comparator(比较器)它拥有 compare(),用来比较两个方法。要生成比较器,则用 Sort 中 Sort(List,List(Compate))达内 java 学习笔记 22第二种方法更灵活,且在运行的时候不用编译。注意:要想实现 comparTo()就必须在主方法中写上 implement comparable.练习:生成一个 EMPLOYEE 类,然后将一系列对象放入到 ArrayList。用 Iterator 遍历,排序之后,再进行遍历。集合的最大缺点是无法进行类型判定(这个缺点在 JAVA1.5 中已经解决) ,这样就可能出现因为类型不同而出现类型错误。解决

8、的方法是添加类型的判断。LinkedList 接口(在代码的使用过程中和 ArrayList 没有什么区别)ArrayList 底层是 object 数组,所以 ArrayList 具有数组的查询速度快的优点以及增删速度慢的缺点。而在 LinkedList 的底层是一种双向循环链表。在此链表上每一个数据节点都由三部分组成:前指针(指向前面的节点的位置) ,数据,后指针(指向后面的节点的位置) 。最后一个节点的后指针指向第一个节点的前指针,形成一个循环。双向循环链表的查询效率低但是增删效率高。所以 LinkedList 具有查询效率低但增删效率高的特点。ArrayList 和 LinkedLis

9、t 在用法上没有区别,但是在功能上还是有区别的。LinkedList 经常用在增删操作较多而查询操作很少的情况下:队列和堆栈。队列:先进先出的数据结构。堆栈:后进先出的数据结构。注意:使用堆栈的时候一定不能提供方法让不是最后一个元素的元素获得出栈的机会。LinkedList 提供以下方法:(ArrayList 无此类方法)addFirst(); removeFirst();addLast();removeLast();在堆栈中,push 为入栈操作, pop 为出栈操作。Push 用 addFirst();pop 用 removeFirst(),实现后进先出。用 isEmpty()-其父类的方

10、法,来判断栈是否为空。在队列中,put 为入队列操作,get 为出队列操作。Put 用 addFirst(),get 用 removeLast()实现队列。List 接口的实现类(Vector ) (与 ArrayList 相似,区别是 Vector 是重量级的组件,使用使消耗的资源比较多。 )结论:在考虑并发的情况下用 Vector(保证线程的安全) 。在不考虑并发的情况下用 ArrayList(不能保证线程的安全) 。面试经验(知识点):java.util.stack(stack 即为堆栈)的父类为 Vector。可是 stack 的父类是最不应该为 Vector 的。因为Vector 的

11、底层是数组,且 Vector 有 get 方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全) 。对于堆栈和队列只能用 push 类和 get 类。Stack 类以后不要轻易使用。!实现堆栈一定要用 LinkedList。(在 JAVA1.5 中,collection 有 queue 来实现队列。 )达内 java 学习笔记 23Set-HashSet 实现类:遍历一个 Set 的方法只有一个:迭代器(interator) 。HashSet 中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同) ,而且元素不可重复。在 Object 中除了有 final(),to

12、String(),equals(),还有 hashCode()。HashSet 底层用的也是数组。当向数组中利用 add(Object o)添加对象的时候,系统先找对象的 hashCode:int hc=o.hashCode(); 返回的 hashCode 为整数值。Int I=hc%n;(n 为数组的长度) ,取得余数后,利用余数向数组中相应的位置添加数据,以 n 为 6 为例,如果 I=0 则放在数组 a0位置,如果 I=1,则放在数组 a1位置。如果 equals()返回的值为 true,则说明数据重复。如果 equals()返回的值为 false,则再找其他的位置进行比较。这样的机制就

13、导致两个相同的对象有可能重复地添加到数组中,因为他们的 hashCode 不同。如果我们能够使两个相同的对象具有相同 hashcode,才能在 equals()返回为真。在实例中,定义 student 对象时覆盖它的 hashcode。因为 String 类是自动覆盖的,所以当比较 String 类的对象的时候,就不会出现有两个相同的 string 对象的情况。现在,在大部分的 JDK 中,都已经要求覆盖了 hashCode。结论:如将自定义类用 hashSet 来添加对象,一定要覆盖 hashcode()和 equals(),覆盖的原则是保证当两个对象 hashcode 返回相同的整数,而且

14、 equals()返回值为 True。如果偷懒,没有设定 equals(),就会造成返回 hashCode 虽然结果相同,但在程序执行的过程中会多次地调用 equals(),从而影响程序执行的效率。我们要保证相同对象的返回的 hashCode 一定相同,也要保证不相同的对象的 hashCode 尽可能不同(因为数组的边界性,hashCode 还是可能相同的) 。例子:public int hashCode()return name.hashcode()+age;这个例子保证了相同姓名和年龄的记录返回的 hashCode 是相同的。使用 hashSet 的优点:hashSet 的底层是数组,其查

15、询效率非常高。而且在增加和删除的时候由于运用的 hashCode 的比较开确定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因为 hashSet 查询和删除和增加元素的效率都非常高。但是 hashSet 增删的高效率是通过花费大量的空间换来的:因为空间越大,取余数相同的情况就越小。HashSet 这种算法会建立许多无用的空间。使用 hashSet 接口时要注意,如果发生冲突,就会出现遍历整个数组的情况,这样就使得效率非常的低。练习:new 一个 hashset,插入 employee 对象,不允许重复,并且遍历出来。添加知识点:集合对象存放的是一系列对象的引用。例:Student S

16、Al.add(s);s.setName(“lucy”);Student s2=(Student)(al.get(o1);可知 s2 也是 s。达内 java 学习笔记 2412.05SortedSet 可自动为元素排序。SortedSet 的实现类是 TreeSet:它的作用是字为添加到 TreeSet 中的元素排序。练习:自定义类用 TreeSet 排序。与 HashSet 不同, TreeSet 并不需要实现 HashCode()和 equals()。只要实现 compareable 和 compareTo()接可以实现过滤功能。(注:HashSet 不调用 CompareTo()) 。如果要查询集合中的数据,使用 Set 必须全部遍历,所以查询的效率低。使用 Map,可通过查找 key得到 value,查询效率高。集合中常用的是:ArrayList ,HashSet,HashMa

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号