集合

Java中集合框架

一、集合的概念

  1. 概念:集合是一种容器,用于存储多个对象(集合中只能存储对象)
  2. 集合的分类:Collection和Map

二、Collection集合

  1. 概念:Collection是单列集合,用于存储对象类型的数据
  2. Collection中的常用方法:
    1. add方法:
      1. 声明:boolean add(Object o)
      2. 作用:向集合中添加一个对象
    2. addAll方法:
      1. 声明:boolean addAll(Collection c)
      2. 作用:将传入的c集合中所有的元素存入集合中
    3. clear方法:
      1. 声明:void clear()
      2. 作用:清空集合中所有的元素
    4. contains方法:
      1. 声明:boolean contains(Object o)
      2. 作用:判断集合中是否包含o元素
    5. remove方法:
      1. 声明:boolean remove(Object o)
      2. 作用:从集合中删除o元素,返回值表示删除是否成功
    6. .size方法:
      1. 声明:int size()
      2. 作用:返回此集合中的元素数
    7. toArray方法:
      1. 声明:Object[] toArray()
      2. 作用:将集合转换为数组

三、List接口

  1. List接口是Collection的子接口

  2. List的基本特点:元素有顺序,有下标,元素可以重复

  3. List的特有方法:

    1. add方法:
      1. 声明:void add(int index,Object o)
      2. 作用:在指定下标位置添加元素
      3. 注意:添加的下标值必须小于等于集合现有元素数
    2. get方法:
      1. 声明:Object get(int index)
      2. 作用:返回下标位置的元素
    3. indexOf方法:
      1. 声明:int indexOf(Object o)
      2. 作用:返回元素在集合中的下标,如果没有该元素,返回-1
    4. remove方法:
      1. 声明:Object remove(int index)
      2. 作用:删除下表位置的元素,并且将被移除的元素返回
    5. set方法:
      1. 声明:Object set(int index, Object o)
      2. 作用:将指定下标位置的对象替换,并将被替换的元素返回
  4. List的遍历方式

    1. 下标遍历

      package com.baizhi.testCollection;
      
      import java.util.ArrayList;
      import java.util.List;
      
      public class TestCollection {
      	public static void main(String[] args) {
      		List list = new ArrayList();
      		for (int i = 0; i < list.size(); i++) {
      			System.out.println(list.get(i));
      		}
      	}
      }
      
    2. 迭代器遍历

      package com.baizhi.testCollection;
      
      import java.util.ArrayList;
      import java.util.Iterator;
      import java.util.List;
      
      public class TestCollection {
      	public static void main(String[] args) {
      		List list = new ArrayList();
      		//获取迭代器
      		Iterator it = list.iterator();
      		//迭代器遍历
      		while(it.hasNext()) {//hasNext 判断指针下是否还有元素
      			Object o = it.next();//获取当前指针的元素
      			System.out.println(o);
      		}
      	}
      }
      
    3. for-each遍历

      package com.baizhi.testCollection;
      
      import java.util.ArrayList;
      import java.util.Iterator;
      import java.util.List;
      
      public class TestCollection {
      	public static void main(String[] args) {
      		List list = new ArrayList();
      		for (Object o : list) {
      			System.out.println(o);
      		}
      	}
      }
      
    4. 自遍历

      package com.baizhi.testCollection;
      
      import java.util.ArrayList;
      import java.util.List;
      import java.util.function.Consumer;
      
      public class TestCollection {
      	public static void main(String[] args) {
      		List list = new ArrayList();
      		//匿名内部类的写法
      		list.forEach(new Consumer() {
      			@Override
      			public void accept(Object o) {
      				System.out.println(o);
      			}
      		});
      		//配合Lambda表达式的写法
      		list.forEach(o -> System.out.println(o));
      	}
      }
      
  5. List的实现类:

    1. ArrayList:利用数组实现,查询效率高,元素插入和删除效率低,线程不安全,并发效率高(JDK1.2)
    2. LinkedList:利用链表实现,查询效率低,元素插入和删除效率高,线程不安全,并发效率高(JDK1.2)
    3. Vector:利用数组实现,线程安全,并发效率低(JDK1.0)
  6. List的排序:

    使用List的sort方法,需要传入一个比较器对象

    package com.baizhi.test;
    
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    
    public class TestListSort {
    	public static void main(String[] args) {
    		List<Person> list = new ArrayList<>();
    		list.add(new Person("zhangs", 30));
    		list.add(new Person("guox", 31));
    		list.add(new Person("liuh", 18));
    //		sort方法需要一个比较器作为参数
    		Comparator<Person> c = new Comparator<Person>() {
    			@Override
    			public int compare(Person o1, Person o2) {
    //				先根据姓名排序,如果姓名一致根据年龄排序
    				int temp = o1.name.compareTo(o2.name);
    				if(temp == 0) 
    					return o1.age - o2.age;
    				return temp;
    			}
    		};
    //		传入比较器
    		list.sort(c);
    //		对结果进行遍历
    		list.forEach(a -> System.out.println(a));
    	}
    	
    }
    class Person {
    	public String name;
    	public int age;
    	public Person(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", age=" + age + "]";
    	}
    	
    }
    

四、泛型

  1. 作用:

    1. 确定集合存储对象的类型
    2. 在使用集合的时候不必确认和强制类型转换
    3. 集合的类型安全
  2. 泛型语法:

    1. 集合中的泛型,要求前后完全一致,并且没有多态

    2. 泛型方法

      public <T> void m1(T t) {}//泛型应用在参数列表
      public <T> T m1() {return null;}//泛型应用在返回值类型
      
    3. 泛型接口

    interface Test{//约定在本接口中出现的都是这个类型
    public void m1(T t);
    public T m1();
    }

    
    4. 泛型类
    
    ~~~java
    class Test<T>{//约定在本类中出现的都是这个类型
    	public void m1(T t) {}
    	public T m1() {return null;}
    }
    
    1. 泛型的通配符

      interface Test{
      //	根据实参的类型确定集合的泛型
      	public void m1(List<?> list);
      //	要求传入实参的泛型必须是Animal或者Animal的子类
      	public void m2(List<? extends Animal> list);
      //	要求传入实参的泛型必须是Animal或者Animal的父类
      	public void m3(List<? super Animal> list);
      }
      

五、Set接口

  1. Set接口是Collection的子接口

  2. Set的基本特点:元素无下标,元素的内容不能重复, 元素内容唯一

  3. Set的特有方法:没有

  4. Set的遍历方式:

    1. 迭代器遍历:

      package com.baizhi.testCollection;
      
      import java.util.HashSet;
      import java.util.Iterator;
      import java.util.Set;
      
      public class TestCollection {
      	public static void main(String[] args) {
      		Set<String> set = new HashSet<>();
      		Iterator<String> it = set.iterator();
      		while(it.hasNext()) {
      			String s = it.next();
      			System.out.println(s);
      		}
      	}
      }
      
    2. for-each遍历:

      package com.baizhi.testCollection;
      
      import java.util.HashSet;
      import java.util.Set;
      
      public class TestCollection {
      	public static void main(String[] args) {
      		Set<String> set = new HashSet<>();
      		for (String s : set) {
      			System.out.println(s);
      		}
      	}
      }
      
    3. 自遍历:

      package com.baizhi.testCollection;
      
      import java.util.HashSet;
      import java.util.Set;
      import java.util.function.Consumer;
      
      public class TestCollection {
      	public static void main(String[] args) {
      		Set<String> set = new HashSet<>();
      //		匿名内部类的写法
      		set.forEach(new Consumer<String>() {
      			@Override
      			public void accept(String s) {
      				System.out.println(s);
      			}
      		});
      //		配合Lambda表达式的写法
      		set.forEach(s -> System.out.println(s));
      	}
      }
      
      
  5. Set的实现类:

    1. HashSet:元素无序,无下标,不能重复
    2. LinkedHashSet:HashSet的子类,维护元素进入集合的顺序
    3. TreeSet:SortedSet接口(Set的子接口)的实现类,自动对元素进行排序,如果是自定义类型,需要提供比较规则
  6. 自定义对象的不重复性:通过覆盖hashCode()方法和equals()方法

    1. 覆盖hashCode()方法的原则:

      1. 必须保证相同的元素返回相同的哈希值
      2. 尽量保证不同的元素返回不同的哈希值
    2. 覆盖equals()方法的原则:

      保证内容相同的元素返回true

六、Map集合

  1. 概念:Map是双列集合,使用键值对的方式存储元素,键不可重复

  2. Map中的常用方法:

    1. put方法:
      1. 声明:V put(K key,V value)
      2. 作用:将键值对存入集合,并且将被替换的元素返回,如果没有替换,返回null
    2. get方法:
      1. 声明:V get(Object key)
      2. 作用:通过key查询value,如果key不存在,返回null
    3. size方法:
      1. 声明:int size()
      2. 作用:返回集合中元素的数量
    4. remove方法:
      1. 声明:V remove(Object key)
      2. 作用:用过key移除键值对
    5. containsKey方法:
      1. 声明:boolean containsKey(Object key)
      2. 作用:检查集合中是否包含该key
    6. containsValue方法:
      1. 声明:boolean containsValue(Object value)
      2. 作用:检查集合中是否包含该value
    7. clear方法:
      1. 声明:void clear()
      2. 作用:清空集合
    8. isEmpty方法:
      1. 声明:boolean isEmpty()
      2. 作用:检查集合内是否没有键值对
      3. 注意:集合为null和集合isEmpty为true是不同的
  3. Map的遍历方式:

    1. 键遍历:

      package com.baizhi.testMap;
      
      import java.util.HashMap;
      import java.util.Map;
      import java.util.Set;
      
      public class TestMap {
      	public static void main(String[] args) {
      		Map<String,String> map = new HashMap<String, String>();
      		
      		Set<String> keys = map.keySet();
      		for (String key : keys) {
      			String value = map.get(key);
      			System.out.println("key:"+key+"  value:"+value);
      		}
      	}
      }
      
    2. 值遍历:

      package com.baizhi.testMap;
      
      import java.util.Collection;
      import java.util.HashMap;
      import java.util.Map;
      
      public class TestMap {
      	public static void main(String[] args) {
      		Map<String,String> map = new HashMap<String, String>();
      		
      		Collection<String> values = map.values();
      		for (String value : values) {
      			System.out.println("value:"+value);
      		}
      	}
      }
      
    3. 键值对遍历:

      package com.baizhi.testMap;
      
      import java.util.HashMap;
      import java.util.Map;
      import java.util.Map.Entry;
      import java.util.Set;
      
      public class TestMap {
      	public static void main(String[] args) {
      		Map<String,String> map = new HashMap<String, String>();
      //		获取所有的Entry对象 -- 通过entrySet方法 -- 该方法返回所有Entry对象的Set集合	
      		Set<Entry<String, String>> es = map.entrySet();
      //		遍历set集合,获取所有的Entry对象
      		for (Entry<String, String> e : es) {
      //			从Entry对象中获取key和value的数据
      			String key = e.getKey();
      			String value = e.getValue();
      			System.out.println("key:"+key+"  value:"+value);
      		}
      	}
      }
      
    4. 自遍历:

      package com.baizhi.testMap;
      
      import java.util.HashMap;
      import java.util.Map;
      import java.util.function.BiConsumer;
      
      public class TestMap {
      	public static void main(String[] args) {
      		Map<String,String> map = new HashMap<String, String>();
      //		使用匿名内部类的方式
      		map.forEach(new BiConsumer<String, String>() {
      			@Override
      			public void accept(String key, String value) {
      				System.out.println("key:"+key+"  value:"+value);				
      			}
      		});
      //		配合Lambda表达式
      		map.forEach((key,value) -> 
      			System.out.println("key:"+key+"  value:"+value));
      	}
      }
      
  4. Map的实现类:

    1. HashMap:线程不安全,并发效率高,允许使用null作为键和值(JDK1.2)
    2. Hashtable:线程安全,并发效率低,不允许使用null作为键和值,(JDK1.0)
    3. Properties:Hashtable的子类,只允许String类型的键和值,通常用于读取配置文件
    4. TreeMap:可以对键进行排序(SortedMap接口的实现类,Map的子接口)
    5. LinkedHashMap:可以维护键值对添加到集合的顺序
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值