容器的概念: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方法,所以可以去除hello
boolean 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