java-容器

容器的概念: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值