1.集合的由来:

数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少 。

集合和数组的区别:

* 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
* 集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象


* 数组长度是固定的,不能自动增长
* 集合的长度的是可变的,可以根据元素的增加而增长


2.集合体系框架:


一张图说明问题:




java 集合里面最大值 java集合的默认长度_集合




3.Collection的基本功能:



collection是一个接口,是不能直接创建对象的;


基本功能演示
		
		boolean add(E e)
		boolean remove(Object o)
		void clear()
		boolean contains(Object o)
		boolean isEmpty()
		int size()




add方法如果是List集合一直都返回true,因为List集合中是可以存储重复元素的
如果是Set集合当存储重复元素的时候,就会返回false


public static void demo1() {
		Collection c = new ArrayList();						//父类引用指向子类对象
		boolean b1 = c.add("abc");
		boolean b2 = c.add(true);							//自动装箱new Boolean(true);
		boolean b3 = c.add(100);
		boolean b4 = c.add(new Student("张三",23));			
		boolean b5 = c.add("abc");
		
		System.out.println(b1);
		System.out.println(b2);
		System.out.println(b3);
		System.out.println(b4);
		System.out.println(b5);
		
		System.out.println(c.toString());
	}


public static void main(String[] args) {
		//demo1();
		Collection c = new ArrayList();		
		c.add("a");
		c.add("b");
		c.add("c");
		c.add("d");
		
		//c.remove("b");										//删除指定元素
		//c.clear();											//清空集合
		//System.out.println(c.contains("b"));					//判断是否包含
		//System.out.println(c.isEmpty());
		System.out.println(c.size()); 							//获取元素的个数
		System.out.println(c);
	}



集合的遍历之集合转数组遍历


Collection coll = new ArrayList();
			coll.add(new Student("张三",23));		//Object obj = new Student("张三",23);
			coll.add(new Student("李四",24));
			coll.add(new Student("王五",25));
			coll.add(new Student("赵六",26));
			
			Object[] arr = coll.toArray();				//将集合转换成数组
			for (int i = 0; i < arr.length; i++) {
				Student s = (Student)arr[i];			//强转成Student
				System.out.println(s.getName() + "," + s.getAge());
			}
boolean addAll(Collection c)		//将一个集合添加到另一个集合中
		boolean removeAll(Collection c)		//移除一个集合;删除的是两个集合交集;
		boolean containsAll(Collection c)	//一个集合是否包含另一个集合;这种包含是判断是否包含另个集合中的元素;判断的是元素是否包含
		boolean retainAll(Collection c)		//取交集,如果取得交集赋值给调用的集合,如果没有交集则也会赋值给调用者,返回true,如果调用的集合被赋值后和原来的不变就返回false



迭代器:


* 迭代器的使用
		
			Collection c = new ArrayList();
			c.add("a");
			c.add("b");
			c.add("c");
			c.add("d");
			
			Iterator it = c.iterator();						//获取迭代器的引用
			while(it.hasNext()) {							//集合中的迭代方法(遍历)
				System.out.println(it.next());
			}

迭代器原理

迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可 。



4.List结合接口


List集合的特有功能概述
* void add(int index,E element)//在指定位置添加元素;使用不存的位置时会出异常;
* E remove(int index)//通过索引删除元素;
* E get(int index)//根据索引获取元素;
* E set(int index,E element)//根据索引修改元素;



需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。


List list = new ArrayList();
			list.add("a");
			list.add("b");
			list.add("world");
			list.add("d");
			list.add("e");
			
			/*Iterator it = list.iterator();
			while(it.hasNext()) {
				String str = (String)it.next();
				if(str.equals("world")) {
					list.add("javaee");			//这里会抛出ConcurrentModificationException并发修改异常
				}
			}*/


 C:解决方案

    * a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)

    * b:集合遍历元素,集合修改元素


ListIterator lit = list.listIterator();		//如果想在遍历的过程中添加元素,可以用ListIterator中的add方法
			while(lit.hasNext()) {
				String str = (String)lit.next();
				if(str.equals("world")) {
					lit.add("javaee");	
					//list.add("javaee");
				}
			}


(ListIterator)中的方法:
* boolean hasNext() //是否有下一个
* boolean hasPrevious()  //是否有前一个
* Object next() //返回下一个元素
* Object previous(); //返回上一个元素




在List有三个子类:ArrayList,Vector和LinkedList,前两者是通过数组的实现的,后者是通过链表结构实现的;Vector已经基本上不用了,被ArrayList取代了;有一个工具类可以将ArrayList变成线程安全的;



数组:查询,修改速度快;增加和删除慢;(通过索引直接找值;增删会重新创建数组,所以慢)


链表:查询,修改慢,增加和删除快;(一个元素保存了前后的元素的索引,当查询的时候从头开始查;增删的是时候打开链子,保存前后索引就可以了,所以快);在LinkedList中有个get(index),这种看似直接取值的,其实内部原理是折半查找;



List的三个子类的特点:
ArrayList:底层数据结构是数组,查询快,增删慢。  线程不安全,效率高。
Vector:底层数据结构是数组,查询快,增删慢。 线程安全,效率低。
LinkedList:底层数据结构是链表,查询慢,增删快。 线程不安全,效率高。