Java中集合框架
一、集合的概念
- 概念:集合是一种容器,用于存储多个对象(集合中只能存储对象)
- 集合的分类:Collection和Map
二、Collection集合
- 概念:Collection是单列集合,用于存储对象类型的数据
- Collection中的常用方法:
- add方法:
- 声明:boolean add(Object o)
- 作用:向集合中添加一个对象
- addAll方法:
- 声明:boolean addAll(Collection c)
- 作用:将传入的c集合中所有的元素存入集合中
- clear方法:
- 声明:void clear()
- 作用:清空集合中所有的元素
- contains方法:
- 声明:boolean contains(Object o)
- 作用:判断集合中是否包含o元素
- remove方法:
- 声明:boolean remove(Object o)
- 作用:从集合中删除o元素,返回值表示删除是否成功
- .size方法:
- 声明:int size()
- 作用:返回此集合中的元素数
- toArray方法:
- 声明:Object[] toArray()
- 作用:将集合转换为数组
- add方法:
三、List接口
-
List接口是Collection的子接口
-
List的基本特点:元素有顺序,有下标,元素可以重复
-
List的特有方法:
- add方法:
- 声明:void add(int index,Object o)
- 作用:在指定下标位置添加元素
- 注意:添加的下标值必须小于等于集合现有元素数
- get方法:
- 声明:Object get(int index)
- 作用:返回下标位置的元素
- indexOf方法:
- 声明:int indexOf(Object o)
- 作用:返回元素在集合中的下标,如果没有该元素,返回-1
- remove方法:
- 声明:Object remove(int index)
- 作用:删除下表位置的元素,并且将被移除的元素返回
- set方法:
- 声明:Object set(int index, Object o)
- 作用:将指定下标位置的对象替换,并将被替换的元素返回
- add方法:
-
List的遍历方式
-
下标遍历
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)); } } }
-
迭代器遍历
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); } } }
-
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); } } }
-
自遍历
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)); } }
-
-
List的实现类:
- ArrayList:利用数组实现,查询效率高,元素插入和删除效率低,线程不安全,并发效率高(JDK1.2)
- LinkedList:利用链表实现,查询效率低,元素插入和删除效率高,线程不安全,并发效率高(JDK1.2)
- Vector:利用数组实现,线程安全,并发效率低(JDK1.0)
-
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 + "]"; } }
四、泛型
-
作用:
- 确定集合存储对象的类型
- 在使用集合的时候不必确认和强制类型转换
- 集合的类型安全
-
泛型语法:
-
集合中的泛型,要求前后完全一致,并且没有多态
-
泛型方法
public <T> void m1(T t) {}//泛型应用在参数列表 public <T> T m1() {return null;}//泛型应用在返回值类型
-
泛型接口
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;} }
-
泛型的通配符
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接口
-
Set接口是Collection的子接口
-
Set的基本特点:元素无下标,元素的内容不能重复, 元素内容唯一
-
Set的特有方法:没有
-
Set的遍历方式:
-
迭代器遍历:
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); } } }
-
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); } } }
-
自遍历:
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)); } }
-
-
Set的实现类:
- HashSet:元素无序,无下标,不能重复
- LinkedHashSet:HashSet的子类,维护元素进入集合的顺序
- TreeSet:SortedSet接口(Set的子接口)的实现类,自动对元素进行排序,如果是自定义类型,需要提供比较规则
-
自定义对象的不重复性:通过覆盖hashCode()方法和equals()方法
-
覆盖hashCode()方法的原则:
- 必须保证相同的元素返回相同的哈希值
- 尽量保证不同的元素返回不同的哈希值
-
覆盖equals()方法的原则:
保证内容相同的元素返回true
-
六、Map集合
-
概念:Map是双列集合,使用键值对的方式存储元素,键不可重复
-
Map中的常用方法:
- put方法:
- 声明:V put(K key,V value)
- 作用:将键值对存入集合,并且将被替换的元素返回,如果没有替换,返回null
- get方法:
- 声明:V get(Object key)
- 作用:通过key查询value,如果key不存在,返回null
- size方法:
- 声明:int size()
- 作用:返回集合中元素的数量
- remove方法:
- 声明:V remove(Object key)
- 作用:用过key移除键值对
- containsKey方法:
- 声明:boolean containsKey(Object key)
- 作用:检查集合中是否包含该key
- containsValue方法:
- 声明:boolean containsValue(Object value)
- 作用:检查集合中是否包含该value
- clear方法:
- 声明:void clear()
- 作用:清空集合
- isEmpty方法:
- 声明:boolean isEmpty()
- 作用:检查集合内是否没有键值对
- 注意:集合为null和集合isEmpty为true是不同的
- put方法:
-
Map的遍历方式:
-
键遍历:
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); } } }
-
值遍历:
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); } } }
-
键值对遍历:
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); } } }
-
自遍历:
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)); } }
-
-
Map的实现类:
- HashMap:线程不安全,并发效率高,允许使用null作为键和值(JDK1.2)
- Hashtable:线程安全,并发效率低,不允许使用null作为键和值,(JDK1.0)
- Properties:Hashtable的子类,只允许String类型的键和值,通常用于读取配置文件
- TreeMap:可以对键进行排序(SortedMap接口的实现类,Map的子接口)
- LinkedHashMap:可以维护键值对添加到集合的顺序