泛型

概念

泛型由来:模拟数组数据类型检查功能
数组优点:数组在编译时期就检查数据类型,只要不是规定类型,就会在编译器中提示,不需要运行程序就可以看到错误信息。

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

格式:、<?>、

作用

  1. 约束集合中元素类型,没有约束的集合没数据类型太过自由,可以提前报错时机,编译时就会提示错误信息,在向集合添加元素时,先检查类型,与规定类型不同就会报错。

    示例代码

    ```java package cn.tedu.generic;

import java.util.ArrayList; import java.util.List;

/**

  • 测试泛型的优点 */

public class TestGeneric1 { public static void main(String[] args) { / 泛型由来 模拟数组数据类型检查功能 数组优点:数组在编译时期就检查数据类型,只要不是规定类型, 就会在编译器中提示,不需要运行程序就可以看到错误信息 / String[] a = new String[5]; a[0] = “埼玉”; a[1] = “杰诺斯”; / 不符合类型,报错 a[3] = 1; a[4] = 1.6; a[2] = ‘a’; /

  1. /*
  2. 泛型通常与集合一起使用
  3. */
  4. List list = new ArrayList();
  5. //不会报错,没有限制数据类型,无限制,数据类型太自由
  6. list.add("索尼克");
  7. list.add(1.8);
  8. list.add(1);
  9. list.add('a');
  10. /*
  11. 引入泛型的目的:用于约束集合中元素类型
  12. 优点,可以提前报错时机,编译时就会提示错误信息,在向集合添加元素时,先检查类型,与规定类型不同会报错
  13. */
  14. List<String> list1 = new ArrayList<>();
  15. list1.add("King");
  16. /*报错,泛型限制了数据类型,与规定类型不同会报错
  17. list1.add(1);
  18. list1.add(1.2);
  19. list1.add('a');*/
  20. /*
  21. <type>---根据业务类型自定义,必须为引用类型,不能为基本类型
  22. */
  23. List<Integer> list2 = new ArrayList();
  24. list2.add(100);
  25. list2.add(200);
  26. list2.add(300);
  27. list2.add(400);
  28. System.out.printf(String.valueOf(list2));
  29. }

}

  1. 2. 使代码更加通用
  2. <a name="a57e6b13"></a>
  3. #### 示例代码:
  4. ```java
  5. package cn.tedu.generic;
  6. /**
  7. * 测试泛型的优点
  8. */
  9. public class TestGeneric2 {
  10. public static void main(String[] args) {
  11. Integer[] a = {1,2,3,4,5,6,7,8,9,10};
  12. print(a);
  13. String[] b = {"老大","老二","老三","老四","老五","老六","老七","老八"};
  14. print(b);
  15. Double[] c = {6.0,6.6,6.66,6.666,6.6666};
  16. print(c);
  17. }
  18. /*
  19. 泛型可以写出更加通用的代码,E表示Element:元素
  20. 语法要求:
  21. 必须两处同时出现,方法参数为泛型,返回值类型前为泛型<E>,这两处一起表示这是一个泛型方法
  22. */
  23. private static <E> void print(E[] a) {
  24. /*
  25. 普通for循环
  26. for (int i = 0;i < a.length;i++){
  27. System.out.print(a[i] + " ");
  28. }
  29. System.out.println();*/
  30. /*
  31. 增强for循环
  32. 使用场景,只需要对数据进行一次遍历
  33. 优点:比普通for循环语法简单,效率高
  34. 缺点:不可以按照下标操作元素,只能由头至尾进行遍历
  35. 语法:for(数据类型2 变量名3 : 数据1){}
  36. 1:需要遍历的数据
  37. 2:指本轮循环遍历得到的具体元素类型
  38. 3:遍历得到的元素名称
  39. */
  40. for (E i : a) {
  41. System.out.print(i + " ");
  42. }
  43. System.out.println();
  44. }
  45. /*
  46. 方法重载
  47. private static void print(String[] a) {
  48. for (String s : a) {
  49. System.out.print(s + " ");
  50. }
  51. System.out.println();
  52. }
  53. private static void print(Double[] a) {
  54. for (Double d : a) {
  55. System.out.print(d + " ");
  56. }
  57. }*/
  58. }

规则

  • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前()。
  • 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
  • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
  • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char等)。

泛型声明

泛型可以在接口、类、方法上使用

  1. public class TestStudy<Student>{}
  2. public interface Collection<E>{}
  3. public <E> void prit(E e){}

常用名称

名称 意义
E Element(在集合中使用,集合中存放的为元素)
T Type(java类)
K Key(键)
V Value(值)
N Number(数值类型)
表示不确定的java类型

增强for循环

使用场景,只需要对数据进行一次遍历
优点:比普通for循环语法简单,效率高
缺点:不可以按照下标操作元素,只能由头至尾进行遍历

语法格式

  1. for(数据类型2 变量名3 : 数据1){}
  2. 1:需要遍历的数据
  3. 2:指本轮循环遍历得到的具体元素类型
  4. 3:遍历得到的元素名称

示例代码

  1. private static void print(String[] a) {
  2. for (int i = 0;i < a.length;i++){
  3. System.out.print(a[i] + " ");
  4. }
  5. System.out.println();
  6. for (String s : a) {
  7. System.out.print(s + " ");
  8. }
  9. System.out.println();
  10. }

集合

集合长度可变,数组长度不可变

常用的集合类有List集合,Set集合,Map集合,其中List集合与Set集合继承了Collection接口,各个接口提供了不同的实现类.

集合的英文名称是Collection,是用来存放对象的数据结构,而且长度可变,可以存放不同类型的对象,并且还提供了一组操作成批对象的方法.Collection接口层次结构 中的根接口,接口不能直接使用,但是该接口提供了添加元素/删除元素/管理元素的父接口公共方法.
由于List接口与Set接口都继承了Collection接口,因此这些方法对于List集合和Set集合是通用的.

常用集合关系

image-20210719142203850.png

collection常用方法

普通方法

方法 返回值类型 方法描述
add(E e) boolean 将制定对象添加到集合中
clear() void 删除集合中所有元素
hashCode() int 返回此集合的哈希码值。
equals(Object o) boolean 将指定的对象与此集合进行比较
isEmpty() boolean 判断集合是否为空
size() int 返回此集合中的元素数。
remove(Object o) bollean 从该集合中删除指定元素
contains(Object o) bollean 判断集合中是否含有指定元素
toArrsy() Object[] 返回一个包含此集合中所有元素的数组。
toString() 返回该集合

多集合间的操作

方法 返回值类型 方法描述
addAll() boolean 将指定集合中的所有元素添加到此集合的末尾。
containsAll() boolean 如果此集合包含指定 集合
中的所有元素,则返回true。
removeAll() boolean 删除指定集合中包含的所有此集合的元素
retainAll() boolean 仅保留此集合中包含在指定集合中的元素(取交集)

迭代集合/遍历集合

过程:

  1. 获取集合的迭代器——c.iterator()
  2. 判断集合中是否有下一个可迭代的元素—-it.hasNext()
  3. 获取当前迭代到的元素——it.next()

语法:

  1. Iterator<Integer> it = c.iterator();
  2. while (it.hasNext()){
  3. Integer num = it.next();
  4. System.out.println(num);

示例代码

  1. package cn.tedu.collection;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Collection;
  5. import java.util.Iterator;
  6. /**
  7. * 测试Collection接口
  8. */
  9. public class TestCollection {
  10. public static void main(String[] args) {
  11. /*
  12. Collection c = new Collection();
  13. 报错,Collection为接口不可实例化
  14. */
  15. Collection<Integer> c = new ArrayList<>();
  16. c.add(100);
  17. c.add(200);
  18. c.add(300);
  19. c.add(400);
  20. c.add(500);
  21. System.out.println(c);//可直接打印查看集合的元素
  22. /*
  23. c.clear();清空当前集合
  24. System.out.println(c);
  25. */
  26. System.out.println(c.hashCode());//获取集合对象哈希码值
  27. System.out.println(c.toString());//打印集合的具体元素
  28. System.out.println(c.equals(200));//false
  29. System.out.println(c.contains(200));//true,c集合中是否含有指定元素200
  30. System.out.println(c.isEmpty());//true,判断集合是否为空
  31. System.out.println(c.remove(100));//true,移除集合中指定元素
  32. System.out.println(c.size());//4,返回集合的元素个数
  33. System.out.println(Arrays.toString(c.toArray()));//返回一个包含此集合中所有元素的数组。
  34. //多个集合间的操作
  35. Collection<Integer> c2 = new ArrayList<>();
  36. c2.add(2);
  37. c2.add(4);
  38. c2.add(5);
  39. System.out.println(c2);
  40. c.addAll(c2);//将c2集合的所有元素添加到c集合中
  41. System.out.println(c);//c2集合的元素追加到了c集合末尾
  42. System.out.println(c2);//c集合本身没有任何变化
  43. System.out.println(c.containsAll(c2));//当前集合是否包含c2集合的所有元素
  44. System.out.println(c.removeAll(c2));//删除指定集合中包含的所有此集合的元素
  45. System.out.println(c.add(5));
  46. System.out.println(c.retainAll(c2));//取交集
  47. /*
  48. 迭代集合、遍历集合
  49. 1.获取集合的迭代器----c.iterator()
  50. 2.判断集合中是否有下一个可迭代的元素---it.hasNext()
  51. 3.获取当前迭代到的元素----it.next()
  52. */
  53. Iterator<Integer> it = c.iterator();
  54. while (it.hasNext()){
  55. Integer num = it.next();
  56. System.out.println(num);
  57. }
  58. }
  59. }

List接口

有序的colletion(也称为序列).此接口的用户可以对列表中的每个元素的插入位置进行精确的控制,用户可以根据元素的整数索引(在列表中的位置)来访问元素,并搜索列表中的元素.

特点

  1. 元素都有下标
  2. 数据是有序的
  3. 允许存放重复的元素

常用方法

方法 返回值类型 作用
add(String item) void ``将指定的项目添加到滚动列表的末尾。
equals() boolean ``集合对象与String类型不符合
isEmpty() boolean 判断集合是否为空
clear() void 已弃用截至JDK 1.1版,由removeAll()
。清空集合。
remove(int position) void ``从此滚动列表中移除指定位置的元素。
removeAll() void ``从此列表中删除所有项目。
size() int 获取集合元素个数
add(index int elecent ) void 向指定位置添加元素
indexOf() int 获取指定元素第一次出现的索引
lastIndexOf() int 获取指定元素最后一次出现的索引
get() 获取指定索引处元素
set() 改指定索引处元素值,返回被修改的元素
addAll() void 将集合插入指定集合末尾
addAll(index,list1) void 将集合插入指定位置
containsAll() void 仅保留此集合中包含在指定集合中的元素(取交集)
remove() 在集合中删除指定集合中的所有元素

示例代码

  1. package cn.tedu.collection;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. /**
  6. * 测试List接口
  7. */
  8. public class TestList {
  9. public static void main(String[] args) {
  10. /*
  11. 创建List多态对象,List为接口,不可实例化
  12. */
  13. List<String> list = new ArrayList<String>();
  14. list.add("小火龙");
  15. list.add("妙蛙种子");
  16. list.add("杰尼龟");
  17. list.add("火球鼠");
  18. list.add("菊草叶");
  19. list.add("小锯鳄");
  20. list.add("小智");
  21. System.out.println(list);
  22. /*
  23. 测试继承方法
  24. list.clear();清空集合
  25. System.out.println(list);
  26. */
  27. System.out.println(list.contains("小火龙"));//true,判断集合中是否包含该元素
  28. System.out.println(list.equals("小火龙"));//false;集合对象与String类型不符合
  29. System.out.println(list.isEmpty());//false,判断集合是否为空
  30. System.out.println(list.remove("妙蛙种子"));//一处集合中指定元素
  31. System.out.println(list.size());//获取集合元素个数
  32. System.out.println(Arrays.toString(list.toArray()));//将集合转换为数组
  33. /*
  34. 测试List接口特有方法,List为有序集合,可以根据索引操作集合的元素
  35. */
  36. list.add("小刚");//追加在末尾
  37. list.add(1,"火恐龙");//在指定下标处添加元素
  38. System.out.println(list);
  39. System.out.println(list.indexOf("小火龙"));//获取指定元素第一次出现的索引
  40. System.out.println(list.lastIndexOf("小智"));//获取指定元素最后一次出现的索引
  41. System.out.println(list.remove(5));//删除指定索引处的元素,并返回被删除的元素
  42. System.out.println(list.get(3));//获取指定索引处元素
  43. System.out.println(list.set(6,"小霞"));//修改指定索引处元素值,返回被修改的元素
  44. System.out.println(list);
  45. System.out.println("--------------莫得感情的分界线-------------");
  46. /*
  47. 集合间的操作
  48. */
  49. List<String> list1 = new ArrayList<>();
  50. list1.add("1");
  51. list1.add("2");
  52. list1.add("3");
  53. list1.add("4");
  54. System.out.println(list1);
  55. System.out.println(list.addAll(list1));
  56. System.out.println(list.addAll(1,list1));//将list1添加到指定集合的指定位置
  57. System.out.println(list);
  58. System.out.println(list.containsAll(list1));
  59. System.out.println(list.removeAll(list1));
  60. }
  61. }

集合迭代方式

  1. for循环
  2. 增强for循环
    格式:for(元素类型 元素名 : 需要遍历的集合名){循环体}
  3. iterator
    格式:Iterator<泛型> 变量名 = 集合名.iterator
    while(变量名.hasNext){变量名.next()}
  4. listIterator

示例代码

  1. package cn.tedu.collection;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.ListIterator;
  6. /**
  7. * 测试List接口
  8. */
  9. public class TestList2 {
  10. public static void main(String[] args) {
  11. List<String> list = new ArrayList<>();
  12. list.add("喜羊羊");
  13. list.add("美羊羊");
  14. list.add("沸羊羊");
  15. list.add("懒羊羊");
  16. list.add("慢羊羊");
  17. list.add("肥羊卷");
  18. System.out.println(list);
  19. /*
  20. 集合迭代方式
  21. 1.for循环
  22. 2.增强for
  23. 3.iterator
  24. 4.listIterator
  25. */
  26. //for
  27. for (int i = 0;i < list.size();i++){
  28. System.out.print(list.get(i) + " ");
  29. }
  30. System.out.println();
  31. //增强for
  32. for (String l : list){
  33. System.out.print(l + " ");
  34. }
  35. System.out.println();
  36. //iterator
  37. Iterator<String> s = list.iterator();
  38. while (s.hasNext()){
  39. System.out.print(s.next() + " ");
  40. }
  41. System.out.println();
  42. /*
  43. listIteratorList接口独有的迭代器
  44. Iterator<E>---父接口 listIterator<E>----子接口
  45. listIterator除了父接口的功能还具有自己的特有功能,例如逆序便利、添加元素,但是不常用
  46. public interface ListIterator<E> extends Iterator<E>
  47. */
  48. ListIterator<String> iterator = list.listIterator();
  49. while (iterator.hasNext()){
  50. System.out.print(iterator.next() + " ");
  51. }
  52. }
  53. }

ArrayList

概述

  1. 存在java.util包中
  2. 内部是用数组结构存放数据,封装数组的操作,每个对象都有下标
  3. 内部数组默认的初始容量是10,如果不够会以1.5倍的容量增长
  4. 查询快,增删数据效率会低
  5. ArrayList()构造一个初始容量为10的空序列,每次扩容都会扩大原先的1.5倍
  6. ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是ArrayList没有固定大小的限制,可以添加或删除元素。
  7. ArrayList 继承了 AbstractList ,并实现了 List 接口。

常用方法

方法 描述
add() 将元素插入到指定位置的 arraylist 中
addAll() 添加集合中的所有元素到 arraylist 中
clear() 删除 arraylist 中的所有元素
clone() 复制一份 arraylist
contains() 判断元素是否在 arraylist
get() 通过索引值获取 arraylist 中的元素
indexOf() 返回 arraylist 中元素的索引值
removeAll() 删除存在于指定集合中的 arraylist 里的所有元素
remove() 删除 arraylist 里的单个元素
size() 返回 arraylist 里元素数量
isEmpty() 判断 arraylist 是否为空
subList() 截取部分 arraylist 的元素
set() 替换 arraylist 中指定索引的元素
sort() 对 arraylist 元素进行排序
toArray() 将 arraylist 转换为数组
toString() 将 arraylist 转换为字符串
ensureCapacity
()
设置指定容量大小的 arraylist
lastIndexOf() 返回指定元素在 arraylist 中最后一次出现的位置
retainAll() 保留 arraylist 中在指定集合中也存在的那些元素
containsAll() 查看 arraylist 是否包含指定集合中的所有元素
trimToSize() 将 arraylist 中的容量调整为数组中的元素个数
removeRange() 删除 arraylist
中指定索引之间存在的元素
replaceAll() 将给定的操作内容替换掉数组中每一个元素
removeIf() 删除所有满足特定条件的 arraylist
元素
forEach() 遍历 arraylist
中每一个元素并执行特定操作

示例代码

  1. package cn.tedu.list;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.ListIterator;
  5. /**
  6. * ArrayList相关测试
  7. */
  8. public class TestArrayList {
  9. public static void main(String[] args) {
  10. ArrayList<Integer> list = new ArrayList<>();
  11. list.add(100);
  12. list.add(200);
  13. list.add(300);
  14. list.add(400);
  15. list.add(400);
  16. list.add(300);
  17. System.out.println(list);
  18. /*
  19. list.clear();清空集合
  20. System.out.println(list);
  21. */
  22. System.out.println(list.contains("100"));//false,类型不统一,Integer集合中不包含String类型元素
  23. System.out.println(list.isEmpty());//false
  24. System.out.println(list.get(1));//200
  25. System.out.println(list.indexOf(400));//3
  26. System.out.println(list.lastIndexOf(400));//4
  27. System.out.println(list.remove(1));//200
  28. /*
  29. System.out.println(list.remove(300));数组下标越界
  30. */
  31. /*
  32. List中存在两个重载的remove(),传入的为int类型,会自动默认为index索引,
  33. 所以要删除Integer类型指定元素需要使用Integer.valueOf()将int类型装箱为Integer
  34. */
  35. System.out.println(list.remove(Integer.valueOf(300)));//true,
  36. System.out.println(list.set(2,666));//修改指定索引处元素值
  37. System.out.println(list.size());
  38. //集合迭代
  39. for (int i = 0; i < list.size();i++){
  40. System.out.print(list.get(i) + " ");
  41. }
  42. System.out.println();
  43. for (Integer i :list){
  44. System.out.print(i + " ");
  45. }
  46. System.out.println();
  47. Iterator<Integer> i = list.iterator();
  48. while (i.hasNext()){
  49. System.out.print(i.next() + " ");
  50. }
  51. System.out.println();
  52. ListIterator<Integer> it = list.listIterator();
  53. while (it.hasNext()){
  54. System.out.print(it.next() + " ");
  55. }
  56. }
  57. }

LinkedList

概述

链表,两端效率高,底层为链表

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。

链表可分为单向链表和双向链表。查询慢,增删快,适用于增删较多的场合,或需要频繁访问头节点或尾结点的场合。

image-20210719195738945.png

常用方法

示例代码

  1. package cn.tedu.list;
  2. import java.util.LinkedList;
  3. /**
  4. * 测试LinkedList
  5. */
  6. public class TestLinkedList {
  7. public static void main(String[] args) {
  8. LinkedList<String> list = new LinkedList<>();
  9. list.add("张辽");
  10. list.add("张郃");
  11. list.add("于禁");
  12. list.add("乐进");
  13. list.add("徐晃");
  14. System.out.println(list);
  15. list.addFirst("曹操");//添加首元素
  16. list.addLast("典韦");//添加尾元素
  17. System.out.println(list);
  18. System.out.println(list.getFirst());//获取首元素
  19. System.out.println(list.getLast());//获取尾元素
  20. System.out.println(list.removeFirst());//删除首元素
  21. System.out.println(list.removeLast());//删除尾元素
  22. System.out.println(list);
  23. LinkedList<String> list1 = new LinkedList<>();
  24. list1.add("关羽");
  25. list1.add("张飞");
  26. list1.add("赵云");
  27. list1.add("马超");
  28. list1.add("黄忠");
  29. System.out.println(list1);
  30. System.out.println(list1.element());//获取但不移除集合中的首元素
  31. System.out.println(list1.peek());//获取但不移除集合中的首元素
  32. System.out.println(list1.peekFirst());//获取但不移除集合中的首元素
  33. System.out.println(list1.peekLast());//获取但不移除集合中的尾元素
  34. System.out.println(list1.offer("刘备"));//追加操作
  35. System.out.println(list1.offerFirst("诸葛亮"));//添加到首位置
  36. System.out.println(list1.offerLast("姜维"));//添加到尾部位置
  37. System.out.println(list1);
  38. System.out.println(list1.poll());//移除首元素
  39. System.out.println(list1.pollFirst());//移除首元素
  40. System.out.println(list1.pollLast());//移除尾元素
  41. System.out.println(list1);
  42. }
  43. }

Set

概述

  1. Set是一个不包含重复数据的Collection
  2. Set集合中的数据是无序的(因为Set集合没有下标)
  3. Set集合中的元素不可以重复 – 常用来给数据去重

特点

  1. 数据无序且数据不允许重复
  2. HashSet : 底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K,存入内部的HashMap中。当然K仍然不许重复。
  3. TreeSet : 底层是TreeMap,也是红黑树的形式,便于查找数据

HashSet

底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K存入内部的HashMap中,其中K不允许重复,允许使用null.

示例代码

  1. package cn.tedu.list;
  2. import java.util.Arrays;
  3. import java.util.HashSet;
  4. import java.util.Iterator;
  5. import java.util.Set;
  6. public class HomeWork {
  7. public static void main(String[] args) {
  8. Set<Object> set = new HashSet<>();
  9. set.add("咸阳");
  10. set.add("长安");
  11. set.add("西安");
  12. set.add("洛阳");
  13. set.add("开封");
  14. System.out.println(set);
  15. Set<Student> s2 = new HashSet<>();
  16. Student t1 = new Student("张三",22);
  17. Student t2 = new Student("李四",22);
  18. Student t3 = new Student("李四",22);
  19. s2.add(t1);
  20. s2.add(t2);
  21. s2.add(t3);
  22. System.out.println(s2);
  23. System.out.println(set.contains("济南"));//查询集合中是否包含指定元素
  24. System.out.println(set.equals("洛阳"));//判断集合是否与指定对象相等
  25. System.out.println(set.hashCode());//获取集合的哈希码值
  26. System.out.println(set.isEmpty());//判断集合是否为空
  27. System.out.println(set.remove("开封"));//移除集合指定元素
  28. System.out.println(set.size());//获取当前集合元素个数
  29. System.out.println(Arrays.toString(set.toArray()));//将集合元素存入数组中
  30. //集合间的操作
  31. Set<String> set1 = new HashSet<>();
  32. set1.add("剑门关");
  33. set1.add("山海关");
  34. set1.add("函谷关");
  35. set1.add("嘉峪关");
  36. System.out.println(set1);
  37. System.out.println(set.addAll(set1));//将指定集合的所有元素添加至选定集合中
  38. System.out.println(set.containsAll(set1));//判断当前集合是否包含指定集合中所有元素
  39. System.out.println(set.removeAll(set1));//将当前集合中所有指定集合中的元素全部移除
  40. set.clear();//清除集合中所有元素
  41. //迭代
  42. Iterator<String> s = set1.iterator();
  43. while (s.hasNext()){
  44. System.out.print(s.next() + " ");
  45. }
  46. }
  47. }

Student类

  1. package cn.tedu.list;
  2. import java.util.Objects;
  3. public class Student {
  4. String name;
  5. int age;
  6. public Student(String name, int age) {
  7. this.name = name;
  8. this.age = age;
  9. }
  10. @Override
  11. public boolean equals(Object o) {
  12. if (this == o) return true;
  13. if (o == null || getClass() != o.getClass()) return false;
  14. Student student = (Student) o;
  15. return age == student.age && Objects.equals(name, student.name);
  16. }
  17. @Override
  18. public int hashCode() {
  19. return Objects.hash(name, age);
  20. }
  21. @Override
  22. public String toString() {
  23. return "Student{" +
  24. "name='" + name + '\'' +
  25. ", age=" + age +
  26. '}';
  27. }
  28. }

Map

概述

类型参数 : K - 表示此映射所维护的键 V – 表示此映射所维护的对应的值
也叫做哈希表、散列表. 常用于键值对结构的数据.其中键不能重复,值可以重复

特点

  1. Map可以根据键来提取对应的值
  2. Map的键不允许重复,如果重复,对应的值会被覆盖
  3. Map存放的都是无序的数据
  4. Map的初始容量是16,默认的加载因子是0.75

常用方法

变量和类型 方法 描述
void add(int index, E element) 将指定元素插入此列表中的指定位置。
boolean add(E e) 将指定的元素追加到此列表的末尾。
boolean addAll(int index, Collection<? extends E> c) 从指定位置开始,将指定集合中的所有元素插入此列表。
boolean addAll(Collection<? extends E> c) 将指定集合中的所有元素按指定集合的迭代器返回的顺序附加到此列表的末尾。
void addFirst(E e) 在此列表的开头插入指定的元素。
void addLast(E e) 将指定的元素追加到此列表的末尾。
void clear() 从此列表中删除所有元素。
Object clone() 返回此 LinkedList
的浅表副本。
boolean contains(Object o) 如果此列表包含指定的元素,则返回 true
Iterator<E> descendingIterator() 以相反的顺序返回此双端队列中元素的迭代器。
E element() 检索但不删除此列表的头部(第一个元素)。
E get(int index) 返回此列表中指定位置的元素。
E getFirst() 返回此列表中的第一个元素。
E getLast() 返回此列表中的最后一个元素。
int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1。
int lastIndexOf(Object o) 返回此列表中指定元素最后一次出现的索引,如果此列表不包含该元素,则返回-1。
ListIterator<E> listIterator(int index) 从列表中的指定位置开始,返回此列表中元素的列表迭代器(按正确顺序)。
boolean offer(E e) 将指定的元素添加为此列表的尾部(最后一个元素)。
boolean offerFirst(E e) 在此列表的前面插入指定的元素。
boolean offerLast(E e) 在此列表的末尾插入指定的元素。
E peek() 检索但不删除此列表的头部(第一个元素)。
E peekFirst() 检索但不删除此列表的第一个元素,如果此列表为空,则返回 null
E peekLast() 检索但不删除此列表的最后一个元素,如果此列表为空,则返回 null
E poll() 检索并删除此列表的头部(第一个元素)。
E pollFirst() 检索并删除此列表的第一个元素,如果此列表为空,则返回 null
E pollLast() 检索并删除此列表的最后一个元素,如果此列表为空,则返回 null
E pop() 弹出此列表所代表的堆栈中的元素。
void push(E e) 将元素推送到此列表所表示的堆栈上。
E remove() 检索并删除此列表的头部(第一个元素)。
E remove(int index) 删除此列表中指定位置的元素。
boolean remove(Object o) 从该列表中删除指定元素的第一个匹配项(如果存在)。
E removeFirst() 从此列表中删除并返回第一个元素。
boolean removeFirstOccurrence(Object o) 删除此列表中第一次出现的指定元素(从头到尾遍历列表时)。
E removeLast() 从此列表中删除并返回最后一个元素。
boolean removeLastOccurrence(Object o) 删除此列表中最后一次出现的指定元素(从头到尾遍历列表时)。
E set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
int size() 返回此列表中的元素数。
Spliterator<E> spliterator() 在此列表中的元素上创建late-binding
故障快速 [Spliterator](https://www.runoob.com/manual/jdk11api/java.base/java/util/Spliterator.html)
Object[] toArray() 以适当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组。
<T> T[] toArray(T[] a) 以适当的顺序返回包含此列表中所有元素的数组(从第一个元素到最后一个元素); 返回数组的运行时类型是指定数组的运行时类型。

示例代码

  1. package cn.tedu.list;
  2. import java.util.*;
  3. /**
  4. * 测试Map接口
  5. */
  6. public class TestMap {
  7. public static void main(String[] args) {
  8. /*
  9. Map中的数据要符合映射规则,即同时指定k,v(键值对)
  10. k,v类型却决于需求
  11. */
  12. Map<Integer,String> map = new HashMap<>();
  13. map.put(1,"西游记");
  14. map.put(2,"红楼梦");
  15. map.put(3,"水浒传");
  16. map.put(4,"封神榜");
  17. map.put(5,"封神榜");
  18. map.put(5,"三国演义");
  19. /*
  20. Map中存放的都是无序数据
  21. Map中的Value可以重复
  22. Map中的Key不可重复,若重复,后面的value会覆盖前面的value
  23. */
  24. System.out.println(map);
  25. //方法
  26. //map.clear();清空集合
  27. System.out.println(map.hashCode());
  28. System.out.println(map.equals("水浒传"));
  29. System.out.println(map.isEmpty());
  30. System.out.println(map.size());
  31. System.out.println(map.containsKey(1));//判断当前map集合是否包含指定的key
  32. System.out.println(map.containsValue("封神榜"));//判断当前map集合中是否包含指定的value
  33. System.out.println(map.get(2));//根据key获取对应value
  34. System.out.println(map.remove(3));//根据kay值删除对应键值对
  35. System.out.println(map.containsKey(3));
  36. //将map集合中的所有value放入collection中
  37. Collection<String> values = map.values();
  38. System.out.println(values);
  39. /*
  40. 迭代
  41. map本身没有迭代器,需要先将map转换为set集合
  42. Set<Key>:把map中所有key值存入到set集合中,keySet()
  43. 将map中的key存入set集合中,集合的泛型就是key的类型Integer
  44. */
  45. Set<Integer> keySet = map.keySet();
  46. Iterator<Integer> it = keySet.iterator();
  47. while (it.hasNext()){
  48. Integer key = it.next();
  49. String value = map.get(key);
  50. System.out.print("{" + key + "=" + value + "}" + " ");
  51. }
  52. System.out.println();
  53. /*
  54. 将map集合转换为set集合,即将map中的一对键值对key&value作为一个Entry<K,V>整体放入Set集合
  55. 一对k,v即为一个Entry
  56. */
  57. Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
  58. Iterator<Map.Entry<Integer,String>> iterator = entrySet.iterator();
  59. while (iterator.hasNext()){
  60. Map.Entry<Integer, String> next = iterator.next();//本轮遍历到的一对Entry对象
  61. Integer key = next.getKey();
  62. String value = next.getValue();
  63. System.out.print("{" + key + "=" + value + "}");
  64. System.out.print(next + " ");
  65. }
  66. }
  67. }

字符串统计

  1. package cn.tedu.list;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Scanner;
  5. /**
  6. * 字符串字符个数统计
  7. */
  8. public class TestMap2 {
  9. public static void main(String[] args) {
  10. System.out.print("请输入要统计的字符串:");
  11. String str = new Scanner(System.in).nextLine();
  12. /*
  13. 统计的为字幕出现次数,单个字符为char类型,对应类型为character
  14. Integer为value,可重复不能作为key,Character为key不可重复
  15. */
  16. Map<Character,Integer> map = new HashMap<>();
  17. for (int i = 0;i < str.length();i++){
  18. char key = str.charAt(i);
  19. /*
  20. for循环
  21. int num = 0;
  22. for (int j = 0;j < str.length();j++){
  23. if (key == str.charAt(j)){
  24. num++;
  25. }
  26. }
  27. map.put(key,num);
  28. */
  29. Integer value = map.get(key);
  30. if (value == null){
  31. map.put(key,1);
  32. }else {
  33. map.put(key,value+1);
  34. }
  35. }
  36. System.out.println(map);
  37. }
  38. }

HashMap

概述

HashMap的键要同时重写hashCode()和equlas()
hashCode()用来判定二者的hash值是否相同,重写后根据属性生成
equlas()用来判断属性的值是否相同,重写后,根据属性判断
–equlas()判断数据如果相等,hashCode()必须相同
–equlas()判断数据如果不等,hashCode()尽量不同

HashMap底层是一个Entry[ ]数组,当存放数据时,会根据hash算法来计算数据的存放位置
算法:hash(key)%n , n就是数组的长度,其实也就是集合的容量
当计算的位置没有数据的时候,会直接存放数据
当计算的位置,有数据时,会发生hash冲突/hash碰撞,解决的办法就是采用链表的结构,在数组中指定位置处已有元素之后插入新的元素,也就是说数组中的元素都是最早加入的节点

图解

image-20210720202411088.png