集合

集合

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

数组和集合的区别
  • 区别一:

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

    • 数组长度是固定的,不能自动增长
    • 集合的长度是可变的
graph TD A(Collection 单列集合的根接口) A --> B(List 有序存取的顺序一致,有索引可以存储重复) A --> C(Set 无序存取顺序不一致,无索引不可以存储重复) B --> E1(ArrayList 数组实现) B --> E2(LinkedList 链表实现) B --> E3(Vector 数组实现) C --> F1(HashSet 哈希算法) C --> F2(TreeSet 二叉树算法)
import java.util.ArrayList;
import java.util.Collection;
import com.mephisto.bean.Student;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class DemoCollection2 {
	/*
	 * add 方法如果是List集合一直都返回true,因为List集合可以存储重复元素的
	 * 如果是Set集合,当有重复元素时, 返回false
	 * 
	 * ArrayList的父类的父类重写了toString方法()
	 */
	
	
	
	public static void main(String[] args) {
		demo1();
		
		Collection collection = new ArrayList();
		collection.add("a");
		collection.add("b");
		
		// collection.remove("a");   // 删除集合中的元素
		// collection.clear();		//  清空集合
		System.out.println(collection.contains("b")); // 判断是否包含
		System.out.println(collection.isEmpty());    // 判断是否空
		System.out.println(collection.size()); 		// 获取元素的个数
		System.out.println(collection.toString());	
	}
	private static void demo1() {
		// 父类引用指向子类对象
		Collection collection = new ArrayList(); 
		boolean b1 = collection.add("Mephisto");
		boolean b2 = collection.add(2);
		boolean b3 = collection.add(true);
		boolean b4 = collection.add(new Student("张三",18));
		boolean b5 = collection.add("abc");
		System.out.println(b1);
		System.out.println(b2);
		System.out.println(b3);
		System.out.println(b4);
		System.out.println(b5);
		/*
		 public String toString() {
		        Iterator<E> it = iterator();
		        if (! it.hasNext())
		            return "[]";
		
		        StringBuilder sb = new StringBuilder();
		        sb.append('[');
		        for (;;) {
		            E e = it.next();
		            sb.append(e == this ? "(this Collection)" : e);
		            if (! it.hasNext())
		                return sb.append(']').toString();
		            sb.append(',').append(' ');
		        }
			}
		 */	
		System.out.println(collection.toString());
	}	
}
import java.util.ArrayList;
import java.util.Collection;
import com.mephisto.bean.Student;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class Demo3 {
	public static void main(String[] args) {
		// demo1();
		// demo2();
		// demo3();	
		// demo4();
		// demo5();
		Collection c1 = new ArrayList();
		c1.add("a");
		c1.add("b");
		c1.add("c");
		c1.add("d");
		
		Collection c2 = new ArrayList();
//		c2.add("a");
//		c2.add("b");
		c2.add("c");
		c2.add("d");
		c2.add("e");
		// 取交集, 如果调用的集合改变就返回true, 如果调用的集合不改变就改变false
		boolean b = c1.retainAll(c2);
		System.out.println(b);
		System.out.println(c1);
		
	}

	private static void demo5() {
		Collection c1 = new ArrayList();
		c1.add("a");
		c1.add("b");
		c1.add("c");
		c1.add("d");
		
		Collection c2 = new ArrayList();
		c2.add("a");
		c2.add("b");
		
		// 判断是否包含
		boolean b = c1.containsAll(c2);
		System.out.println(b);
	}

	private static void demo4() {
		Collection c1 = new ArrayList();
		c1.add("a");
		c1.add("b");
		c1.add("c");
		c1.add("d");
		
		Collection c2 = new ArrayList();
		c2.add("a");
		c2.add("b");

		// 删除交集
		boolean b = c1.removeAll(c2);		
		
		// 如果没有交集不删, 返回false
		System.out.println(b);				
		System.out.println(c1);
	}

	private static void demo3() {
		Collection c1 = new ArrayList();
		c1.add("a");
		c1.add("b");
		c1.add("c");
		c1.add("d");
		
		Collection c2 = new ArrayList();
		c2.add("a");
		c2.add("b");
		c2.add("c");
		c2.add("d");
		
		
		// 将c2中的元素添加到c1中
		// c1.addAll(c2);   
		
		// 蒋c2集合添加到c1中
		c1.add(c2);			
		System.out.println(c1);
	}


	private static void demo2() {
		Collection collection = new ArrayList<>();
		collection.add(new Student("张三",18));
		collection.add(new Student("李四",20));
		collection.add(new Student("王五",13));
		
		Object [] arr = collection.toArray();
		for (int i = 0; i < arr.length; i++) {
			// 向下转型
			Student student = (Student)arr[i];		
			System.out.println(student.getName() + "  " + student.getAge());
		}
	}

	
	private static void demo1() {
		Collection collection = new ArrayList<>();
		collection.add("a");
		collection.add("b");
		collection.add("c");
		collection.add("d");
		
		// 将集合转换成数组
		Object [] arr = collection.toArray();
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
}
迭代器

迭代器 === 遍历

迭代器原理

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

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import com.mephisto.bean.Student;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class demo4 {

	public static void main(String[] args) {
		// demo();
		Collection collection = new ArrayList();
		collection.add(new Student("张三",19));
		collection.add(new Student("李四",10));
		collection.add(new Student("王五",23));

		Iterator iterator = collection.iterator();
		while (iterator.hasNext()) {
			Student s = (Student) iterator.next();
			System.out.println(s.getName() + "  " + s.getAge());
		}
	}

	private static void demo() {
		Collection collection = new ArrayList();
		collection.add("a");
		collection.add("b");
		collection.add("c");
		collection.add("d");
		
		
		// 对集合中的元素迭代
		Iterator iterator = collection.iterator();
		
		/*
		// 判断集合中是否有元素, 有就返回true
		boolean b1 = iterator.hasNext();
		Object object1 = iterator.next();
		System.out.println(b1);
		System.out.println(object1);
		
		
		boolean b2 = iterator.hasNext();
		Object object2 = iterator.next();
		System.out.println(b2);
		System.out.println(object2);
		*/
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
	}
}

List
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Demo1 {

	public static void main(String[] args) {
		// demo1();
		// demo2();
		// demo3();
		List list = new ArrayList();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		
		list.set(1, "e");
		System.out.println(list);
	}
	private static void demo3() {
		List list= new ArrayList();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		
//		Object obj = list.get(1);
//		System.out.println(obj);
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		Iterator iterator = list.iterator();
		while(iterator.hasNext())
			System.out.println(iterator.next());
	}

	private static void demo2() {
		List list = new ArrayList();
		
		list.add("a");
		list.add("b");
		list.add("c");
		list.add(111);
		// 删除的时候不会自动装箱 java.lang.IndexOutOfBoundsException  
		// 把111当做索引
		list.remove(111);  
		System.out.println(list);
	}

	private static void demo1() {
		List list = new ArrayList();
		
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		list.add(4,"e");   // index <= size  都不会报错
		// list.add(10,"z");		//  当存储的使用的索引不存在时 java.lang.IndexOutOfBoundsException 
		
		Object obj1 = list.remove(1);   // 通过索引删除元素, 将被删除的元素返回
		System.out.println(obj1);
		
		System.out.println(list);
	}
}

并发修改
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Demo2 {
	public static void main(String[] args) {
		List list = new ArrayList();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("mephisto");
		list.add("e");
		
		/*
		Iterator iterator = list.iterator();
		while(iterator.hasNext()) {
			String string = (String)iterator.next();
			if("mephisto".equals(string)) {
				// 遍历的同时在修改增加元素,并发修改异常 java.util.ConcurrentModificationException
				list.add("lee");
			}
		}
		*/
		
		ListIterator iterator = list.listIterator();
		while(iterator.hasNext()) {
			String string = (String)iterator.next();
			if("mephisto".equals(string))
				iterator.add("lee");		
		}
		System.out.println(list);
	}
}
Vector类
Vertor的迭代
import java.util.Enumeration;
import java.util.Vector;

public class Demo5 {

	public static void main(String[] args) {
		Vector vector = new Vector();
		vector.addElement("a");
		vector.addElement("b");
		vector.addElement("c");
		vector.addElement("d");
		
		Enumeration enumeration = vector.elements(); // 获取枚举
		while (enumeration.hasMoreElements()) {
			System.out.println(enumeration.nextElement());	
		}
	}
}
集合框架
  • 数组
    • 查询快,修改也快
    • 增删慢
  • 链表
    • 查询慢,修改也慢
    • 增删快
List三个子类的特点
  • ArrayList:
    • 底层数据结构是数组查询快,增删慢
    • 线程不安全, 效率高
  • Vector:
    • 底层数据结构是数组,查询快,增删慢
    • 线程安全, 效率低
  • Vector相对ArrayList查询慢(线程安全)
  • Vector相对于LinkedList增删慢(数据结构)
  • LinkedList:
    • 底层数据结构是链表,查询慢,增删快
    • 线程不安全,效率高
  • Vector和ArrayList区别
    • Vector是线程安全的, 效率低
    • ArrayList是线程不安全的
    • 都是数组实现的
  • ArrayList和LinkedList区别
    • ArrayList底层数据是数组, 查询和修改快
    • Linkedlist底层是数据结构,增删比较快,查询修改慢
    • 都是线程不安全的
  • 使用
    • 查询多使用ArrayList
    • 增删多使用LinkedList
    • 查询增删都多使用ArrayList
栈和队列数据结构

​ 先进后出

队列

​ 先进先出

posted @ 2018-08-11 23:26  无聊的子木君  阅读(168)  评论(0编辑  收藏  举报