zoukankan      html  css  js  c++  java
  • 集合

    集合

    数组的长度是固定的, 当添加的元素超过了数组长度时,需要对数组重新定义, 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
    栈和队列数据结构

    ​ 先进后出

    队列

    ​ 先进先出

  • 相关阅读:
    CLR执行模式之程序集代码的执行
    CLR执行模式之托管代码程序集浅析
    第十章 使用变量的一般事项
    第九章伪代码编程过程 The PseudoCode Programming Process
    第八章防御式编程(代码大全读后)
    第七章实战高质量的子程序(代码大全第七章读后)
    一时看不明白大神的想法
    debain9 debian8 alpine 3.7 aliyun
    elk7
    ansible
  • 原文地址:https://www.cnblogs.com/mephisto03/p/9461579.html
Copyright © 2011-2022 走看看