Java集合框架中的java泛型机制的优点有有什么优点

(window.slotbydup=window.slotbydup || []).push({
id: '2014386',
container: s,
size: '234,60',
display: 'inlay-fix'
&&|&&0次下载&&|&&总85页&&|
您的计算机尚未安装Flash,点击安装&
阅读已结束,如需下载到电脑,请使用积分()
下载:30积分
相关分类推荐
0人评价748页
0人评价27页
0人评价48页
0人评价7页
0人评价11页
所需积分:(友情提示:大部分文档均可免费预览!下载之前请务必先预览阅读,以免误下载造成积分浪费!)
(多个标签用逗号分隔)
文不对题,内容与标题介绍不符
广告内容或内容过于简单
文档乱码或无法正常显示
文档内容侵权
已存在相同文档
不属于经济管理类文档
源文档损坏或加密
若此文档涉嫌侵害了您的权利,请参照说明。
我要评价:
下载:30积分用户名:zh_lianxin
文章数:24
访问量:1156
注册日期:
阅读量:1297
阅读量:3317
阅读量:447889
阅读量:1132954
51CTO推荐博文
&&------、期待与您交流! ------- &&&集合框架 Collection &java.util(interface)集合 只能存储引用类型,存储对象,不存储基本类型,长度可变数组 存储基本类型,存储对象,长度固定&&&& 集合中存储的都是引用类型的元素,那么引用类型变量实际上存储的是对象的“地址”,所以实际上集合只存储了元素对象在堆中的地址,而并不是将对象本身存入了集合中。&Collection 接口是层次结构中的根接口,定义了集合相关的操作方法。其有两个子接口:List(可重复集)和Set(不可重复集)元素是否重复,取决于元素的equals() 比较的结果&成员方法:boolean add(E e) // 添加元素boolean remove(E e) // 移除第一次出现的指定元素void clear() // 清空集合boolean contains(Object o) // 判断是否包含指定对象boolean isEmpty() // 判断集合是否为空int size() // 返回集合的大小(容量),即集合中存储元素的个数boolean addAll(Collection c) // 添加指定集合中的所有元素boolean removeAll(Collection c) // 移除指定集合中包含的所有元素boolean containsAll(Collection c) // 判断是否包含指定集合的所有元素boolean retainAll(Collection c) // 保留与指定集合中相同的元素(获取交集)Object[] toArray() // 集合 --& 数组,可以实现集合的遍历Iterator&E& iterator() // 获取迭代器,集合专用的遍历方式* &迭代器迭代结合,泛型跟随集合Iterator 迭代器&&& 集合专用遍历方式,做集合中元素的获取&&& 集合顶层接口Collection中,定义了一个抽象方法Iterator&E& iterator(),返回值是接口类型,返回的是该接口的实现类对象。&&& 迭代器接口的实现类是集合容器的内部类,Collection下面所有的实现类,都会重写该方法。比如 ArrayList 实现 List 接口,而 List 继承自Collection。&&& 迭代器类的成员方法:&&& boolean hasNext() // 判断集合中是否还有下一个元素&&& &E& next() // 获取迭代的下一个元素&&& void remove() // 移除本次迭代后迭代器返回的最后一个元素&&& 迭代器的删除方法是在原集合中删除元素ConcurrentModificationException在使用迭代器遍历集合时,不能通过集合的remove() 方法删除集合元素,否则会抛出并发更改异常,可以通过迭代器自身提供的remove() 方法删除通过next() 迭代出的元素。在调用remove() 方法前必须通过迭代器的next() 方法迭代过元素,那么删除的就是这个元素。并且不能再次调用remove() 方法,除非再次调用next() 后方可再次调用。&使用迭代器接口的两种方式,一般使用 while 循环Iterator iterator = collection.iterator();// 调用迭代器接口方法判断集合中有没有下一个元素while (iterator.hasNext()) {&&& // 调用迭代器接口方法获取出集合中的元素&&& Object object = iterator.next();&&& System.out.println(object);}for (Iteratoriterator = collection.iterator(); iterator.hasNext();){&&& Object object = iterator.next();&&& System.out.println(object);}&增强型for循环since JDK1.5,只用于遍历集合或数组,也称新循环格式:&&& for(元素类型 变量名 : 集合或数组) {&&&&&&& 循环体&&& }好处:减少代码量,方便做遍历;弊端:不能改动数组或集合中的元素增强for循环并非新的语法,而是在编译过程中,编译器会将新循环转换为迭代器模式。所以新循环本质上是迭代器。&遍历集合的 3 种方式:迭代器,增强 for 循环,普通for 循环(size() + get())&List 接口 继承 Collection 接口特点:有序集合,存取有序,有索引,允许重复&成员方法void add(int index, E element) // 向指定索引处添加元素E remove(int index) // 移除指定索引处的元素并返回该元素E get(int index) // 获取指定索引上的元素E set(int index, E element) // 替换指定索引上的元素并返回之前的元素ListIterator&E& listIterator() // 获取迭代器int lastIndexOf(Object o) // 返回指定元素出现的最后一个位置的索引List&E& subList(int fromIndex, inttoIndex) // 获取子List--------------------------------------------------------------------importjava.util.ArrayLimportjava.util.L&/*&* 证明 subList 获取的 List 与原 List 占用相同的存储空间,对子 List 的操作会影响原 List&*/public classSubListDemo {&&& public static void main(String[] args) {&&&&&& List&Integer& list = newArrayList&&();&&&&&& for (int i = 0; i & 10; i++) {&&&&&&&&&& list.add(i);&&&&&& }&&&&&& System.out.println("list " +list);&&&&&& // list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]&&&&&&& List&Integer& subList =list.subList(3, 8);&&&&&& System.out.println("subList " +subList);&&&&&& // sublist [3, 4, 5, 6, 7]&&&&&&& // subList 获得的 List 和原 List 占有相同的数据空间&&&&&& for (int i = 0; i & subList.size();i++) {&&&&&&&&&& subList.set(i, subList.get(i) * 10);&&&&&& }&&&&&& System.out.println("changedsubList" + subList);&&&&&& // changedsublist [30, 40, 50, 60, 70]&&&&&& System.out.println("unchangedlist" + list);&&&&&& // unchangedlist [0, 1, 2, 30, 40, 50,60, 70, 8, 9]&&&&&&& list.subList(3, 8).clear(); // 可以用于删除连续元素&&&&&& System.out.println(list);&&&&&& // [0, 1, 2, 8, 9]&&& }}&ListIterator 列表迭代器&&& 允许按任一方向遍历列表,迭代期间可以修改列表&&& void add(E e)&&& booleanhasNext() // 正向遍历boolean hasPrevious() // 逆向遍历E next() // 返回列表中的下一个元素int nextIndex() // 返回返回下一个索引E previous() // 返回列表中的前一个元素int previousIndex() // 返回前一个索引void remove() // 移除本次迭代后迭代器返回的最后一个元素void set(E e) // 替换此次迭代后迭代器返回的最后一个元素&对 List 集合进行正向遍历和逆向遍历List list= newArrayList&&();&&&&&& list.add("www");&&&&&& list.add("itcast.");&&& list.add("cn");&&&&&& // 调用集合方法,获取ListIterator接口的实现类对象&&&&&& ListIteratoriterator=list.listIterator();&&&&&& &&&&&& while (iterator.hasNext()) {&&&&&&&&&& Objectobject= (Object) iterator.next();&&&&&&&&&& if ("www".equals(object)) {&&&&&&&&&&&&& // 调用迭代器的方法&&&&&&&&&&&&& // 添加元素到迭代到元素的下一个位置//&&&&&&&&&&& iterator.add("0807Java");// 添加和修改不能在同一次迭代中&&&&&&&&&&&&& // 修改迭代到的元素&&&&&&&&&&&&& iterator.set("www.");&&&&&&&&&& }&&&&&& }&&&&&& //迭代器指针到了最后,不能再次获取,出现没有元素被取出异常&&&&&& &&&&&& // 逆向遍历逆向遍历之前要先做一次正向遍历&&&&&& while (iterator.hasPrevious()) {&&&&&&&&&& Objectobject= (Object) iterator.previous();&&&&&&&&&& System.out.print(object + " "); // cn itcast. www.&&&&&& }&泛型机制 Generic since JDK5泛型在集合中的应用泛型的本质是参数化类型。在类、接口和方法的定义过程中,所操作的数据类型被传入的参数指定,强制集合必须存储指定的数据类型,保证程序的安全性。Java泛型机制广泛的应用在集合框架中,所有的集合类型都带有泛型参数,这样在创建集合时可以指定放入集合中元素的类型。Java编译器可以据此进行类型检查,这样可以减少代码在运行时出现错误的可能性。集合类&存储的数据类型& 变量名 = new 集合类&存储的数据类型&();好处:减少代码量,避免类型强制转换,安全问题由运行时期提前到了编译时期。Java中的泛型是伪泛型,只在编译时期有效,编译后的class文件中没有泛型,编译手段。ArrayList类的定义中,&E& 中的 E 为泛型参数(理解为变量名,相当于定义了一个变量,负责接收数据类型),在创建对象时可以将类型作为参数传递,此时,类定义所有的 E 将被替换成传入的参数。*注意:集合存储八种基本类型,泛型必须写包装类;迭代器迭代结合,泛型跟随集合&泛型类、泛型方法&package cn.&/*&* 自定义泛型类&* &自己写的类上,加上泛型&变量&&* &* 定义成员变量,也是泛型&* &* E 变量,等待建立此类对象的时候,由调用者指定他的数据类型&*/class GenericClass&E& {&&& private E e;&&&& /*&&& &* 泛型方法&&& &* &方法参数上,使用了一个和类上一样的泛型&&& &*& 创建类的对象的时候,直接指定数据类型&&& &*& &&& &*& 方法上泛型需要单独的定义,定义在方法的声明上&&& &*& 创建类的对象同时,不能指定方法上泛型,调用者调用方法时直接指定&&& &*& &&& &* 静态方法参数上的泛型,不能和类上的泛型一样&&& &* 原因:静态不能直接调用非静态&&& &*/&&& publicvoid show(E e) {&&&&&& System.out.println(e);&&& }&&&& public &W& void function(W w){&&&&&& System.out.println(w);&&& }&&& &&& publicstatic &C& void method(C c){&&&&&& System.out.println(c);&&& }&&& &&& public E getE() {&&&&&& returne;&&& }&&&& publicvoid setE(E e) {&&&&&& this.e = e;&&& }&}&publicclassGenericDefine {&&&& publicstaticvoid main(String[] args) {&&&&&& GenericClass&Integer&genericClass= newGenericClass&Integer&();&&&&&& genericClass.setE(123);&&&&&& Integerinteger= genericClass.getE();&&&&&& System.out.println(integer);&&&&&&& GenericClass&String&genericClass2= newGenericClass&String&();&&&&&& genericClass2.setE("abc");&&&&&& Stringstring= genericClass2.getE();&&&&&& System.out.println(string + 1);&&&&&&& System.out.println("--------------");&&&&&& genericClass2.show("传智播客");&&& }&}&泛型接口&package cn.&/*&* 泛型接口&* &接口上定义泛型,接口中方法全抽象,实现类&* &在使用上两种使用方式:&* &&& 实现类实现接口,不理会泛型&* &&& 实现类实现接口,同时也实现接口上的泛型&*/interface Inter&T& {&&& publicabstractvoid show(T t);}&// 定义接口的实现类,实现接口,不理会接口上的泛型// 泛型的指定,实现类没有做,让调用者来指定数据类型class InterImpl&T& implements Inter&T& {&&& @Override&&& publicvoid show(T t) {&&&&&& System.out.println(t);&&& }}&// 定义接口的实现类,实现接口的同时,也实现泛型 -- 不灵活class InterImpl2 implements Inter&String&{&&& @Override&&& publicvoid show(String t) {&&&&&& System.out.println(t);&&& }}&publicclassGenericInterfaceDemo {&&&& publicstaticvoid main(String[] args) {&&&&&& Inter&Integer&in = newInterImpl&Integer&();&&&&&& in.show(123);&&&&&& &&&&&& Inter&String&in2= newInterImpl&String&();&&&&&& in2.show("itcast");&&& }&}&泛型的限定:泛型通配符 &?& ? extends E (向下限定,E及其子类)&& &? super E (向上限定,E及其父类)&线性表&&& List接口是Collection的子接口,用于定义线性表数据结构,可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少。&&& List接口的两个常用实现类为 ArrayList 和 LinkedList,分别用动态数组和链表的方式实现了List接口。&&&& List 三个子类的特点共同特点:有序,索引,重复。&&& ArrayList 和 LinkedList在性能上有一定的差别。&&& ArrayList 更适合于随机访问,而LinkedList 更适合于插入和删除。&&& ArrayList 底层数据结构是可变数组,元素查询速度快,增删慢&&&&&& 线程不安全,不同步,运行速度快&&&&&& 默认容量 10,增长率50%&&& LinkedList 底层数据结构是双向链表,元素查询速度慢,增删快&&&&&& 线程不安全,不同步,运行速度快&&&&&& 存储和迭代器代码,和 ArrayList 完全一样&&& Vector 底层数据结构是可变数组,元素查询速度快,增删慢&&&&&& 线程安全,同步,运行速度慢&&&&&& 默认容量 10,增长率 100% &Vector 类特有方法:&&& void addElement(E obj) // 将指定的组件添加到向量的末尾,容量+1&&& E elementAt(int index) // 返回指定索引处的组件&&& Enumeration elements() // 返回此向量的组件的枚举LinkedList 类特有方法:&&& void addFirst(E e)&&&&&& voidaddLast(E e);&&& E getFirst()&&&&&&&& EgetLast()&&& E removeFirst()&&&&& EremoveLast()&去除集合中存储的重复元素&package cn.&importjava.util.ArrayLimportjava.util.I&/*&* 去除集合中字符串的重复值 -- 去除数组中重复元素&* 去除集合中自定义对象的重复值(需要重写自定义对象的equals()方法)&* ArrayList集合实现,List允许重复&* (String 类重写了equals() 方法,建立了自己的比较方式)&* 如果原集合中元素没有出现在新集合中,将该元素存储到新集合中&* 遍历完毕,新集合保存的就是去掉重复后的元素&* 将原集合的引用指向新集合&*/public classArrayListTest {&&&& public static void main(String[] args) {&&&&&& ArrayList&String& list = new ArrayList&String&();&&&&&& list.add("www");&&&&&& list.add(".itcast");&&&&&& list.add(".cn");&&&&&& list.add("www");&&&&&& list.add(".itheima");&&&&&& list.add(".com");&&&&&&& list = removeSame(list);&&&&&& System.out.println(list); // [www, .itcast, .cn, .itheima,.com]&&&& }&&&& // 返回的是去重复之后的新集合&&& public static ArrayList&String&removeSame(ArrayList&String& arrayList) {&&&&&& // 创建新集合,保存去重复之后的元素&&&&&& ArrayList&String& newList = newArrayList&String&();&&&&&& &&&&&& // 迭代原集合&&&&&& Iterator&String& iterator = arrayList.iterator();&&&&&& while (iterator.hasNext()) {&&&&&&&&&& // 接收迭代元素的结果&&&&&&&&&& String string = iterator.next();&&&&&&&&&& // 判断新集合中是否包含该元素,没有则添加进去&&&&&&&&&& if (!newList.contains(string)) {&&&&&&&&&&&&& newList.add(string);&&&&&&&&&& }&&&&&& }&&&&&& return newL&&& }}&LinkedList 模拟栈数据结构的集合&package cn.&import java.util.LinkedL&/*&* LinkedList集合,模拟数据结构栈&* &* 将LinkedList集合中的功能封装起来,调用者不直接面对集合,只能从外部调用&* 表现为先添加的元素后被取出,存储和取出的顺序是相反的&*/publicclassLinkedListTest {&&&& publicstaticvoid main(String[] args) {&&&&&& LinkedListToollist= newLinkedListTool();&&&&&& list.add(0);&&&&&& list.add(1);&&&&&& list.add(2);&&&&&& list.add(3);&&&&&&& // 当列表不为空时,删除元素并返回&&&&&& while (!list.isEmpty()) {&&&&&&&&&& System.out.println(list.remove());&&&&&& }&&& }&}&// 自定义功能,封装LinkedList类功能class LinkedListTool {&&& // 定义成员变量&&& privateLinkedList&Object& list;&&&& // 构造方法用于新建对象&&& public LinkedListTool() {&&&&&& list = newLinkedList&Object&();&&& }&&&& // 添加元素到列表结尾&&& publicvoid add(Object object) {&&&&&& list.add(object);&&& }&&&& // 判断列表是否为空&&& publicboolean isEmpty() {&&&&&& returnlist.isEmpty();&&& }&&&& // 从列表结尾删除元素并返回&&& public Object remove() {&&&&&& returnlist.removeLast();&&& }&}&List 集合 & == & 数组List 转换为数组(集合转成数组,带有泛型)&&& Object[] toArray()&&& &T&T[] toArray(T[] a)&&&&&&& List&String&strings = new ArrayList&&();&&&&&& strings.add("www");&&&&&& strings.add(".itcast");&&&&&& strings.add("cn");&&&&&& String[] str = strings.toArray(newString[strings.size()]);&&&&&& // 传入一个指定类型的数组,该数组的元素类型应与集合的元素类型一致。&&&&&& // 返回值则是转换后的数组,该数组会保存集合中所有的元素&&&&&& for (inti = 0; i& str.length; i++){&&&&&&&&&& System.out.print(str[i] + " ");&&&&&& }&数组转换为 List&&& Arrays 类中提供了一个静态方法 asList,使用该方法我们可以将一个数组转换为对应的 List 集合。其方法定义为: static &T& List&T& asList&T… a&&&& 注意:返回的 List的集合元素类型由传入的数组的元素类型决定;返回的集合不能对其增删元素,否则会抛出异常,并且对集合的元素进行修改会影响数组对应的元素。&&&& &&& String[] strArr = { "www", ".itcast", ".cn" };&&& &&& List&String&list =Arrays.asList(strArr); // fixed-size list&&&&&& System.out.println(list); // [www, .itcast, .cn]&&&&&& // 当前集合 list 的实际类型为 java.util.Array$ArrayList&&&&&& //而不是 List 接口的实现类 java.util.ArrayList,所以不支持对其添加或删除元素&&&&&&& // list.add("IT"); // 会抛出 UnsupportedOperationException&&&&&& &&&&&& System.out.println(list.getClass().getName());&&&&&& &&&&&& list.set(0, "3w"); // 可以修改元素&&&&&& // 对集合元素的修改会影响原数组&&&&&& System.out.print("String[] ");&&&&&& for (String string : strArr) {&&&&&&&&&& System.out.print(string + " ");&&&&&& }&&&&&& System.out.println();&&&&&& &&&&&& // 如果想要添加元素,可以用如下方式:&&&&&& List&String&list2= newArrayList&&();&&&&&& list2.addAll(Arrays.asList(strArr));&&&&&& System.out.println(list2); // [3w, .itcast, .cn]&&&&&& list2.add("0807JavaSE");&&&&&& System.out.println(list2); // [3w, .itcast, .cn, 0807JavaSE]&可变参数 since JDK5&&& 如果定义方法的时候,参数类型明确但个数不明确,可使用可变参数格式:修饰符返回值类型方法名(数据类型...变量名) {}可变参数方法传递,传递实际参数,数量没有限制注意:一个方法中只能写 1 个可变参数,如果有多个参数可变参数只能放在最后&package cn.itcast.&publicclassVarArgumentsDemo {&&&& publicstaticvoid main(String[] args) {&&&&&& intsum = getSum(0, 1,2, 3, 4, 5);&&&&&& System.out.println(sum);&&& }&&&& publicstaticint getSum(int...is){&&&&&& intsum = 0;&&&&&& // 传递参数的个数,就是数组的长度&&&&&& // 如果不传递任何参数,可变参数的数组的长度就是 0//&&&& for(int i = 0; i & is. i++) {//&&&&&&&& sum+= is[i];//&&&& }&&&&&& for (inti : is) {&&&&&&&&&& sum += i;&&&&&& }&&&&&& returnsum;&&& }}&l获取10个1-20之间的随机数,要求不能重复&package cn.itcast.&importjava.util.ArrayLimport java.util.Limportjava.util.R&/*&* 获取10个1-20之间的随机数,要求不能重复&*/public class ListTest {&&&& public static void main(String[] args) {&&&&&& Random r = new Random();&&&&&& List&Integer& list = new ArrayList&Integer&();&&&&&& &&&&&& while (true) {&&&&&&&&&& // 获取随机数&&&&&&&&&& int num = r.nextInt(20) + 1;&&&&&&&&&& // 判断随机数如果不在集合中,就存储到集合&&&&&&&&&& if (!list.contains(num)) {&&&&&&&&&&&&& list.add(num);&&&&&&&&&&&&& // 判断集合容量为10就退出循环&&&&&&&&&&&&& if (list.size() == 10) {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&& }&&&&&& }&&&&&& &&&&&& for (Integer integer : list) {&&&&&&&&&& System.out.println(integer);&&&&&& }&&& }}&l键盘录入多个数据,以0结束,要求在控制台输出这多个数据中的最大值package cn.itcast.&importjava.util.ArrayLimport java.util.Limportjava.util.S&/*&* 键盘录入多个数据,以0结束&* 在控制台输出最大值:&* &利用数组,将集合转成数组&* &&& 1.升序排序,获取最后一个元素 &* &&& 2.获取数组中的最大值&* &*/public classListScannerTest {&&&& public static void main(String[] args) {&&&&&& Scanner sc = new Scanner(System.in);&&&&&& List&Integer& list = new ArrayList&Integer&();&&&&&& while (true) {&&&&&&&&&& int num = sc.nextInt();&&&&&&&&&& if (num == 0) {&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&& // 数据存储到集合中&&&&&&&&&& list.add(num);&&&&&& }&&&&&& sc.close();//&&&& System.out.println(list);&&&&&& &&&&&& // 将集合转成数组&&&&&& Integer[] integers = list.toArray(new Integer[list.size()]);&&&&&& // 选择排序&&&&&& for (int i = 0; i & integers. i++) {&&&&&&&&&& for (int j = i + 1; j & integers. j++) {&&&&&&&&&&&&& if (integers[i] & integers[j]) {&&&&&&&&&&&&&&&&& int temp = integers[i];&&&&&&&&&&&&&&&&& integers[i] = integers[j];&&&&&&&&&&&&&&&&& integers[j] =&&&&&&&&&&&&& }&&&&&&&&&& }&&&&&& }&&&&&& // 输出数组中的最后一个索引&&&&&& System.out.println(integers[integers.length - 1]);&&&&&& &&&&&& // 求数组最值思想//&&&& int max = list.get(0);//&&&& for (Integer integer : integers) {//&&&&&&&& if (integer & max)//&&&&&&&&&&& max =//&&&& }//&&&& System.out.println(max);&&&&&& &&& }&}&List 排序 Collections.sort() 方法实现排序Collections 是集合的工具类,提供很多便于操作集合的方法。void sort(List&T&list) // 该方法的作用是对给定的集合元素进行自然排序本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)拒绝访问 | www.1398.org | 百度云加速
请打开cookies.
此网站 (www.1398.org) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(390f7e3f44da660a-ua98).
重新安装浏览器,或使用别的浏览器java集合框架总结 -
- ITeye博客
一.Conllection
& Conllection是java.util下的接口,是java中集合的父接口,谈到Conllection,我们就会想起Conllections,他们有什么区别,Conllections是java.util下的一个类,包含着java中对集合操作的各种静态方法。而这次蓝杰上课主要讲了Conllection接口下几个常用和比较重要的接口和这些接口下的几个实现类,下面主要介绍这几个接口和类的用法和区别。
二,Conllection下的子接口
&
1.Set
& 2.List
注意点:Map不是Conllection的子接口。
三.Set的常用实现类及用法& 1.Set是没有重复项目无序的集合(及Set中没有重复的元素)
& 2.set接口下常用的实现类有HashSet、LinkedHashSet、TreeSet。
下面以HashSet为实例介绍Set用法。
&
& Set是接口所以是不能用来实例化对象的,所以实例化对象用其实现类
&&&&&&& Set set=new HashSet(); 这样一个Set对象就有了。
& 我们知道集合的作用是我们可以利用它来放置元素,下面以元素(Student类对象)为实例介绍如何向Set中添加元素。 由于java中为集合都提供的泛型机制,所以上面的实例化可以修改成
&& Set&Student& set=new HashSet();
set中提供了添加元素add()方法,所以set.add(new Student());便可完成对元素的添加
&
&& 那么怎么在set中寻找到我们需要的元素呢?
这个要求遍历set,和数组不一样,set中元素是无序的,所以一个简单的for循环使不能遍历set的,java中为set提供了遍历set的迭代器IteratorPublic interface Iterator{
Public Boolean hasNext(};
  Public Object next(};
 Public void remove(};
hashNext(),下一个位置是否有元素,有便返回true,否则返回false,
next(),返回下一个元素
remouve()删除下一个元素
有了这个迭代器和这些方法我们就可以实现在set寻找元素了。
以下是代码:
//获取迭代器
Iterator iterator=hashset.iterator();
while(iterator.hasNext()){
Student stu=(Student) iterator.next();
if(stu.getScore()==score){
System.out.println(stu.toString());
同样的要删除set中指定的元素,调用remove方法就行了,代码如下:
//获取迭代器
Iterator iterator=hashset.iterator();
//实例化一个新的Hashset对象,用来存储要删除的对象
HashSet hashset2=new HashSet();
while(iterator.hasNext()){
//获取学生对象
Student stu=(Student) iterator.next();
if(stu.getScore()&score){
iterator.remove();
}
set中还提供了removeall(Conllect&& c),方法,所以在删除学生时,可以再实例化一个新的set对像,将符合条件的学生先保存在新的set对象中,在调用removeall()方法同样也可以实现。
注意:不能在利用iterator得到符合条件的学生对象时,用set.remove(stu);来删除学生对象,这样是不允许的。这样做会抛出“ConcurrentModificationException”这样的异常,当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
四、List有序允许有重复元素的集合
常用实现类有:ArrayList、LinkedList
ArrayList的用法和Vector相差无几,用for循环便能完成迭代。故利用ArrayList对学生信息的增删改查这边就不做介绍。
注意点在迭代时,因为每次删除一个元素后,ArrayList的长度也就相应的减少了1,所以如果简单的用for(int i=0;i&arraylist.size();i++){}这样去迭代是不行了,因为每次去掉一个元素,arraylist中的所有元素就进了以为,当再i++时就一次跳过两次就使有些元素没有做判断,直接跳过了。所以i++只能放在没有删除元素的条件下进行.
以下是代码:
//定义一个删除学生信息的方法
public void remove(ArrayList&Student& arraylist,int score){
//遍历arraylist删除学生学分小于score的学生信息
for(int i=0;i&arraylist.size();){
//获取学生对象
Student stu=arraylist.get(i);
if(stu.getScore()&score){
arraylist.remove(i);
五、Map 用于关键字/数值对,像个Dictionary&
常用实现类:HashMap、LinkedHashMap、TreeMap
要用Map实现对学生信息的增删改查和上面所介绍的差别比较大,Map中没有add()方法,与之对应的是put(key,value)方法,参数是一对k-v组合。而要获取map中指定元素只能用get(key)方法,该方法返回与key对应的value,所以在对学生信息查找和删除这一块要利用到map中keyset()方法,获取存储key的set,利用set便可获取我们要查找和删除的value对应的key,在利用remove(key),便可完成我们要的操作。
下面是代码:
//定义录入学生信息的方法
public void mapAdd(Map&String,Student& map){
//实例化一个产生随机数的对象,给学生的学分赋值
Random rand=new Random();
//实例化学生对象
for(int i=0;i&20;i++){
Student stu=new Student("姓名是:"+(char)(65+i),rand.nextInt(20));
map.put(stu.getName(), stu);
}
//定义查找学生信息的方法
public void chaozhao(Map&String,Student& map,int score){
//获取keyset
Set&String& set=map.keySet();
//获取set中的迭代器
Iterator&String& iterator=set.iterator();
System.out.println("学分为"+score+"的学生是:");
//利用迭代器进行迭代
while(iterator.hasNext()){
String key=iterator.next();
//根据key获取学生对象
Student stu=map.get(key);
if(stu.getScore()==score){
//输出符合条件学生的信息
System.out.println(stu.toString());
public void remove(Map&String,Student& map,int score){
//获取map中keyset
Set&String& set=map.keySet();
//从获取的keyset中获取迭代器
Iterator&String& iterator=set.iterator();
//利用迭代器进行迭代
while(iterator.hasNext()){
//获取key对象
String key=iterator.next();
//根据key获取学生对象
Student stu=map.get(key);
if(stu.getScore()&score){
iterator.remove();
}
结合上面对set的操作,就显得非常简单了,map对学生信息的增删改查不是直接的,而是利用keyset(),而后利用这个set里面的key,在调用remove(),get()等方法间接完成操作。
以下是我在网上找到的一些关于java集合框架的介绍:
浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection classes)。集合在java中非常重要,在讨论之前,先来看几个面试中的经典问题。
1 Collection 和 Collections的区别。
2 List, Set, Map是否继承自Collection接口。
3 ArrayList和Vector的区别。
4 HashMap和Hashtable的区别。&
篇尾有答案,我们开始正题。&&
集合Collection接口&&
--Collection 是任何对象组,元素各自独立,通常拥有相同的套用规则。Set List由它派生。
基本操作& 增加元素add(Object obj); addAll(Collection c);&&
删除元素 remove(Object obj); removeAll(Collection c);&
求交集 retainAll(Collection c);&
删除元素 remove(Object obj); removeAll(Collection c);&
求交集 retainAll(Collection c);&&
访问/遍历集合元素的好办法是使用Iterator接口(迭代器用于取代Enumeration)
Public interface Iterator{
 & Public Boolean hasNext(};
&   Public Object next(};
&&  Public void remove(};
集set --没有重复项目的集合&&
有三种特定类型的集可用&
HashSet-基于散列表的集,加进散列表的元素要实现hashCode()方法&&
LinkedHashSet-对集迭代时,按增加顺序返回元素&
TreeSet-基于(平衡)树的数据结构&&&&
清单List& --位置性集合。加进清单的元素可以加在清单中特定位置或加到末尾&&
有两个特定版本
ArrayList(数组表)-类似于Vector,都用于缩放数组维护集合。区别:
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半&
LinkedList(链表)-是双向链表,每个节点都有两个指针指向上一节点和下一节点。&
用在FIFO,用addList()加入元素 removeFirst()删除元素
用在FILO,用addFirst()/removeLast()&&
ListIterator提供双向遍历next() previous(),可删除、替换、增加元素&&
映射表Map&&
--用于关键字/数值对,像个Dictionary&&
处理Map的三种集合&&
关键字集KeySet()&&
数值集value()&
项目集enrySet()&&
四个具体版本
HashMap-散列表的通用映射表&
LinkedHashMap-扩展HashMap,对返回集合迭代时,维护插入顺序&&
WeakHashMap-基于弱引用散列表的映射表,如果不保持映射表外的关键字的引用,则内存回收程序会回收它&
TreeMap-基于平衡树的映射表&&
HashMap-散列表的通用映射表&&
LinkedHashMap-扩展HashMap,对返回集合迭代时,维护插入顺序&&
WeakHashMap-基于弱引用散列表的映射表,如果不保持映射表外的关键字的引用,则内存回收程序会回收它&
TreeMap-基于平衡树的映射表&
Collections类,用于同步集合,还能改变集合只读方式的类
Map mp=new HashMap();
mp=Collections.synchronizedMap(mp); //生成线程安全的映射表
mp=Collections.unmodifiableMap(mp); //生成只读映射表 Comparable 自然顺序的排序类 Comparator 面向树的集合排序类&&
容器分类学(Container taxonomy)&&
集合接口: Collection List SMap Iterator ListIterator。&
抽象类: AbstractCollection AbstractList AbstractSet AbstractMap AbstractSequentiaList。
老版本中的集合类型&
Vector类 &
Vector,就是向量。一种异构的混合体,可以动态增加容量。对它的操作简要如下&
比如我们有一个Vector: Vector myVec=new Vector(a_Array.length)&&
取得vector的长度:myVec.size();&
赋值:set(int position,Object obj) / setElementAt(Object obj, int position) –不支持动态增长&&
&&&&& add(Object obj )/ addElement(Object obj) 在Vector末尾加入对象&&
e.g.:myVec.add(new a_Array[0]);&
取出元素:get(int position) / getElement(int position)
是Vector的子类。就是数据结构里讲滥了的堆栈(这个词可简称栈,不要混淆于heap-堆)。后进先出的存取方式。&&
Stack()构造空栈&
Empty()叛空&&
Search()检查堆栈是否有元素&
Peek()取得栈顶元素&
Pop()弹栈&
Push()入栈&&
Enumeration接口&&
Dictionary类&&
字典。关键字/数值方式存取数据,如果映射没有此关键字,取回null。
Hashtable类&
是Dictionary结构的具体实现。&&
面试题答案 &
Collection 和 Collections的区别。&&
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。&&
Collection是个java.util下的接口,它是各种集合结构的父接口
List, Set, Map是否继承自Collection接口? List,Set是 Map不是&&
ArrayList和Vector的区别。
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半&&
HashMap和Hashtable的区别&
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现&
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的&
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value
lixiongzhi_m
浏览: 48384 次
来自: 福建
相比较而言,这篇文章讲解的更深入更详细:异常的深入研究与分析
参考最新的百度API吧
这个估计快两年前的了,百度地图api都更新了不少了。不知道还能 ...
学习啦。楼主赞。!!
SB,你是李雄志???

我要回帖

更多关于 java泛型机制的优点有 的文章

 

随机推荐