- 浏览: 97359 次
- 性别:
文章分类
最新评论
-
chinrui:
iamaj2eeprogrammer 写道顶一个 。。。。。。 ...
日志规范 -
iamaj2eeprogrammer:
顶一个 。。。。。。。。。。
日志规范 -
chinrui:
如果Eclipse安装过Android的开发插件,可能会有一定 ...
使用Ant编译生成Hadoop的Eclipse插件
Collection 笔记
一、 Collection
所有集合共用的方法:
二、 List 特点:有序可重复
List独有方法:
三、 ArrayList(数组存储结构)
独有方法:
Object clone():复制ArrayList实例
四、 LinkList(链表存储结构)
独有方法:
新的替代方法:
/*在List里面,元素之间的比较使用equals()方法*/
五、 HashSet(哈希表存储) 特点:无序不可重复
检验HashSet里面元素比较方法:先调用HashCode()计算Hash值,再调用equals()方法比较Hash值一样的元素
程序运行结果:
yuan01..equals..yuan01
yuan02..equals..yuan01
yuan03..equals..yuan02
yuan03..equals..yuan01
yuan04..equals..yuan03
yuan04..equals..yuan02
yuan04..equals..yuan01
可以看出由于所有的Hash值是相等的,所以相互之间进行比较,因此以后再使用HashSet的时候就需要重写hashCode()与equals()方法。
六、 TreeSet(二叉树又称红黑树存储) 特点:有序不可重复
若要向TreeSet里面存入自定义元素,则自定义类必须实现Comparable接口,重写compareTo()方法。如果有类里面有多个元素则在判断父元素后,还要判断子元素。
七、 使用比较器进行比较(实际中应用较多)
如果不想使用已经定义好的比较方法,可以自定义比较器,即实现Comparator接口,重写compare()方法,实例化一个类对象,当作参数传入TreeSet的构造方法中。
如果两种比较都有的时候,以比较器为主。
八、 泛型
泛型在比较器中的使用:
自定义泛型类(当自定义类中,使用对象的类型不确定的时候,早期使用Object,现在使用泛型)
当只定义泛型类的时候,一个类难以操作多个不同类型的变量,而定义泛型方法可以做一个类操作多个不同对象。
特殊之处:静态方法不可以访问类上定义的泛型,如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。而且泛型的标记<T>等应该放在方法返回类型的前面,修饰词的后面。
九、 泛型的高级应用
当方法里面的参数类型不确定的时候,可以使用通配符?代替不明确的参数,与使用其它符号如<T>等不同的是,使用通配符,不能取出相应的元素,而使用其它符号可以,例如:T t = it.next();其中T就是明确的了。
如果当要操作的对象有继承关系的时候,子类对象不能向父类对象转换,例子如下:
编译时,报错说无法通过方法调用转换将实际参数ArrayList<Teacher>转换为ArrayList<People>,那么怎样修改呢 ?可以使用通配符<? extends People>代替即可解决问题,这个叫作泛型的上限。修改后例子如下:
泛型的下限:<? super E>可以接受E的所有父类型。
十、 Map(存储键值对)
|--Hashtable:是哈希表数据结构。不允许存储null键null值,是线程同步的,
|--HashMap:是只哈希表数据结构。允许存储null键null值,不是线程同步的。
|--TreeMap:是二叉树数据结构,是线程不同步的。可用Map中的键进行排序。
十一、 Map中获取键值的方法
第一种:values()获取所有的值,返回的对象是Collection类型
第二种:keySet()方法获得所有的键,再通过键获取所有的值
第三种:entrySet()方法,获取所有的键值关系,存入Set<Map.Entry<key,value>>里面,通过getKey()和getValue()方法获得相应的键和值。
十二、 TreeMap的应用
当自定义的对象要存入Hash存储结构的集合中时,需要重写hashCode()和equals()方法,当要存入二叉树数据结构时,要实现Comparable接口或者自定义比较器实现Comparator接口,并当参数传入相应集合的构造方法中。
*******#***反向旋转比较器Comparator<Student> cmp = Collections.reverseOrder();*************
一、 Collection
所有集合共用的方法:
- ************************增************************
- boolean add(Object obj):添加一个元素
- boolean addAll(Collection collection):添加一个集合里面的所有元素
- ************************删************************
- void clear():清空集合内所有元素
- boolean remove(Object obj):删除一个指定元素
- boolean removeAll(Collection collection):删除与另外一个集合相同的所有元素
- ************************改************************
- boolean retainAll(Collection collection):保留与另外一个集合相同的所有元素,即做交集
- ************************查************************
- int size():获得集合的长度
- ************************判断************************
- boolean contains(Object obj):判断一个元素是否存在集合中
- boolean containsAll(Collection collection):判断一个集合是否包含另外一个集合的所有元素
- boolean isEmpty():判断一个集合是否为空
- ************************迭代器************************
- Iterator iterator():获得迭代器
二、 List 特点:有序可重复
List独有方法:
- ************************增************************
- boolean add(int index, Object obj):在指定位置添加一个元素
- boolean addAll(int index, Collection collection):添加一个集合里面的所有元素
- ************************删************************
- boolean remove(int index):根据索引删除一个元素
- ************************改************************
- Object set(int index, Object obj):设置索引处的元素值
- ************************查************************
- Object get(int index):获得指定位置元素
- int indexOf(Object obj):获得相应元素的位置
- ************************迭代************************
- ListIterator listIterator():获得ListIterator
三、 ArrayList(数组存储结构)
独有方法:
Object clone():复制ArrayList实例
四、 LinkList(链表存储结构)
独有方法:
- boolean addFirst(Object obj):在集合第一个添加一个元素
- boolean addLast(Object obj):在集合最后一个添加一个元素
- Object getFirst():获得第一个元素
- Object getLast():获得最后一个元素
- Object removeFirst():删除第一个元素
- Object removeLast():删除最后一个元素
新的替代方法:
- boolean offerFirst(Object obj):在集合第一个添加一个元素
- boolean offerLast(Object obj):在集合最后一个添加一个元素
- Object peekFirst():获得第一个元素
- Object peekLast():获得最后一个元素
- Object pollFirst():删除第一个元素
- Object pollLast():删除最后一个元素
/*在List里面,元素之间的比较使用equals()方法*/
五、 HashSet(哈希表存储) 特点:无序不可重复
检验HashSet里面元素比较方法:先调用HashCode()计算Hash值,再调用equals()方法比较Hash值一样的元素
import java.util.*; class HashSetDemo { public static void main(String[] args) { HashSet hs = new HashSet(); hs.add(new Student("yuan01",17)); hs.add(new Student("yuan01",17)); hs.add(new Student("yuan02",21)); hs.add(new Student("yuan03",23)); hs.add(new Student("yuan04",32)); for(Iterator it = hs.iterator(); it.hasNext();) { Student st = (Student)it.next(); sop(st.getName() + "..." + st.getAge()); } } public static void sop(Object obj) { System.out.println(obj); } } class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public boolean equals(Object obj) { if(!(obj instanceof Student)) { return false; } Student st = (Student)obj; System.out.println(this.name + "..equals.." + st.name); return this.age == st.age && this.name.equals(st.name); } public int hashCode() { //System.out.println(this.name + "hashCode()"); return 100; //return name.hasCode + age * 20; } }
程序运行结果:
yuan01..equals..yuan01
yuan02..equals..yuan01
yuan03..equals..yuan02
yuan03..equals..yuan01
yuan04..equals..yuan03
yuan04..equals..yuan02
yuan04..equals..yuan01
可以看出由于所有的Hash值是相等的,所以相互之间进行比较,因此以后再使用HashSet的时候就需要重写hashCode()与equals()方法。
六、 TreeSet(二叉树又称红黑树存储) 特点:有序不可重复
若要向TreeSet里面存入自定义元素,则自定义类必须实现Comparable接口,重写compareTo()方法。如果有类里面有多个元素则在判断父元素后,还要判断子元素。
import java.util.*; class TreeSetDemo1 { public static void main(String[] args) { TreeSet ts = new TreeSet(); ts.add(new Person("yuan01", 20)); ts.add(new Person("yuan02", 17)); ts.add(new Person("yuan03", 19)); ts.add(new Person("yuan04", 20)); for(Iterator it = ts.iterator(); it.hasNext();) { Person st = (Person)it.next(); System.out.println(st.getName() + "..." + st.getAge()); } } } class Person implements Comparable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; }//重写compareTo()方法 public int compareTo(Object obj) { Person ps = (Person)obj; if(this.age > ps.age) return 1; if(this.age == ps.age) { return this.name.compareTo(ps.name); } return -1; } }
七、 使用比较器进行比较(实际中应用较多)
如果不想使用已经定义好的比较方法,可以自定义比较器,即实现Comparator接口,重写compare()方法,实例化一个类对象,当作参数传入TreeSet的构造方法中。
import java.util.*; class TreeSetDemo { public static void main(String[] args) { TreeSet ts = new TreeSet(new myCompare()); ts.add("asdf"); ts.add("afggf"); ts.add("aasdfasdf"); ts.add("asd"); ts.add("acd"); for(Iterator it = ts.iterator(); it.hasNext();) { String str = (String)it.next(); System.out.println(str); } } } class myCompare implements Comparator { public int compare(Object o1, Object o2) { String s1 = (String)o1; String s2 = (String)o2; //System.out.println(s1 + "..compare.." + s2); int l1 = s1.length(); int l2 = s2.length(); if(l1 > l2) return 1; if(l1 == l2) return s1.compareTo(s2);//当长度一样的时候,还要比较内容 return -1; } }
如果两种比较都有的时候,以比较器为主。
八、 泛型
import java.util.*; class GenericDemo { public static void main(String[] args) { ArrayList<String> al = new ArrayList<String>(); al.add("yuan01"); al.add("yuan02"); al.add("yuan03"); al.add("yuan04"); for(Iterator<String> it = al.iterator(); it.hasNext();) { String str = it.next(); System.out.println(str); } } }
泛型在比较器中的使用:
import java.util.*; class GenericDemo2 { public static void main(String[] args) { TreeSet<String> ts = new TreeSet<String>(new StrComparator()); ts.add("java0"); ts.add("java02"); ts.add("java"); for(Iterator<String> it = ts.iterator(); it.hasNext();) { String str = it.next(); System.out.println(str); } } } class StrComparator implements Comparator<String> { public int compare(String s1 , String s2) { int num = ((Integer)s2.length()).compareTo((Integer)s1.length()); if(num == 0) return s2.compareTo(s1); return num; } }
自定义泛型类(当自定义类中,使用对象的类型不确定的时候,早期使用Object,现在使用泛型)
class GenericDemo3 { public static void main(String[] args) { Tool<String> tool = new Tool<String>(); tool.setObject("loveyuan"); System.out.println(tool.getObject()); } } class Tool<T> { private T t; public void setObject(T t) { this.t = t; } public T getObject() { return t; } }
当只定义泛型类的时候,一个类难以操作多个不同类型的变量,而定义泛型方法可以做一个类操作多个不同对象。
class GenericDemo4 { public static void main(String[] args) { Demo<String> d = new Demo<String>(); d.show("love"); d.print(new Integer(1)); d.print("yuan"); } } class Demo<T> { public void show(T t) { System.out.println("show" + t); } public <Q> void print(Q q) { System.out.println("print" + q); } }
特殊之处:静态方法不可以访问类上定义的泛型,如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。而且泛型的标记<T>等应该放在方法返回类型的前面,修饰词的后面。
九、 泛型的高级应用
当方法里面的参数类型不确定的时候,可以使用通配符?代替不明确的参数,与使用其它符号如<T>等不同的是,使用通配符,不能取出相应的元素,而使用其它符号可以,例如:T t = it.next();其中T就是明确的了。
import java.util.*; class GenericDemo6 { public static void main(String[] args) { ArrayList<String> al = new ArrayList<String>(); al.add("java1"); al.add("java2"); al.add("java3"); ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); al1.add(2); al1.add(3); print(al); } public static void print(ArrayList<?> al) { for(Iterator<?> it = al.iterator(); it.hasNext();) { System.out.println(it.next()); } } }
如果当要操作的对象有继承关系的时候,子类对象不能向父类对象转换,例子如下:
import java.util.*; class People { private String name; public People(String name) { this.name = name; } public String getName() { return name; } } class Teacher extends People { public Teacher(String name) { super(name); } } class GenericDemo7 { public static void main(String[] args) { ArrayList<Teacher> al = new ArrayList<Teacher>(); al.add(new Teacher("java1")); al.add(new Teacher("java2")); al.add(new Teacher("java3")); printAll(al); } public static void printAll(ArrayList<People> al) { for(Iterator<People> it = al.iterator(); it.hasNext();) { System.out.println(it.next().getName()); } } }
编译时,报错说无法通过方法调用转换将实际参数ArrayList<Teacher>转换为ArrayList<People>,那么怎样修改呢 ?可以使用通配符<? extends People>代替即可解决问题,这个叫作泛型的上限。修改后例子如下:
public static void printAll(ArrayList<? extends People> al) { for(Iterator<? extends People> it = al.iterator(); it.hasNext();) { System.out.println(it.next().getName()); } }
泛型的下限:<? super E>可以接受E的所有父类型。
class GenericDemo7 { public static void main(String[] args) { ArrayList<People> al = new ArrayList<People>(); al.add(new People("java--1")); al.add(new People("java--2")); al.add(new People("java--3")); printAll(al); } public static void printAll(ArrayList<? super Teacher> al) { for(Iterator<? super Teacher> it = al.iterator(); it.hasNext();) { System.out.println(it.next()); } } }
十、 Map(存储键值对)
- void clear():清空元素
- boolean containsKey(Object obj):判断是否存在键
- boolean containsValue(Object value):判断是否存在值
- Object get(Object key):根据键获得值
- Set keySet():获得所有键所组成的Set集合
- Object put(Key key , Value value):存储元素
- Collection values():获得Collection
|--Hashtable:是哈希表数据结构。不允许存储null键null值,是线程同步的,
|--HashMap:是只哈希表数据结构。允许存储null键null值,不是线程同步的。
|--TreeMap:是二叉树数据结构,是线程不同步的。可用Map中的键进行排序。
十一、 Map中获取键值的方法
第一种:values()获取所有的值,返回的对象是Collection类型
import java.util.*; class MapDemo1 { public static void main(String[] args) { Map<String , String> map = new HashMap<String, String>(); map.put("01","java01"); map.put("02","java02"); map.put("03","java03"); System.out.println(map.values()); } }
第二种:keySet()方法获得所有的键,再通过键获取所有的值
import java.util.*; class MapDemo2 { public static void main(String[] args) { Map<String ,String> map = new HashMap<String , String>(); map.put("01","java1"); map.put("02","java2"); map.put("03","java3"); Set<String> set = map.keySet(); for(Iterator<String> it = set.iterator();it.hasNext();) { String key = it.next(); String value = map.get(key); System.out.println(key + "=" + value); } } }
第三种:entrySet()方法,获取所有的键值关系,存入Set<Map.Entry<key,value>>里面,通过getKey()和getValue()方法获得相应的键和值。
import java.util.*; class MapDemo3 { public static void main(String[] args) { Map<String , String> map = new HashMap<String , String>(); map.put("01","java1"); map.put("02","java2"); map.put("03","java3"); Set<Map.Entry<String,String>> set = map.entrySet(); for(Iterator<Map.Entry<String,String>> it = set.iterator();it.hasNext();) { Map.Entry<String,String> me = it.next(); String key = me.getKey(); String value = me.getValue(); System.out.println(key + "=" + value); } } }
十二、 TreeMap的应用
import java.util.*; class MapDemo4 { public static void main(String[] args) { TreeMap<Student, String> map = new TreeMap<Student, String>(); map.put(new Student("java17",20),"beijing"); map.put(new Student("java13",20),"shanghai"); map.put(new Student("java16",20),"wuhan"); map.put(new Student("java12",20),"nanjing"); Set<Map.Entry<Student,String>> set = map.entrySet(); for(Iterator<Map.Entry<Student,String>> it = set.iterator();it.hasNext();) { Map.Entry<Student,String> me = it.next(); Student st = me.getKey(); String addr = me.getValue(); System.out.println(st + "=" + addr); } } } class Student implements Comparable<Student> { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public int hashCode() { return name.hashCode() + age * 23; } public boolean equals(Object obj) { if(!(obj instanceof Student)) throw new ClassCastException("类型不匹配!"); Student st = (Student)obj; return this.name.equals(st.name) && this.age == st.age; } public int compareTo(Student st) { int num = ((Integer)this.age).compareTo((Integer)st.age); if(num == 0) return this.name.compareTo(st.name); return num; } public String toString() { return this.name + ":" + this.age; } }
当自定义的对象要存入Hash存储结构的集合中时,需要重写hashCode()和equals()方法,当要存入二叉树数据结构时,要实现Comparable接口或者自定义比较器实现Comparator接口,并当参数传入相应集合的构造方法中。
*******#***反向旋转比较器Comparator<Student> cmp = Collections.reverseOrder();*************
相关推荐
### Java Collection Framework 相关知识点 #### 一、引言 在 Java 领域,《Java Collection Framework》这本书被广泛认为是一本优秀的教程,尤其适合初学者了解集合框架的前世今生。通过本书的学习,读者不仅能...
8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.java...
Java集合框架是Java编程语言中一个非常核心的部分,它提供了数据结构和算法的实现,使得开发者可以方便地存储和管理对象。在这个学习笔记中,我们将深入探讨ArrayList、HashMap、LinkedList和HashSet这四个重要的...
《JAVA COLLECTION》是一本专注于Java集合框架的书籍,由APress出版社出版。这本书深入浅出地探讨了Java API中的各种数据结构,是学习和理解Java集合框架的理想资源。作者通过简洁明了的语言,使得初学者也能轻松...
Java集合框架中的`Collection`接口是所有单值容器的基础接口,它定义了基本的增删查改元素的方法。`Collection`有两个主要的子接口:`List`和`Set`。`List`接口要求元素保持特定的顺序,并允许重复元素;而`Set`接口...
在“Java collection_java_控制服务器_服务器_”这个主题中,我们将深入探讨Java集合框架以及如何利用它们来构建服务器控制程序。 首先,Java集合框架包括接口(如List、Set、Queue)和实现这些接口的具体类(如...
### Java Collection API 关键知识点详解 #### 一、线程安全集合类 在Java的Collection框架中,集合类被划分为两大类:线程安全集合类与非线程安全集合类。早期版本的集合类(如`Vector`和`Hashtable`)通过`...
### Java Collection 概述 Java Collection 是 Java 编程语言中的一个重要组成部分,它提供了一种组织和管理数据的方式。在 Java 中,集合框架是围绕着一组接口构建的,这些接口规定了不同类型的容器如何存储、检索...
本文将深入探讨这两个主题,并着重讲解`Collection`接口及其在Java中的应用。 首先,Java泛型是一种在编译时提供类型安全性的机制,它允许我们在创建集合时指定元素的类型。这样可以防止在运行时出现...
Java Collection 移除元素方法及注意事项 Java Collection 中的元素移除操作是 Java 编程人员每天都在重复的事情。本文主要介绍了 Java Collection 移除元素方法及注意事项,通过简单实例讲解了从 Java Collection ...
Java Collection 集合遍历运行代码实例 Java Collection 集合遍历是 Java 语言中最常用的数据结构之一。Collection 是 Java 集合框架中的一个接口,提供了基本的集合操作,例如添加、删除、遍历元素等。Collection ...
在Java编程语言中,Collection框架是处理集合数据的重要部分,其中包含了List、Set和Map三种主要的数据结构。本文将深入探讨这些数据结构在排序方面的实现和应用。 首先,我们来看List的排序。List接口提供了直接...
Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了数据结构和算法的抽象,使得开发者可以方便地存储和管理对象。在这个框架中,Collection和Map接口及其实现类扮演着核心角色。 1. **Collection接口**...
第六,Collection 和 Collections的区别。 你千万别说一个是单数一个是复数。 第七,什么时候用assert。 API级的技术人员有可能会问这个。 第八,GC是什么? 为什么要有GC? 基础。 第九,...
Java Collection 集合 iterator 方法解析 Java Collection 集合 iterator 方法是一种非常重要的方法,通过该方法我们可以对集合进行遍历和操作。下面我们将详细介绍 Java Collection 集合 iterator 方法的实现原理...
### JAVA Collection框架详解 #### 一、概述 Java Collection框架 是 Java 核心库中一个重要的组成部分,它为集合类提供了一种通用的接口、实现以及算法。在 Java 开发过程中,我们经常会遇到需要处理一组对象的...
Java.util.Collection类的学习 Java.util.Collection类是Java编程语言中的一个基础类库,提供了许多有用的方法来操作集合对象。Collection类包含了许多静态方法,可以对集合进行排序、混排、反转、替换等操作。 1....
集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map,这里主要记录一下Collection集合。 Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个...