集合

1. Collection接口

Collection接口是集合的父接口。

1.1 List接口

List接口中存储一组有序的,可以重复的元素。

1.1.1 ArrayList

常用方法

  1. package com.qfedu.test1;
  2. import java.util.ArrayList;
  3. import java.util.InputMismatchException;
  4. /**
  5. * Collection
  6. * List
  7. * ArrayList类常用方法
  8. * @author WHD
  9. *
  10. */
  11. public class Test1 {
  12. public static void main(String[] args) {
  13. ArrayList list = new ArrayList();
  14. list.add(10);
  15. list.add(3.5);
  16. list.add('a');
  17. list.add("hello");
  18. list.add(false);
  19. ArrayList<Integer> list1 = new ArrayList<Integer>();
  20. list1.add(20);
  21. list1.add(35);
  22. list1.add(30);
  23. list1.add(55);
  24. list1.add(60);
  25. System.out.println(list1.size());
  26. System.out.println(list1.remove(0));
  27. System.out.println(list1.size());
  28. list1.set(0, 666);
  29. System.out.println(list1.get(0));
  30. System.out.println(list1.isEmpty());
  31. list1.clear();
  32. System.out.println(list1.isEmpty());
  33. ArrayList<Student> list2 = new ArrayList<Student>();
  34. Student stu1 = new Student("赵四", 20);
  35. list2.add(stu1);
  36. list2.add(new Student("赵四", 20));
  37. list2.add(new Student("赵四", 20));
  38. list2.add(new Student("赵四", 20));
  39. list2.add(new Student("赵四", 20));
  40. list2.add(new Student("赵四", 20));
  41. list2.remove(stu1);
  42. System.out.println(list2.size());
  43. }
  44. }

遍历

  1. package com.qfedu.test2;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. /**
  5. * ArrayList集合遍历方式
  6. * 1.普通for循环
  7. * 2.迭代器遍历
  8. * 3.增强for循环
  9. * @author WHD
  10. *
  11. */
  12. public class Test1 {
  13. public static void main(String[] args) {
  14. ArrayList<Integer> list = new ArrayList<Integer>();
  15. for (int i = 0; i < 200000; i++) {
  16. list.add(i);
  17. }
  18. // 方式1 普通for循环
  19. long beginTime = System.currentTimeMillis();
  20. for(int i = 0; i < list.size();i++) {
  21. System.out.println(list.get(i));
  22. }
  23. long endTime = System.currentTimeMillis();
  24. System.out.println("普通for循环耗时" + (endTime - beginTime));
  25. // 方式2 迭代器遍历
  26. beginTime = System.currentTimeMillis();
  27. Iterator<Integer> it = list.iterator();
  28. while(it.hasNext()) {
  29. System.out.println(it.next());
  30. }
  31. endTime = System.currentTimeMillis();
  32. System.out.println("迭代器耗时" + (endTime - beginTime));
  33. // 方式3 增强for循环 底层实现依然还是迭代器 是JDK1.5新增的写法
  34. beginTime = System.currentTimeMillis();
  35. for(Integer i :list) {
  36. System.out.println(i);
  37. }
  38. endTime = System.currentTimeMillis();
  39. System.out.println("增强for循环耗时" + (endTime - beginTime));
  40. }
  41. }

数据结构 ArrayList集合特点和数据结构 底层实现是一个Object数组,有下标,有序,可以为null,可以重复,线程不安全 查询修改快,因为有下标 增删慢,因为需要移动元素

ArrayList集合源代码解读: 1.当我们调用无参构造 初始化一个初始为空的数组 2.当我们第一次添加元素的时候 将数组容量改为10 3.如果长度不够 将扩容为原来的1.5倍

1.1.2 LinkedList

常用方法

  1. package com.qfedu.test4;
  2. import java.util.LinkedList;
  3. /**
  4. * LinkedList 集合常用方法
  5. * @author WHD
  6. */
  7. public class Test1 {
  8. public static void main(String[] args) {
  9. LinkedList<String> list = new LinkedList<String>();
  10. list.add("a");
  11. list.addFirst("hello");
  12. list.addLast("world");
  13. System.out.println(list.remove(0));
  14. System.out.println(list.size());
  15. System.out.println(list.removeFirst());
  16. System.out.println(list.removeLast());
  17. System.out.println(list.size());
  18. list.add("ABC");
  19. list.add("DEF");
  20. list.set(0, "abc");
  21. System.out.println(list.get(0));
  22. System.out.println(list.getLast());
  23. System.out.println(list.isEmpty());
  24. list.clear();
  25. System.out.println(list.isEmpty());
  26. }
  27. }

遍历方式

  1. package com.qfedu.test5;
  2. import java.util.Iterator;
  3. import java.util.LinkedList;
  4. /**
  5. * LinkedList 三种遍历方式
  6. * 1.普通for循环
  7. * 2.迭代器
  8. * 3.增强for循环
  9. *
  10. * LinkedList数据结构
  11. * 双向链表,没有初始大小,不需要扩容,没有个数上限,有序(插入顺序),可以为null,可以重复,线程不安全
  12. * 查询,修改慢,因为没有下标,我们根据某个序号查找元素必须先找到与之相邻的元素,以此类推
  13. * 删除,添加块,因为不需要移动元素,只需要改变新的指针即可
  14. * @author WHD
  15. *
  16. */
  17. public class Test1 {
  18. public static void main(String[] args) {
  19. LinkedList<Integer> list = new LinkedList<Integer>();
  20. for (int i = 0; i < 200000; i++) {
  21. list.add(i);
  22. }
  23. // 方式1 普通for循环
  24. // long begin = System.currentTimeMillis();
  25. // for(int i= 0;i < list.size();i++) {
  26. // System.out.println(list.get(i));
  27. // }
  28. //
  29. // long end = System.currentTimeMillis();
  30. // System.out.println("普通for循环耗时" + (end - begin));
  31. // 方式2 迭代器遍历
  32. long begin = System.currentTimeMillis();
  33. Iterator<Integer> iterator = list.iterator();
  34. while(iterator.hasNext()) {
  35. System.out.println(iterator.next());
  36. }
  37. long end = System.currentTimeMillis();
  38. System.out.println("迭代器耗时" + (end - begin));
  39. // 方式3 增强for循环
  40. begin = System.currentTimeMillis();
  41. for(Integer i : list) {
  42. System.out.println(i);
  43. }
  44. end = System.currentTimeMillis();
  45. System.out.println("增强for循环耗时" + (end - begin));
  46. }
  47. }

数据结构 LinkedList数据结构 双向链表,没有初始大小,不需要扩容,没有个数上限,有序(插入顺序),可以为null,可以重复,线程不安全 查询,修改慢,因为没有下标,我们根据某个序号查找元素必须先找到与之相邻的元素,以此类推 删除,添加块,因为不需要移动元素,只需要改变新的指针即可

1.1.3 Vector

ArrayList与Vector的区别? ArrayList线程不安全 Vector线程安全 ArrayList初始为0 Vector初始为10 扩容1.5倍 扩容2倍

  1. package com.qfedu.test5;
  2. import java.util.Vector;
  3. /**
  4. * ArrayList与Vector的区别?
  5. * ArrayList线程不安全 Vector线程安全
  6. * ArrayList初始为0 Vector初始为10
  7. * 扩容1.5倍 扩容2倍
  8. * @author WHD
  9. *
  10. */
  11. public class TestVector {
  12. public static void main(String[] args) {
  13. Vector<String> v = new Vector<String>();
  14. v.add("a");
  15. v.add("b");
  16. v.add("c");
  17. v.add("d");
  18. v.remove(1);
  19. v.set(0, "hello");
  20. System.out.println(v.get(0));
  21. System.out.println(v.size());
  22. v.clear();
  23. System.out.println(v.isEmpty());
  24. // 遍历的方式三种 普通for 迭代器 增强for
  25. }
  26. }

1.2 Set接口

Set接口存储一组唯一,无序的对象,不允许两个对象equals方法比较为true,并且hashCode相同

1.2.1 HashSet

HashSet 特点 :无序 不能重复 去除重复的原理 两个对象equals比较为true 并且hashCode相同 底层是由一个HashMap维护的

  1. package com.qfedu.test4;
  2. import java.util.HashSet;
  3. import java.util.Iterator;
  4. /**
  5. * Set接口
  6. * HashSet 特点 :无序 不能重复 去除重复的原理 两个对象equals比较为true 并且hashCode相同
  7. * 底层是有一个HashMap维护的
  8. *
  9. * @author WHD
  10. *
  11. */
  12. public class TestHashSet {
  13. public static void main(String[] args) {
  14. HashSet<String> set = new HashSet<String>();
  15. set.add("a");
  16. set.add("a");
  17. set.add("A");
  18. set.remove("a");
  19. for (String v : set) {
  20. System.out.println(v);
  21. }
  22. Iterator<String> iterator = set.iterator();
  23. while(iterator.hasNext()) {
  24. System.out.println(iterator.next());
  25. }
  26. set.clear();
  27. System.out.println(set.isEmpty());
  28. System.out.println(set.size());
  29. HashSet<Student> stuSet = new HashSet<Student>();
  30. Student stu1 = new Student("赵四", 25);
  31. Student stu2 = new Student("赵四", 25);
  32. Student stu3 = new Student("赵四", 25);
  33. stuSet.add(stu1);
  34. stuSet.add(stu2);
  35. stuSet.add(stu3);
  36. System.out.println(stuSet.size());
  37. }
  38. }
  1. package com.qfedu.test4;
  2. public class Student implements Comparable<Student>{
  3. private String name;
  4. private int age;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public int getAge() {
  12. return age;
  13. }
  14. public void setAge(int age) {
  15. this.age = age;
  16. }
  17. public Student() {
  18. }
  19. public Student(String name, int age) {
  20. this.name = name;
  21. this.age = age;
  22. }
  23. @Override
  24. public String toString() {
  25. return "Student [name=" + name + ", age=" + age + "]";
  26. }
  27. @Override
  28. public int compareTo(Student stu) {
  29. if(this.getAge() > stu.getAge()) {
  30. return 1;
  31. }else if(this.getAge() < stu.getAge() ) {
  32. return -1;
  33. }
  34. return 0;
  35. }
  36. @Override
  37. public boolean equals(Object obj) {
  38. if (this == obj)
  39. return true;
  40. if (obj == null)
  41. return false;
  42. if (getClass() != obj.getClass())
  43. return false;
  44. Student other = (Student) obj;
  45. if (age != other.age)
  46. return false;
  47. if (name == null) {
  48. if (other.name != null)
  49. return false;
  50. } else if (!name.equals(other.name))
  51. return false;
  52. return true;
  53. }
  54. @Override
  55. public int hashCode() {
  56. final int prime = 31;
  57. int result = 1;
  58. result = prime * result + age;
  59. result = prime * result + ((name == null) ? 0 : name.hashCode());
  60. return result;
  61. }
  62. }

1.2.2 TreeSet

TreeSet底层维护的是一个TreeMap 有序的Set集合 比较的顺序 元素必须实现Comparable接口,重写compareTo方法

  1. package com.qfedu.test5;
  2. import java.util.Iterator;
  3. import java.util.TreeSet;
  4. import com.qfedu.test4.Student;
  5. /**
  6. * TreeSet底层维护的是一个TreeMap
  7. * 有序的Set集合 比较的顺序
  8. * @author WHD
  9. *
  10. */
  11. public class TestTreeSet {
  12. public static void main(String[] args) {
  13. TreeSet<String> set = new TreeSet<String>();
  14. set.add("a");
  15. set.add("d");
  16. set.add("f");
  17. set.add("c");
  18. for (String v : set) {
  19. System.out.println(v);
  20. }
  21. Iterator<String> iterator = set.iterator();
  22. while(iterator.hasNext()) {
  23. System.out.println(iterator.next());
  24. }
  25. TreeSet<Student> stuSet = new TreeSet<Student>();
  26. Student stu1 = new Student("赵四1", 26);
  27. Student stu2 = new Student("赵四2", 23);
  28. Student stu3 = new Student("赵四3", 25);
  29. stuSet.add(stu1);
  30. stuSet.add(stu2);
  31. stuSet.add(stu3);
  32. for (Student stu : stuSet) {
  33. System.out.println(stu);
  34. }
  35. }
  36. }

1.2.3 LinkedHashSet

一个基于双向链表的Set集合 有序的 插入顺序

  1. package com.qfedu.test5;
  2. import java.util.Iterator;
  3. import java.util.LinkedHashSet;
  4. /**
  5. * 一个基于双向链表的Set集合 有序的 插入顺序
  6. * @author WHD
  7. *
  8. */
  9. public class TestLinkedHashSet {
  10. public static void main(String[] args) {
  11. LinkedHashSet<Integer> set = new LinkedHashSet<Integer>();
  12. set.add(110);
  13. set.add(11);
  14. set.add(12);
  15. set.add(3);
  16. set.remove(11);
  17. System.out.println(set.size());
  18. // set.clear();
  19. System.out.println(set.isEmpty());
  20. for (Integer i : set) {
  21. System.out.println(i);
  22. }
  23. Iterator<Integer> it = set.iterator();
  24. while(it.hasNext()) {
  25. System.out.println(it.next());
  26. }
  27. }
  28. }

2.Map接口

Map接口存储键值映射的数据

2.1 HashMap

HashMap:无序,键和值可以为null,键不能重复,线程不安全

常用方法

  1. package com.qfedu.test6;
  2. import java.util.HashMap;
  3. /**
  4. * Map接口
  5. * HashMap常用方法
  6. * @author WHD
  7. *
  8. */
  9. public class Test1 {
  10. public static void main(String[] args) {
  11. HashMap<String,String> map = new HashMap<String,String>();
  12. map.put("CN", "中国");
  13. map.put("US", "美国");
  14. map.put("JP", "小日本");
  15. map.put("KR", "棒子");
  16. map.put("ID","阿三");
  17. System.out.println(map.size());
  18. System.out.println(map.remove("JP")); // 删除
  19. System.out.println(map.size()); // 长度
  20. map.put("CN", "中华人民共和国"); // 存放
  21. System.out.println(map.get("CN")); // 获取
  22. map.replace("US", "美国佬");
  23. System.out.println(map.get("US"));
  24. map.clear();
  25. System.out.println( map.isEmpty());
  26. }
  27. }

遍历方式

  1. package com.qfedu.test7;
  2. import java.util.ArrayList;
  3. import java.util.Collection;
  4. import java.util.HashMap;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.Map.Entry;
  8. import java.util.Set;
  9. /**
  10. * HashMap 遍历方式
  11. * 1.获取所有的键
  12. * 2.获取所有的值
  13. * 3.获取所有的键的迭代器
  14. * 4.获取所有的值的迭代器
  15. * 5.获取所有的元素Entry数组
  16. * 6.获取所有的元素的迭代器
  17. * @author WHD
  18. *
  19. */
  20. public class Test1 {
  21. public static void main(String[] args) {
  22. HashMap<String,String> map = new HashMap<String,String>();
  23. map.put("CN", "中国");
  24. map.put("US", "美国");
  25. map.put("JP", "小日本");
  26. map.put("KR", "棒子");
  27. map.put("ID","阿三");
  28. // 1.获取所有的键
  29. Set<String> keySet = map.keySet();
  30. for(String key : keySet) {
  31. System.out.println(key + "\t" + map.get(key) );
  32. }
  33. System.out.println("=====================================");
  34. // 2. 获取所有的值
  35. Collection<String> values = map.values();
  36. for(String v : values) {
  37. System.out.println(v);
  38. }
  39. System.out.println("=====================================");
  40. // 3.获取键的迭代器
  41. Iterator<String> iterator = map.keySet().iterator();
  42. while(iterator.hasNext()) {
  43. String key = iterator.next();
  44. System.out.println(key + "\t" + map.get(key));
  45. }
  46. System.out.println("=====================================");
  47. // 4.获取所有的值的迭代器
  48. Iterator<String> iterator2 = map.values().iterator();
  49. while(iterator2.hasNext()) {
  50. System.out.println(iterator2.next());
  51. }
  52. System.out.println("=====================================");
  53. // 5.获取所有的键值对组合
  54. Set<Entry<String, String>> entrySet = map.entrySet();
  55. for(Entry<String,String> entry : entrySet) {
  56. System.out.println(entry.getKey() + entry.getValue());
  57. }
  58. System.out.println("=====================================");
  59. // 6.所有键值对组合的迭代器
  60. Iterator<Entry<String, String>> iterator3 = map.entrySet().iterator();
  61. while(iterator3.hasNext()) {
  62. Entry<String, String> next = iterator3.next();
  63. System.out.println(next.getKey() + next.getValue());
  64. }
  65. }
  66. }

数据结构 HashMap数据结构

回顾我们之前学过的两种数据结构: ArrayList基于数组的,因为有下标,所以查询、修改快,增删慢 LinkedList基于链表的,因为没有下标,所以查询、修改慢,增删快 以上两个数据结构是刚好互补的,如果能将两个数据结构结合在一起,完美~ 这只是理想状态,实际情况不会这么完美,另外结合在一起比较浪费空间 HashMap就是将两种数据结构结合在了一起 JDK7 数组 + 单向链表 JDK8 数组 + 单向链表 + 红黑树

HashMap数据的存放过程: HashMap中一个元素是一个Node(节点),一个节点包含四个部分:Key值,value值,根据key计算出来的hash值,下一个元素的引用next 当我们调用put方法往HashMap中存储数据,会先根据key的hash值找到当前元素应该存放在数组中的位置, 如果此位置没有元素,则直接存放, 如果此位置有元素,那么向下延伸为单向链表 如果链表的长度大于8并且元素的总个数超过64 那么单向链表转换为红黑树 在我们使用过程中,我们会删除元素,如果链表的长度小于6,将红黑树再次转换为链表

HashMap中两个重要的数值: 16 表示数组的长度为初始长度16 0.75 表示数组的使用率达到75% 就扩容 扩容两倍 resize() 方法

2.2 Hashtable

Hashtable JDK1.0 提供与HashMap相同的API 并且不允许null作为键或者值 线程安全 初始长度为11 负载因子0.75 扩容 rehash() 两倍+1

HashMap与Hashtable的区别? HashMap线程不安全 Hashtable线程安全 HashMap允许null键和值 Hashtable不允许 HashMapJDK1.2 Hashtable JDK1.0

  1. package com.qfedu.test2;
  2. import java.util.Collection;
  3. import java.util.Hashtable;
  4. import java.util.Map.Entry;
  5. import java.util.Set;
  6. /**
  7. * Hashtable JDK1.0 提供与HashMap相同的API 并且不允许null作为键或者值 线程安全
  8. * 初始长度为11 负载因子0.75 扩容 rehash() 两倍+1
  9. * @author WHD
  10. *
  11. */
  12. public class TestHashtable {
  13. public static void main(String[] args) {
  14. Hashtable<Integer,String> table = new Hashtable<Integer,String>();
  15. table.put(1, "a");
  16. table.put(2, "b");
  17. table.put(3, "c");
  18. table.put(4, "d");
  19. // table.put(null, null);
  20. System.out.println(table.remove(1));
  21. System.out.println(table.size());
  22. table.replace(2, "hello");
  23. System.out.println(table.get(2));
  24. //table.clear();
  25. System.out.println(table.isEmpty());
  26. // 遍历方式与HashMap一致
  27. Set<Integer> keySet = table.keySet();
  28. for (Integer key : keySet) {
  29. System.out.println(table.get(key) + "\t" + key);
  30. }
  31. Collection<String> values = table.values();
  32. for (String v : values) {
  33. System.out.println(v);
  34. }
  35. Set<Entry<Integer, String>> entrySet = table.entrySet();
  36. for (Entry<Integer, String> entry : entrySet) {
  37. System.out.println(entry.getKey() + entry.getValue());
  38. }
  39. }
  40. }

2.3 LinkedHashMap

LinkedHashMap是基于双向链表的有序的Map集合 顺序为插入顺序

  1. package com.qfedu.test3;
  2. import java.util.Collection;
  3. import java.util.LinkedHashMap;
  4. import java.util.Map.Entry;
  5. import java.util.Set;
  6. /**
  7. * LinkedHashMap是有序的Map集合 顺序为插入顺序
  8. * @author WHD
  9. *
  10. */
  11. public class TestLinkedHashMap {
  12. public static void main(String[] args) {
  13. LinkedHashMap<String,String> map = new LinkedHashMap<String,String>();
  14. map.put("a", "A");
  15. map.put("b", "B");
  16. map.put("c", "C");
  17. map.put("d", "D");
  18. System.out.println(map.remove("a"));
  19. map.replace("b", "hello");
  20. System.out.println(map.get("b"));
  21. System.out.println(map.size());
  22. // map.clear();
  23. System.out.println(map.isEmpty());
  24. // 遍历方式与之前Map集合一致
  25. Set<String> keySet = map.keySet();
  26. for (String key : keySet) {
  27. System.out.println(key + "---" + map.get(key));
  28. }
  29. Collection<String> values = map.values();
  30. for (String v : values) {
  31. System.out.println(v);
  32. }
  33. Set<Entry<String, String>> entrySet = map.entrySet();
  34. for (Entry<String, String> entry : entrySet) {
  35. System.out.println(entry.getKey() + "===" + entry.getValue());
  36. }
  37. }
  38. }

2.3 TreeMap

基于树的Map集合 有序是按照键的比较顺序 使用自定义的类型作为TreeMap键 必须实现Comparable接口 重写compareTo方法 指定比较规则 否则运行报错 不能添加数据

  1. package com.qfedu.test3;
  2. import java.util.Map.Entry;
  3. import java.util.Set;
  4. import java.util.TreeMap;
  5. /**
  6. * 基于树的Map集合 有序是按照键的比较顺序
  7. * 使用自定义的类型作为TreeMap键 必须实现Comparable接口 重写compareTo方法
  8. * 指定比较规则 否则运行报错 不能添加数据
  9. * @author WHD
  10. *
  11. */
  12. public class TestTreeMap {
  13. public static void main(String[] args) {
  14. TreeMap<Integer,String> map = new TreeMap<Integer,String>();
  15. map.put(1, "abc");
  16. map.put(20, "hello");
  17. map.put(17, "hhh");
  18. map.put(5, "666");
  19. // 其他方法 增删改查 是否为空 与之前map集合一致
  20. // 遍历方式与之前也一致
  21. Set<Integer> keySet = map.keySet();
  22. for (Integer key : keySet) {
  23. System.out.println(map.get(key) + "===" + key);
  24. }
  25. System.out.println("============================================");
  26. TreeMap<Student,String> map1 = new TreeMap<Student,String>();
  27. Student stu1 = new Student("赵四", 25);
  28. Student stu2 = new Student("广坤", 21);
  29. Student stu3 = new Student("大拿", 22);
  30. map1.put(stu1, "abc");
  31. map1.put(stu2, "abc");
  32. map1.put(stu3, "abc");
  33. Set<Entry<Student, String>> entrySet = map1.entrySet();
  34. for (Entry<Student, String> entry : entrySet) {
  35. System.out.println(entry.getKey());
  36. System.out.println(entry.getValue());
  37. }
  38. }
  39. }
package com.qfedu.test3;

public class Student implements Comparable<Student>{
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }
    @Override
    public int compareTo(Student stu) {
        if(this.getAge() > stu.getAge()) {
            return 1;
        }else if(this.getAge() < stu.getAge() ) {
            return -1;
        }
        return 0;
    }

}

2.4 Properties

Properties类用于存放成对的字符串数据 实际开发中用于读取配置文件(jdbc.properties)(log4j.properties) 所以此类不要使用从父类Hashtable继承来的put或者putAll方法 而应该使用setProperty()

package com.qfedu.test6;

import java.util.Properties;

/**
 *     Properties类用于存放成对的字符串数据 实际开发中用于读取配置文件
 *     所以此类不要使用从父类Hashtable继承来的put或者putAll方法
 *     而应该使用setProperty() 
 * @author WHD
 *
 */
public class TestProperties {
    public static void main(String[] args) {
        System.out.println(System.getProperty("java.version"));
        System.getProperties().list(System.out);

        Properties p = new Properties();
//        p.put(1, "abc");
        p.setProperty("a", "A");
        p.setProperty("b", "B");

        System.out.println(p.get("a"));
        p.list(System.out);
    }
}

3.Collections

Collections和Collection的区别? 前者是工具类 后者是集合父接口 工具类提供的有操作集合一些方法 比如查找集合最大、最小元素,集合排序等

package com.qfedu.test7;

import java.util.ArrayList;
import java.util.Collections;

/**
     *     Collections和Collection的区别?
     *     前者是工具类  后者是集合父接口
     *     工具类提供的有操作集合一些方法 比如查找集合最大、最小元素,集合排序等
 * @author WHD
 *
 */
public class TestCollections {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(101);
        list.add(202);
        list.add(30);
        list.add(55);

        System.out.println(Collections.max(list));
        System.out.println(Collections.min(list));
        Collections.sort(list);
        System.out.println("============================");
        for (Integer i : list) {
            System.out.println(i);
        }

        // 二分查找的前提必须先排序
        System.out.println(Collections.binarySearch(list, 101));

    }
}

4. 泛型

泛型 用于统一数据类型 并且扩展代码 相当于是一个占位符 表示未知的类型

  • 泛型不能类型转换 不能多态
  • List<类型A> 表示此list只能存放A类型的数据

  • 泛型应用场景:
  • 类、方法、形参、接口

  • 泛型字母表示的含义 通常是单词首字母
  • T type 类型
  • E Element 元素
  • P Parameter 参数
  • R Return 返回值
  • K Key 键
  • V Value 值
  • 以上字母是业界公认有特定含义的简写 可以任意写字母 也可以小写 但是不要太随意
package com.qfedu.test7;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 *     泛型 用于统一数据类型 并且扩展代码 相当于是一个占位符 表示未知的类型
 *     泛型不能类型转换 不能多态
 *     List<类型A> 表示此list只能存放A类型的数据
 *     
 *     泛型应用场景:
 *     类、方法、形参、接口
 * 
 *     泛型字母表示的含义 通常是单词首字母
 *     T    type    类型
 *     E    Element    元素
 *     P    Parameter 参数
 *     R     Return    返回值
 *     K    Key        键
 *     V    Value    值
 *     以上字母是业界公认有特定含义的简写 可以任意写字母 也可以小写 但是不要太随意
 * @author WHD
 *
 */
public class Test {
    public static void main(String[] args) {
        A<String> a = new A<String>();
        a.m1("a");
        a.m2();


        A<Integer> a1 = new A<Integer>();
        a1.m1(20);
        a1.m2();


    }
}

class A<T>{
    void m1(T t) {

    }

    T m2() {
        return null;
    }

    public static <P> List<P> m3() {
        List<P> list = new ArrayList<P>();
        return list;
    }



}

interface B<P,R>{
    R m1(P p);
}

class C implements B<String,Integer>{

    @Override
    public Integer m1(String p) {
        return null;
    }

}

class D implements B<Float,Character>{

    @Override
    public Character m1(Float p) {
        return null;
    }

}

class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}

class E{
    void m1(Set<Animal> set) {    }

    // <? extends Animal> 表示Animal或者Animal的子类
    void m2(List<? extends Animal> list) {}

    // <? super Dog> 泛型为 可以是Dog类 或者Dog类的父类
    void m3(Map<Set<? super Dog>,String> map) {}


}