day07【Collection、泛型、数据结构】

反馈和复习
1.老师多照顾一下基础差的哥们
2.老师讲的太慢了
3.学生管理系统3遍
今日内容
今日+明日+后日(非常重要!!主要讲各种集合!!)
今日:1.Collection(所有集合的根接口)2.根接口中共性方法 3.迭代器(用于遍历集合)    4.泛型(理解即可)5.数据结构(重点)

第一章 Collection集合【重点】

1.集合的介绍&集合和数组的区别
a.什么是集合?集合就是Java用来保存数据的容器
b.我们学过哪些容器??数组,ArrayList数组定义: 数据类型[] 变量名 = new 数据类型[数组的长度];集合定义: ArrayList<数据类型> 变量名 = new ArrayList<数据类型>();
c.数组和集合的区别在吗??【面试题】i.数组长度是固定的,集合的长度是可变的ii.数组中元素类型可以是基本类型,也可以是引用类型但是集合中元素类型必须只能是引用类型,如果想保持基本类型,要写该基本类型对应的包装类比如: ArrayList<int> arr = new ArrayList<int>();//报错!!ArrayList<Integer> arr = new ArrayList<Integer>();//对的
2.集合框架的继承体系

3.Collection中的通用方法
增:增加public boolean add(E e);  添加元素,返回值表示是否添加成功!
删:删除public boolean remove(E e); 删除元素,返回值表示是否删除成功!
改:修改无!
查:获取无!
其他:public boolean contains(Object obj); 判断集合中是否包含某个元素public void clear(); 清空集合(把集合的元素全部删除,不是把集合置为null)public boolean isEmpty(); 判断集合是否为空(是指集合中是否没有元素,并不是值集合是否为null)public int size(); 返回集合中元素的个数public Object[] toArray(); 将集合转成数组  public class TestCollection {public static void main(String[] args) {//1.创建一个ArrayListCollection<String> cc = new ArrayList<String>(); //多态//2.测试方法//添加cc.add("java1");cc.add("java2");cc.add("java3");cc.add("java4");System.out.println(cc);//不会打印出来地址,而是打印出来集合中的元素内容//删除boolean b = cc.remove("java4");System.out.println("是否删除成功:" + b);System.out.println(cc);//其他方法//判断是否包含boolean b1 = cc.contains("java2");System.out.println("是否包含:"+b1);//清空集合cc.clear();System.out.println(cc);//判断是否集合没有元素boolean b2 = cc.isEmpty();System.out.println("集合是否为空集合:"+b2);//获取集合的长度int size = cc.size();System.out.println("集合中元素的个数:"+size);//将集合转成数组Object[] objects = cc.toArray();System.out.println(objects[0]);System.out.println(objects[1]);System.out.println(objects[2]);}
}

第二章 Iterator迭代器【重点】

1.集合迭代器的介绍和使用
a.迭代器(iterator):用于遍历集合的对象(集合有无索引,均可使用迭代器来遍历,迭代器遍历集合时是不需要索引的!!!)
b.如何使用迭代器?i.获取要遍历的集合的迭代器对象ii.调用迭代器对象.hasNext();iii.调用迭代器对象.next();public class TestIterator {public static void main(String[] args) {//1.创建一个集合Collection<String> cc = new ArrayList<String>();//添加cc.add("java");cc.add("php");cc.add("python");cc.add("c++");cc.add("c");cc.add("c#");cc.add("Objective-C");//使用迭代器
//        i.获取要遍历的集合的迭代器对象Iterator<String> it = cc.iterator();
//        ii.调用迭代器对象.hasNext();
//        iii.调用迭代器对象.next();while (it.hasNext()){String ss = it.next();System.out.println(ss);}}
}
  • 迭代器的注意事项(2个异常):

    a.NoSuchElementException: 没有此元素异常出现原因: 迭代器的hasNext返回false,再调用next方法,就会出现此异常
    b.ConcurrentModificationException: 并发修改异常出现原因: Java的迭代器规定,使用迭代器的过程中,不能向集合中增删元素(不能影响集合的长度)否则就会抛出并发修改异常
    结论:a.使用迭代器时,必须先使用hasNext方法判断,且判断结果为true,才能调用next方法b.使用迭代器时,我们应该尽量只做遍历(绝对不允许直接向集合中增删元素)
    
2.迭代器的原理(画图)
迭代器的底层使用了"指针原理"

3.增强for循环【重点】
a.什么是增强for循环实际上是一种简便格式(语法糖),实际上是迭代器的语法糖b.增强for循环的用法:for(数据类型 变量名:集合/数组){System.out.println(变量名);}public class TestForeach {public static void main(String[] args) {//1.增强for循环,可以快速遍历集合/数组//a.数组int[] arr = {10,20,30,40,50,60,70};for(int num : arr){System.out.println(num);}//b.集合ArrayList<String> arr2 = new ArrayList<String>();arr2.add("java1");arr2.add("java2");arr2.add("java3");arr2.add("java4");arr2.add("java5");arr2.add("java6");for(String s : arr2){System.out.println(s);}}
}
c.增强for循环底层使用的就是迭代器怎么证明呢??a.看源码(目前你是看不懂)b.如果在使用增强for的过程中向集合中添加或者删除元素会怎么样??和使用迭代器时一样也会抛出 ConcurrentModificationException注意:和使用迭代器一样,增强for就是用于单纯的遍历集合,不要在遍历的过程中增删元素!!

第三章 泛型【理解】

1.什么是泛型
泛型是JDK1.5的新特性
比如:在JDK1.5之前,创建集合: ArrayList arr = new ArrayList(),集合中可以保存任意的对象在JDK1.5时候,创建集合: ArrayList<具体的引用类型> arr = new ArrayList<具体的引用类型>();什么是泛型:是一种不确定的类型,程序员使用时再确定下来
泛型的格式:<E>,<P>,<MVP> <K,V>       
2.泛型的好处
public class TestGeneric {public static void main(String[] args) {method2();}//不使用泛型public static void method1(){//1.创建集合,但是不用泛型ArrayList arr = new ArrayList();//问题: 没写泛型,集合可以保存什么类型?? Object类型arr.add("java");arr.add(10);arr.add(3.14);arr.add(true);arr.add('A');//2.取出for(Object s :arr){String ss = (String)s;System.out.println("ss的长度是:"+ss.length());}//不使用泛型,就必须用到向下转型,可能转型的过程中还会引发ClassCastException//添加元素一时爽,取出元素火葬场}//使用泛型public static void method2(){//1.创建集合,并且使用泛型ArrayList<String> arr = new ArrayList<String>();//2.添加arr.add("java");arr.add("10");arr.add("3.14");arr.add("true");arr.add("A");//3.取出for(String s:arr){//a.避免向下转型的麻烦//b.也避免了类型转换异常System.out.println(s+"的长度是:"+s.length());}}
}总结泛型的好处:a.避免了强转(向下转型)的麻烦b.将运行时期的ClassCastException,转移到了编译时期变成了编译失败。 c.总之: JDK1.5之后,Java强烈推荐(必须)使用泛型!!!!   
3.泛型的定义和使用【理解】
泛型可以定义在类上,方法上,接口上!!!
  • 泛型类

    泛型可以定义在类上泛型类的定义:/*** 泛型类*/public class MyArrayList<E> {//就是把E当做某种数据类型使用private E ee;public E getEe() {return ee;}public void setEe(E ee) {this.ee = ee;}}
    泛型类的使用:public class TestMyArrayList {public static void main(String[] args) {//1.使用泛型类,MyArrayListMyArrayList<String> arr = new MyArrayList<String>();//此时arr中集合对象中没有E了!!所有E都变成Stringarr.setEe("java");String ee = arr.getEe();System.out.println(ee);//2.使用泛型类,MyArrayListMyArrayList<Integer> arr1 = new MyArrayList<Integer>();//此时arr1中集合对象中没有E了!!所有E都变成Integerarr1.setEe(100);System.out.println(arr1.getEe());}}
  • 泛型方法

    泛型定义在某个方法上泛型方法的定义:public class Dog {/*** 泛型方法*/public <E> void show(E num){System.out.println(num);}}泛型方法的使用:public class TestDog {public static void main(String[] args) {//1.创建Dog对象Dog dd = new Dog();//2.调用方法dd.show("java");dd.show(10);//严格的方式dd.<String>show("java");dd.<Integer>show(10);}}
  • 泛型接口

    泛型定义在某个接口上泛型接口的定义:/*** 泛型接口*/public interface MyInterface<MVP> {//在接口中就可以使用MVPpublic abstract void show(MVP mm);public abstract void eat(MVP mm);}泛型接口的使用://泛型接口的泛型,可以在以下两种情况中确定//a.定义一个实现类 实现 该接口时,确定MVP的具体类型class MyClass1 implements MyInterface<Integer>{//重写抽象方法@Overridepublic void show(Integer mm) {}@Overridepublic void eat(Integer mm) {}}//b.定义一个实现类 实现 该接口时,保留泛型class MyClass2<MVP> implements MyInterface<MVP>{@Overridepublic void show(MVP mm) {}@Overridepublic void eat(MVP mm) {}}//此时实现类 其实就是一个泛型类,创建该类的对象时,可以确定泛型的具体类型// MyClass2<String> mc = new MyClass2<String>();// MyClass2<Integer> mc = new MyClass2<Integer>();//c.丢弃泛型//c.也可以直接丢弃泛型,此时所有的泛型都会变成Objectclass MyClass3 implements MyInterface{@Overridepublic void show(Object mm) {}@Overridepublic void eat(Object mm) {}}
    总结
    在开发我们很少自定义泛型类.泛型方法,泛型接口,所以我们的重点是别人定义好了一个泛型类(ArrayList<E>)我们会使用它即可!!ArrayList<具体的类型> arr = new ArrayList<具体的类型>();
4.泛型统配符【理解】
a.什么是泛型统配符:当集合中泛型不确定为何种类型时,那么我可以使用泛型通配符,表示何种泛型均可ArrayList<String>ArrayList<Integer> ArrayList<?>public class TestDemo {public static void main(String[] args) {//1.定义三个集合ArrayList<String> arr1 = new ArrayList<String>();ArrayList<Integer> arr2 = new ArrayList<Integer>();ArrayList<Double> arr3 = new ArrayList<Double>();//2.调用方法method(arr1);method(arr2);method(arr3);//Java要求调用方法时,不仅要数据类型一样,泛型必须也一样,否则编译报错!!}//方法,要求该方法可以接收 以上三个集合中的任意一个public static void method(Collection<?> arr) {}
}        
5.泛型的上下限【重点】
举例:比我线下上课时候,你们班的辅导老师,邀请大家吃饭,消费金额每个人是50-1000RMB之间下限:50RMB 上限:1000RMB泛型上下限:<?> 什么泛型都是OK的<? extends Animal>,叫泛型的上限,表示该泛型必须是Animal本类或者其子类(Dog,Cat) 我们可以理解为: "<? <= Animal>"    <? super Student>,叫泛型的下限, 表示该泛型必须是Student本类或者其父类(Person,Object)   我们可以理解为: "<? >= Student>"  举例:
public class TestDemo02 {public static void main(String[] args) {Collection<Integer> list1 = new ArrayList<Integer>();Collection<String> list2 = new ArrayList<String>();Collection<Number> list3 = new ArrayList<Number>();Collection<Object> list4 = new ArrayList<Object>();//Number是 Integer的父类// Object//   子类 String Number//               子类 Integer//调用方法1getElement1(list1); //OKgetElement1(list2);getElement1(list3); //OKgetElement1(list4);//调用方法2getElement2(list1); // 0getElement2(list2); // 0getElement2(list3); // 1getElement2(list4); // 1}//要求:泛型必须是Number 或者 Number的子类(上限)public static void getElement1(Collection<? extends Number> coll) {}//要求:泛型必须是Number 或者 Number的父类(下限)public static void getElement2(Collection<? super Number> coll) {}
}           

第四章 数据结构【重点】

1.什么是数据结构
是容器保存数据的方式!!举例: 我租了一间仓库,卖大米,我去批发市场买进很多袋大米(黑米,薏米,小米,...)我把一袋一袋大米写上编号,存入仓库a.平铺保存(都放地上,不要叠起来)b.堆叠保存(一直堆叠直到顶到屋顶)思考:a和b两种结构哪种好??a.容易取出b.节省空间               
2.常见的4+1种数据结构
我们需要掌握前四种数据结构
  • 栈结构

    特点: 先进后出,后进先出
  • 队列结构

    特点: 先进先出,后进后出
  • 数组结构

    特点: 查改快,增删慢!
  • 链表结构

    特点: 查改慢,增删快!

我们还需要了解另一种数据结构   
  • 树结构【了解即可】

    树结构--->二叉树---> 二叉查找树 ---> 平衡树二叉 ---> 红黑树【了解】
    红黑树的特点:查询效率非常恐怖!!!!   
总结
1.Collection 集合根接口【重点】i.集合继承体系ii. Collection中定义的通用方法iii.明白集合和数组的区别2.迭代器【重点】i.迭代器使用的三个步骤: 获取迭代器,判断有没有下一个,取出下一个元素ii.增强for循环使用(底层使用就是迭代器)   iii.迭代器和增强for使用过程 不能增删元素   3.泛型【理解】i.泛型怎么写 <E>ii.泛型类,泛型接口,泛型方法怎么定义和使用iii.泛型通配符以及上下限【重点】<?> 代表任意泛型均可<? extends 类名> 上限<? super 类名> 下限
4.数据结构【重点】栈结构: 先进后出队列结构: 先进先出数组结构: 增删慢,查询快链表结构: 增删快,查询慢红黑树: 查询效率非常恐怖!!  【记住结论即可】  

day07【Collection、泛型、数据结构】相关推荐

  1. JAVA学习 API_day03(字符串编码, 泛型, 数据结构, Collection)

    字符串编码, 泛型, 数据结构, Collection 1.字符串编码 2.泛型 3.数据结构 4.Collection 1.字符串编码 1.String -> 字符序列 (中文\英文) JVM ...

  2. JAVA基础03-Object类,常用类,基本的数据结构, Collection常用体系,泛型-泛型通配符

    1.object类 1.概述 java.lang.object类是java语言中的根类,即所有类的超类(基类)他描述的所有的方法子类都可以使用,在对象实例化的时候最终找到的类就是object 如果一个 ...

  3. Java基础巩固(一)类,接口,枚举,常用API,集合,泛型,正则,数据结构

    一.static.final.权限关键字,代码块,接口,枚举 1 关键字 2 代码块 3 接口 4 枚举 idea快捷键 shift + enter 换行 ctrl + Alt + shift + U ...

  4. java的知识点23——泛型Generics、Collection接口、List特点和常用方法、 ArrayList特点和底层实现

    泛型Generics 一般通过"容器"来容纳和管理数据.程序中的"容器"就是用来容纳和管理数据. 数组就是一种容器,可以在其中放置对象或基本类型数据. 数组的优 ...

  5. Java集合之Collection集合、泛型 【集合综合案例:赌神、赌侠、赌神斗地主】

    第一章. Collection集合 1.1 集合概述 集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. ...

  6. [译]聊聊C#中的泛型的使用

    写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发现了一些问题,因此也进行了纠正,当然,原文的地 ...

  7. day10 【迭代器 数据结构】上课

    1.Iterator迭代器(掌握) 介绍 1.Iterator是一个接口,属于java.util包下,需要导包 2.属于jdk1.2开始有的,之前使用迭代器Enumeration 3.Iterator ...

  8. 泛型会让你的 Go 代码运行变慢

    以下内容来自公众号逆锋起笔,关注每日干货及时送达 作者 | Vicent Marti 译者 | 核子可乐 策划 | 褚杏娟 Go 1.18 已经到来,很多人期盼已久的首个支持泛型实现的版本也就此落地. ...

  9. Swift 泛型教程入门

    原文:Swift Generics Tutorial: Getting Started 作者:Gemma Barlow 译者:kmyhy 更新说明:本教程由 Gemma Barlow 更新为 Swif ...

  10. java基础加强知识点

    文章目录 day01[Object类.常用API] day02[Collection.泛型] day03 [List.Set.数据结构.Collections] day04 [Map] day05 [ ...

最新文章

  1. vue select js 设置默认值
  2. idea中如何reimport_IDEA中导入新项目遇坑
  3. 找不到工作,一程序员去帮屠夫卖猪肉 | 每日趣闻
  4. pwm调制 matlab仿真,PWM脉冲调制直流电机的simulink仿真
  5. 网络安全-windowserver搭建DHCP服务器
  6. 多线程锁--怎么理解Condition
  7. “出道” 5 年采用率达 78%,Kubernetes 的成功秘诀是什么?
  8. Unity3d C#获取海康摄像头直播视频流预览萤石截图实现
  9. 已知url地址,批量下载图片到指定目录
  10. 《python网络数据采集》读书笔记
  11. 阿里云账号企业实名认证和个人实名认证区别详解
  12. 抖音的广告位在哪?抖音信息流广告样式?
  13. java实现PDF转图片功能,附实例源码!
  14. 【手眼标定】ROS + usb_cam + aruco_ros + easy_handeye_demo
  15. C语言让程序自己获得管理员权限
  16. 官宣:无极SR4 Max,350AC发布
  17. 转(JAVA的JNI调用)
  18. 2021.07.13【B站】是这样崩的
  19. ValueError: At least one stride in the given numpy array is negative解决方案
  20. 689-电脑的外部设备驱动程序

热门文章

  1. FTP/SFTP客户端:Transmit Mac中文版
  2. 树莓派搭建pptpd
  3. Oracle EBS使用CSV导入Oracle Form及BOM清单导入 API
  4. 玖富曲线入股湖北消金,已成第二大股东
  5. python圣斗士(十七):令人欲罢不能的正则
  6. Unity 3D模型展示框架篇之自由观察(Cinemachine)
  7. MSD3393/MSD3463 屏参及REG对照表
  8. 小虎电商浏览器:淘数据店铺数据分析如何?数据精确吗?
  9. 根据经纬度定位百度地图(带图片的)
  10. 美妆短视频的定位分享,教程、技巧都可做,还可尝试变装内容