java-容器

来源:互联网 发布:北京科技大学网络教育 编辑:程序博客网 时间:2024/06/06 12:36

容器的概念:JAVA API 所提供的一系列类的实例,用于在程序中存放对象

容器API类图:容器提供的类都存放在java.util包中



Collection接口提供了

Set接口:没有顺序,不可以重复(可以理解为这种)


List接口:有顺序,可以重复(可以理解为这种),arraylist是以数组作为底层实现,linkedlist是以链表作为底层实现


Map接口:是一对一对的存放


collection中有一个方法是 boolean retainAll(Collection<?> c):该方法是仅保留此collection中那些也包含在指定的collection中的所有的元素

import java.util.*;public class CollectionTest{public static void main(String[] args){//Collection c = new ArrayList();/*c.add(new Name("f1","l1"));c.add(new Integer(100));c.add("hello");System.out.println(c);boolean b1 = c.remove(new Integer(100));//Integer对象已经重写了equals方法,所以也可以去除boolean b2 = c.remove("hello");//string字符串已经重写了equals方法,所以可以去除helloboolean b3 = c.remove(new Name("f1","l1"));System.out.println(b1+" ,"+b2+" ,"+b3);*/List c = new LinkedList();c.add(new Name("Karl","M"));c.add(new Name("Steven","Lee"));c.add(new Name("John","O"));c.add(new Name("Tom","M"));System.out.println(c);Collections.sort(c);System.out.println(c);}}class Name implements Comparable{private String firstName,lastName;public Name(String firstName,String lastName){this.firstName = firstName;this.lastName = lastName;}public String getFirstName(){  return firstName;}public String getLastName(){  return lastName;}public String toString(){  return firstName+" "+lastName;}//重写Name的equals方法public boolean equals(Object obj){if(obj instanceof Name){Name name = (Name)obj;return ((firstName.equals(name.firstName))&&(lastName.equals(name.lastName)));}else{   return super.equals(obj);}}public int hashCode(){return firstName.hashCode();//字符串已经实现了hashCode()方法}public int compareTo(Object obj){Name name = (Name)obj;int compare = lastName.compareTo(name.lastName);return compare!=0 ? compare : firstName.compareTo(name.firstName);}}


当我们在类中这样定义一个集合Collection c = newArrayList();这样定义的好处是引用java中的多态:父类的引用指向子类的对象,此时不能调用子类中独有的方法,只能使用父类的方法,如果以后需要将Arraylist换一个对象为Set则不用担心c调用了Arraylist中独有的方法使得set对象不能调用的问题,下面的方法都可以不用换,直接将ArrayList换成Set即可。

Collection存放的对象是不能存放基础类型的数据的,必须要存放对象才可以因为基础数据类型的对象是存放在栈上的,很可能会被清空

容器类在调用remove或者是add等方法时需要比较对象是否会相等,这会涉及到对象类型的equals方法和hashCode方法,对于自定义类型,需要重写equals和hashCode方法以实现自定义的对象相等规定:相等的对象应该具有相等的hash codes;



当对象作为索引或者是键值得时候,重写equal()方法必须重写hashCode()方法



Iterator接口:所有实现了Collection接口的容器类都有一个iterator方法用于返回一个实现了Iterator接口的对象,根据该对象可以去对容器内的元素进行遍历操作

Iterator接口中定义的方法
boolean hashnext();

object next();

void remove();


import java.util.*;public class TestArgsWords{//private static final Integer One = new Integer(1);private static final int One = 1;public static void main(String[] args){/*Map map = new HashMap();for(int i =0;i<args.length;i++){Integer param = (Integer)map.get(args[i]);  map.put(args[i],param == null ? One : new Integer(param.intValue()+1));}System.out.println(map.size()+"distance words detected");System.out.println(map);*/Map map = new HashMap();for(int i = 0;i<args.length;i++){int m = (Integer) map.get(args[i])==null?0:(Integer) map.get(args[i]);//因为这个原来没有值的时候回报空,所以对这里为null值的时候进行判断map.put(args[i],m==0?One:m+1);}System.out.println(map.size());System.out.println(map);}}


实现多态的三个条件:第一要有实现继承,第二要有重写,第三:父类引用指向子类对象


当collection和iterator一起使用的时候,如果要删除collection中的一个对象不能使用collection中的remove方法,必须要使用iterator的remove方法,因为iterator对对象进行了锁定,其他的对象是不能看到里面的值

jdk1.5增强的for循环

缺陷:1不能方便的访问下标值

2:与使用Iterator相比,不能方便的删除集合中的内容,在内部调用的也是Iterator

总结:除了简单遍历并读出其中的内容外,不建议使用增强for循环

Set接口

set接口是Collection的子接口,set接口没有提供额外的方法,实现set接口的类有hashset和treeset

list接口

 T set(int index,T obj):这个方法的返回值是一个泛型对象,找到指定位置,若该位置中有值,则将该值拿出来,将新的对象赋值进去,然后返回原来的值


在容器这有一个特别重要的类就是java.util.collections类,他是Collections类,该类中定义了一些静态方法,这些方法实现了list中的常用算法

void sort(List);对List容器内的元素进行排序

void shuffle(List);对List容器内的对象进行随机排序

void reverse(List);对List容器内的对象进行逆序排序

void fill(List, Object);用一个特定的对象重写整个List容器

void copy(List desc,List src);将src List 容器内容拷贝到dest List 容器

int binarySearch(List,Object):对于顺序的List容器,采用折半查找的方法查找特定对象

compare接口

所有可以”排序“的类都实现了java.lang.Comparable接口,Comparable接口中只有一个方法:public int compareTo(Object obj);该方法

返回0表示 this== obj。若返回正数表示this>obj ,若返回负数则表示this<obj.实现了Comparable接口的类通过实现comparaTo方法来确定该类对象的排序方式


衡量标准

Array读快改慢

Linked改快读慢

Hash两者之间

Map接口:实现了Map接口的类用来存储键-值对

Map接口的实现类有hashMap(底层是用hash表实现的)和TreeMap(底层是用二叉树实现)等

Object put(Object key,Object value);该方法返回值是一个Object对象,原因在与当我们要向一个map集合中添加一个对象的时候,首先是用key找该集合中有没有为key的键值对,如果有的话就将该键值对中的value替换成新的value,原来的value值作为返回对象进行返回

容器知识点1136

1个图:上图

1个类:Collections类

3个知识点:增强泛型类,泛型,自动打包解包

6个接口:Collection,Set,Map,List,Iterator,Comparable

0 0
原创粉丝点击