A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lishaos 中级黑马   /  2019-5-7 14:44  /  1053 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学习总结面向对象day01继承1 . 什么是继承?
就是让类与类之间产生了关系,父子关系。
2 . 继承所使用的关键字是哪个?
extends
3 . 继承的好处和弊端都是什么?
好处:  提高代码复用性和维护性。
弊处:类与类之间的藕合性增强,类与类之间的关太过紧密!如果父类提供的类功能,子类需要的话可以 继承下去使用。如果不需要,也得要。
4 . 继承关系中成员访问的特点是什么?
就近原则
​      在子类的局部位置查找。如果有就是用。如果没有
​      在子类的成员位置查找,如果有就是用,如果没有
​      在父类的成员位置查找,如果有就是用,如果没有就报错了。
5 . java继承的特点是什么?
只能单继承,不能多继承,支持多层继承
权限修饰符6 . 四种权限修饰符的访问特点是什么?                                                           ,
修饰词
本类
相同包(子父类或无关类)
不同包(子父类
不同包(无关类)

public
Y
Y
Y
Y

protected
Y
Y
Y


默认
Y
Y



private
Y



7 . final关键字的功能是什么?
修饰类:类变成一个最终的类,不能被继承,但可以有父类。
修饰成员变量:变量变成一个常量,不能被改变。
修饰成员方法:方法不能被重写,但可以被继承使用。
修饰引用数据类型:对象记录的内存地址不能发生改变,但对象的内容是可以改变修改的。
8 . static关键字的特点是什么?
静态成员属于类的,静态成员是随着类的加载而加载,静态成员要优先于对象的存在。
静态成员可以通过类直接访问。
静态成员只能访问静态的成员。
非静态成员既可以访问静态成员,也可以访问非静态成员。
9 . 何时使用静态?
当一个成员需要被所有对象所共享使用时,就可以将其定义为静态的。
day02多态1.什么是多态?
同一个对象,在不同时刻表现出来的不同形态.
2.多态的前提
要有继承或实现关系
要有方法重写
要有父类引用指向子类对象
3.多态的成员访问特点
成员变量
​        编译看父类,运行看父类
成员方法
​        编译看父类,运行看子类
4.多态的好处和弊端
好处
​        提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
弊端
​        不能使用子类的特有成员
抽象1.抽象类的概述
我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了!
​        在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类!
2.抽象类的特点
  • 抽象类和抽象方法必须使用 abstract 关键字修饰
    //抽象类的定义
    public abstract class 类名 {}

    //抽象方法的定义
    public abstract void eat();
  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
  • 抽象类不能实例化
    ​        抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态
  • 抽象类的子类
    ​        要么重写抽象类中的所有抽象方法
    ​        要么是抽象类

3.抽象类的成员特点
成员的特点
  • 成员变量
    • 既可以是变量
    • 也可以是常量

  • 构造方法
    • 空参构造
    • 有参构造

  • 成员方法
    • 抽象方法
    • 普通方法


接口1.接口的概述
接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
​        Java中的接口更多的体现在对行为的抽象!
2.接口的特点
  • 接口用关键字interface修饰

    public interface 接口名 {}
  • 类实现接口用implements表示

    public class 类名 implements 接口名 {}
  • 接口不能实例化
    ​        接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。
    ​        多态的形式:具体类多态,抽象类多态,接口多态。
  • 接口的子类
    ​        要么重写接口中的所有抽象方法
    ​        要么子类也是抽象类

3.接口的成员特点
成员特点
  • 成员变量
    ​         只能是常量​         默认修饰符:public static final
  • 构造方法
    ​        没有,因为接口主要是扩展功能的,而没有具体存在
  • 成员方法
    ​        只能是抽象方法
    ​        默认修饰符:public abstract       

4.类和接口的关系
  • 类与类的关系
    ​        继承关系,只能单继承,但是可以多层继承
  • 类与接口的关系
    ​        实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
  • 接口与接口的关系
    ​        继承关系,可以单继承,也可以多继承

5.抽象类和接口的区别
  • 成员区别
    • 抽象类
      ​        变量,常量;有构造方法;有抽象方法,也有非抽象方法
    • 接口
      ​        常量;抽象方法

  • 关系区别
    • 类与类
      ​        继承,单继承
    • 类与接口
      ​        实现,可以单实现,也可以多实现
    • 接口与接口
      ​        继承,单继承,多继承

  • 设计理念区别
    • 抽象类
      ​        对类抽象,包括属性、行为
    • 接口
      ​        对行为抽象,主要是行为


doy03参数传递1.类名作为形参和返回值
  • 1、类名作为方法的形参
    方法的形参是类名,其实需要的是该类的对象
    实际传递的是该对象的【地址值】
  • 2、类名作为方法的返回值
    方法的返回值是类名,其实返回的是该类的对象
    实际传递的,也是该对象的【地址值】

2.抽象类作为形参和返回值
抽象类作为形参和返回值
  • 方法的形参是抽象类名,其实需要的是该抽象类的子类对象
  • 方法的返回值是抽象类名,其实返回的是该抽象类的子类对象

3.接口名作为形参和返回值
接口作为形参和返回值
  • 方法的形参是接口名,其实需要的是该接口的实现类对象
  • 方法的返回值是接口名,其实返回的是该接口的实现类对象

内部类1.内部类概念
在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类
  • 内部类定义格式
    • 格式&举例:

      /*
          格式:
          class 外部类名{
              修饰符 class 内部类名{
              
              }
          }
      */

      class Outer {
          public class Inner {
              
          }
      }

2.内部类的访问特点
  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象
  • 示例代码:

    /*
        内部类访问特点:
            内部类可以直接访问外部类的成员,包括私有
            外部类要访问内部类的成员,必须创建对象
    */
    public class Outer {
        private int num = 10;
        public class Inner {
            public void show() {
                System.out.println(num);
            }
        }
        public void method() {
            Inner i = new Inner();
            i.show();
        }
    }
3.成员内部类(理解)
  • 成员内部类的定义位置
    • 在类中方法,跟成员变量是一个位置

  • 外界创建成员内部类格式
    • 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
    • 举例:Outer.Inner oi = new Outer().new Inner();

  • 成员内部类的推荐使用方案
    • 将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。

  • 示例代码:

    class Outer {
        private int num = 10;
        private class Inner {
            public void show() {
                System.out.println(num);
            }
        }
        public void method() {
            Inner i = new Inner();
            i.show();
        }
    }
    public class InnerDemo {
        public static void main(String[] args) {
            //Outer.Inner oi = new Outer().new Inner();
            //oi.show();
            Outer o = new Outer();
            o.method();
        }
    }
4.局部内部类
  • 局部内部类定义位置
    • 局部内部类是在方法中定义的类

  • 局部内部类方式方式
    • 局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用
    • 该类可以直接访问外部类的成员,也可以访问方法内的局部变量

  • 示例代码

    class Outer {
        private int num = 10;
        public void method() {
            int num2 = 20;
            class Inner {
                public void show() {
                    System.out.println(num);
                    System.out.println(num2);
                }
            }
            Inner i = new Inner();
            i.show();
        }
    }
    public class OuterDemo {
        public static void main(String[] args) {
            Outer o = new Outer();
            o.method();
        }
    }

5. 匿名内部类
  • 匿名内部类的前提
    • 存在一个类或者接口,这里的类可以是具体类也可以是抽象类

  • 匿名内部类的格式
    • 格式:new 类名 ( ) {  重写方法 }    new  接口名 ( ) { 重写方法 }
    • 举例:

      new Inter(){
          @Override
          public void method(){}
      }
  • 匿名内部类的本质
    • 本质:是一个继承了该类或者实现了该接口的子类匿名对象

  • 匿名内部类的细节
    • 匿名内部类可以通过多态的形式接受

      Inter i = new Inter(){
        @Override
          public void method(){
              
          }
      }
  • 匿名内部类直接调用方法

    interface Inter{
        void method();
    }

    class Test{
        public static void main(String[] args){
            new Inter(){
                @Override
                public void method(){
                    System.out.println("我是匿名内部类");
                }
            }.method(); // 直接调用方法
        }
    }
6.匿名内部类在开发中的使用
  • 当发现某个方法需要,接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去,来简化传统的代码

常用API1.Math
  • 1、Math类概述
    • Math 包含执行基本数字运算的方法

  • 2、Math中方法的调用方式
    • Math类中无构造方法,但内部的方法都是静态的,则可以通过   类名.进行调用

  • 3、Math类的常用方法
    方法名    方法名
    说明

    public static int   abs(int a)返回参数的绝对值
    public static double ceil(double a)返回大于或等于参数的最小double值,等于一个整数
    public static double floor(double a)返回小于或等于参数的最大double值,等于一个整数
    public   static int round(float a)按照四舍五入返回最接近参数的int
    public static int   max(int a,int b)返回两个int值中的较大值
    public   static int min(int a,int b)返回两个int值中的较小值
    public   static double pow (double a,double b)返回a的b次幂的值
    public   static double random()返回值为double的正值,[0.0,1.0)
2.System
  • System类的常用方法

方法名
说明

public   static void exit(int status)终止当前运行的   Java   虚拟机,非零表示异常终止
public   static long currentTimeMillis()返回当前时间(以毫秒为单位)
  • 示例代码
    • 需求:在控制台输出1-10000,计算这段代码执行了多少毫秒


    public class SystemDemo {
        public static void main(String[] args) {
            // 获取开始的时间节点
            long start = System.currentTimeMillis();
            for (int i = 1; i <= 10000; i++) {
                System.out.println(i);
            }
            // 获取代码运行结束后的时间节点
            long end = System.currentTimeMillis();
            System.out.println("共耗时:" + (end - start) + "毫秒");
        }
    }
3. Object类的toString方法
  • Object类概述
    • Object 是类层次结构的根,每个类都可以将 Object 作为超类。所有类都直接或者间接的继承自该类,换句话说,该类所具备的方法,所有类都会有一份

  • 查看方法源码的方式
    • 选中方法,按下Ctrl + B

  • 重写toString方法的方式
      • Alt + Insert 选择toString

      • 在类的空白区域,右键 -> Generate -> 选择toString


  • toString方法的作用:
    • 以良好的格式,更方便的展示对象中的属性值


4.Object类的equals方法
  • equals方法的作用
    • 用于对象之间的比较,返回true和false的结果
    • 举例:s1.equals(s2);    s1和s2是两个对象

  • 重写equals方法的场景
    • 不希望比较对象的地址值,想要结合对象属性进行比较的时候。

  • 重写equals方法的方式
      • alt + insert  选择equals() and hashCode(),IntelliJ Default,一路next,finish即可

      • 在类的空白区域,右键 -> Generate -> 选择equals() and hashCode(),后面的同上。



5.冒泡排序原理
  • 冒泡排序概述
    • 一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序

  • 如果有n个数据进行排序,总共需要比较n-1次
  • 每一次比较完毕,下一次的比较就会少一个数据参与

  • 代码实现


/*
    冒泡排序:
        一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,
        依次对所有的数据进行操作,直至所有数据按要求完成排序
*/
public class ArrayDemo {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {24, 69, 80, 57, 13};
        System.out.println("排序前:" + arrayToString(arr));

        // 这里减1,是控制每轮比较的次数
        for (int x = 0; x < arr.length - 1; x++) {
            // -1是为了避免索引越界,-x是为了调高比较效率
            for (int i = 0; i < arr.length - 1 - x; i++) {
                if (arr > arr[i + 1]) {
                    int temp = arr;
                    arr = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
        System.out.println("排序后:" + arrayToString(arr));

    }

    //把数组中的元素按照指定的规则组成一个字符串:[元素1, 元素2, ...]
    public static String arrayToString(int[] arr) {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                sb.append(arr);
            } else {
                sb.append(arr).append(", ");
            }
        }
        sb.append("]");
        String s = sb.toString();
        return s;
    }
}6. Arrays
  • Arrays的常用方法
    方法名
    说明

    public static String toString(int[] a)返回指定数组的内容的字符串表示形式
    public static void sort(int[] a)按照数字顺序排列指定的数组
  • 工具类设计思想
    1、构造方法用 private 修饰
    2、成员用 public static 修饰

7.扎包
路径:Tools->Generate JavaDoc Scope
​         Locale:               zh_CN         Other ...... :     -encoding UTF-8 -charset UTF-8
doy04封装1.封装的基本数据类型









byteshoetlongfloatdoublebooleanintchar
ByteShoetLongFloatDoubleBooleanIntegerCharactr2.Inteager对象描述一个int
Integer类构造方法
方法名
说明

public Integer(int   value)根据 int 值创建 Integer 对象(过时)
public Integer(String s)根据 String 值创建 Integer 对象(过时)
public static Integer valueOf(int i)返回表示指定的 int 值的 Integer   实例
public static Integer valueOf(String s)返回一个保存指定值的 Integer 对象 String
new   Integer("")
valueof()
3.int与String互换
int到String
​        int i= 5    String  s = i+"";
​        String.valueof();    //重点记这个
String到int
  • Integer.valueof("5")   i.intvalue()     
  • Integer.parseInt("5")

4.自动拆箱装箱
  • 拆箱:Integer i=Integer.valueOf(5);    int ii=i   //自动
  • 装箱:int i=5;         Integer ii=i;    //自动

时间日期1.Date类实例化
  • Date  d  =  new Date()   

  • Date类概述
    ​        Date 代表了一个特定的时间,精确到毫秒
  • Date类构造方法
    方法名
    说明

    public Date()分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒
    public Date(long date)分配一个 Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数
2.Date类常用方法
  • getTime():获取系统时间毫秒数
  • setTime():根据毫秒数设置时间
  • 常用方法
    方法名
    说明

    public long getTime()获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值
    public void setTime(long time)设置时间,给的是毫秒值
3.SimpleDateFormat格式化日期
  • 格式:yyyy  MM  dd  HH mm ss
  • 格式化:format()
  • 解析:parse()
  • SimpleDateFormat类构造方法
    方法名
    说明

    public   SimpleDateFormat()构造一个SimpleDateFormat,使用默认模式和日期格式
    public SimpleDateFormat(String pattern)构造一个SimpleDateFormat使用给定的模式和默认的日期格式
4.Calendar类用法
  • 获取:Calendar.getInstance()
  • get()
  • 根据日历字段,对指定日期进行加减:add(Calendar.YEAR,5)
  • set(2017,05,05)
  • Calendar类常用方法
    方法名
    说明

    public int   get(int field)返回给定日历字段的值
    public abstract void add(int   field, int amount)根据日历的规则,将指定的时间量添加或减去给定的日历字段
    public final void set(int year,int month,int date)设置当前日历的年月日
异常1.异常
异常的体系结构
​        file:///E:/java/%25E5%25B0%25B1%25E4%25B8%259A%25E7%258F%25AD%25E8%25AF%25BE%25E7%25A8%258B/%25E5%25B0%25B1%25E4%25B8%259A%25E7%258F%25ADse/day04/%25E7%25AC%2594%25E8%25AE%25B0/img/01.png?lastModify=1557211291
  • 概念:不正常的现象
  • 异常的体系结构
    • Throwable
      • Error:不可处理的异常
      • Exception:可处理的异常
        • RuntimeException: 运行时异常
        • 非RuntimeException:编译时异常



  • try:异常监视块
  • catch():捕获块
  • 定义格式

    try {
        可能出现异常的代码;
    } catch(异常类名 变量名) {
        异常的处理代码;
    }

2.Throwable成员方法
  • getMessage() 异常字符串
  • toString()简短异常消息
  • printStackTrace():详细异常消息
  • 常用方法
    方法名
    说明

    public String getMessage()返回此 throwable 的详细消息字符串
    public String toString()返回此可抛出的简短描述
    public void printStackTrace()把异常的错误信息输出在控制台
3.运行时异常和编译时异常
  • 运行时异常:无需显示处理
  • 编译时异常:必须显示处理

4.throws
  • 概念:回避异常

注意事项
  • 这个throws格式是跟在方法的括号后面的
  • 编译时异常必须要进行处理,两种处理方案:try...catch …或者 throws,如果采用 throws 这种方案,将来谁调用谁处理
  • 运行时异常可以不处理,出现问题后,需要我们回来修改代码

5.自定义异常
  • 步骤
    • 自定义一个类继承自Exception
    • 构造方法-> super(message)
    • throw


day05集合1.集合的特点
​        一种存储空间可变的存储模型,存储的数据容量可以随时发生改变.
file:///E:/java/%25E5%25B0%25B1%25E4%25B8%259A%25E7%258F%25AD%25E8%25AF%25BE%25E7%25A8%258B/%25E5%25B0%25B1%25E4%25B8%259A%25E7%258F%25AD%25E7%25AC%2594%25E8%25AE%25B0/day01-resource/01.png?lastModify=1557211291
  • 概念:可变长度数据容器
  • 体系结构:
    • 单列:Collection
      • 可重复:List  ArrayList LinkedList
      • 不可重复的:Set HashSet TreeSet LinkedHashSet

    • 双列:Map HashMap


2.Collection的概述和基本使用
  • 创建Collection接口对象的方式:Collection c=new  ArrayList();
  • 添加数据:add()

3.Collection集合的常用方法
  • 添加:add(Object j)
  • 删除:remove(Object j)
  • 清除:clear()
  • 判断是否为空:isEmpty()
  • 判断某个对象是否在集合存在:contains(Object j)
  • 长度:size()

4.Collection集合遍历
​        迭代器:
  • 如何去获取迭代器:      Iterator<String> it =集合 . iterator()
  • 判断是否还有元素:    while(it.hasNext()){
  • 取出对象:                           String  s  =  it . next();      sout(s)   }

5.list集合的概述和特点
  • 有序(有索引)
  • 可重复

6.list集合特有方法
  • 读取:get(i)
  • 添加:add(i,object)
  • 指定位置替换数据:set(i,object)
  • 删除:remove(i)
    方法名
    描述

    void add(int index,E   element)在此集合中的指定位置插入指定的元素
    E remove(int   index)删除指定索引处的元素,返回被删除的元素
    E set(int index,E   element)修改指定索引处的元素,返回被修改的元素
    E get(int   index)返回指定索引处的元素
7.集合并发问题及ListIterator用法
  • iterator():循环时不能修改集合数据
  • listIterator()  可以对集合进行修改   add() remove()

8.增强for循环
  • 语法格式:for(String str:集合或数组)

  • for(String s : 集合或数组){
        sout(s)
    }
9.数据结构之栈和队列
  • 栈结构
    ​        先进后出

      java.util.Stack jus = new java.util.Stack();
            jus.push("111");
            jus.push("222");
            jus.push("333");
            System.out.println(jus.pop());
            System.out.println(jus.pop());
            System.out.println(jus.pop());
  • 队列结构
    ​        先进先出


java.util.Queue q = new java.util.LinkedList();
        q.add("1111");
        q.add("2222");
        q.add("3333");
        System.out.println(q.poll());
        System.out.println(q.poll());
        System.out.println(q.poll());10.数组和链表的区别
  • 数组特点:查询块,增删慢---》ArrayList
  • 链表的特点:增删快,查询慢---》LinkedList

11.LinkedList特有方法
  • 添加: addFirst()  addLast()
  • 删除:removeFirst()  removeLast()
  • 获取:getFirst()  getLast()
  • 特有方法
    方法名
    说明

    public void addFirst(E e)在该列表开头插入指定的元素
    public void addLast(E e)将指定的元素追加到此列表的末尾
    public E getFirst()返回此列表中的第一个元素
    public   E getLast()返回此列表中的最后一个元素
    public E removeFirst()从此列表中删除并返回第一个元素
    public   E removeLast()从此列表中删除并返回最后一个元素
day061.Set集合
Set集合的特点
  • 元素存取无序
  • 没有索引、只能通过迭代器或增强for循环遍历
  • 不能存储重复元素

2.哈希值
哈希值的特点
  • 同一个对象多次调用hashCode()方法返回的哈希值是相同的
  • 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同

3.HashSet集合
  • HashSet集合的特点
    • 底层数据结构是哈希表
    • 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
    • 没有带索引的方法,所以不能使用普通for循环遍历
    • 由于是Set集合,所以是不包含重复元素的集合
    • HashSet集合的基本使用

      public class HashSetDemo01 {
          public static void main(String[] args) {
              //创建集合对象
              HashSet<String> hs = new HashSet<String>();

              //添加元素
              hs.add("hello");
              hs.add("world");
              hs.add("java");

              hs.add("world");

              //遍历
              for(String s : hs) {
                  System.out.println(s);
              }
          }
      }

4.HashSet集合保证元素唯一性源码分析
  • HashSet集合保证元素唯一性的原理
    ​        1.根据对象的哈希值计算存储位置
    ​            如果当前位置没有元素则直接存入
    ​            如果当前位置有元素存在,则进入第二步
    ​     2.当前元素的元素和已经存在的元素比较哈希值
    ​            如果哈希值不同,则将当前元素进行存储
    ​            如果哈希值相同,则进入第三步
    ​     3.通过equals()方法比较两个元素的内容
    ​            如果内容不相同,则将当前元素进行存储
    ​            如果内容相同,则不存储当前元素
  • HashSet集合保证元素唯一性的图解
    file:///E:/java/%25E5%25B0%25B1%25E4%25B8%259A%25E7%258F%25AD%25E8%25AF%25BE%25E7%25A8%258B/%25E5%25B0%25B1%25E4%25B8%259A%25E7%258F%25ADse/day06/%25E7%25AC%2594%25E8%25AE%25B0/img/01.png?lastModify=1557211291
    常见数据结构之哈希表

file:///E:/java/%25E5%25B0%25B1%25E4%25B8%259A%25E7%258F%25AD%25E8%25AF%25BE%25E7%25A8%258B/%25E5%25B0%25B1%25E4%25B8%259A%25E7%258F%25AD%25E7%25AC%2594%25E8%25AE%25B0/day01-resource/02.png?lastModify=1557211291
5.LinkedHashSet集合
LinkedHashSet集合特点
  • 哈希表和链表实现的Set接口,具有可预测的迭代次序
  • 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
  • 由哈希表保证元素唯一,也就是说没有重复的元素
  • LinkedHashSet集合基本使用

    public class LinkedHashSetDemo {
        public static void main(String[] args) {
            //创建集合对象
            LinkedHashSet<String> linkedHashSet = new LinkedHashSet<String>();

            //添加元素
            linkedHashSet.add("hello");
            linkedHashSet.add("world");
            linkedHashSet.add("java");

            linkedHashSet.add("world");

            //遍历集合
            for(String s : linkedHashSet) {
                System.out.println(s);
            }
        }
    }
day071.map集合的概述和特点
Map集合概述

interface Map<K,V>  K:键的类型;V:值的类型
Map集合的特点
  • 健值对方式存储数据
  • 一个键对应一个值
  • 健不允许重复,值可以重复
  • 无序

2.map集合常用方法
  • 添加:put(key,value)
  • 删除:remove(key)
  • 清除:clear()
  • 判断健是否存在:containsKey(key)
  • 判断值是否存在:containsValue(value)
  • 是否为空:isEmpty()
  • 长度:size()

3.map结合读取数据方法
  • 获取单个元素:get(key)
  • 获取所有健:keySet()
  • 获取所有的值:values()
  • 获取健和值的集合:entrySet()      Map.Entry<k,v>

4.Collections常用方法
Collections类的作用
  • ​        是针对集合操作的工具类

Collections类常用方法
  • 排序:sort()
  • 反转:reverse()
  • 洗牌:shuffle()

5.斗地主案例 package itheima04;


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;


/*
需求:
        通过程序实现斗地主过程中的洗牌,发牌和看牌。要求:对牌进行排序

    思路:
        1:创建HashMap,键是编号,值是牌
        2:创建ArrayList,存储编号
        3:创建花色数组和点数数组
        4:从0开始往HashMap里面存储编号,并存储对应的牌。同时往ArrayList里面存储编号
        5:洗牌(洗的是编号),用Collections的shuffle()方法实现
        6:发牌(发的也是编号,为了保证编号是排序的,创建TreeSet集合接收)
        7:定义方法看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
        8:调用看牌方法
*/
public class PokerDemo02 {
    public static void main(String[] args) {
        //创建HashMap,键是编号,值是牌
        HashMap<Integer, String> hm = new HashMap<Integer, String>();
        //创建ArrayList,存储编号
        ArrayList<Integer> array = new ArrayList<Integer>();
        //创建花色数组和点数数组
        String[] colors = {"♥", "♠", "♣", "♦"};
        String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K","A","2"};
        //从0开始往HashMap里面存储编号,并存储对应的牌。同时往ArrayList里面存储编号
        int index = 0;
        for (String number : numbers) {
            for (String color : colors) {
                hm.put(index, color + number);
                array.add(index);
                index++;
            }
        }
        hm.put(index, "小王");
        array.add(index);
        index++;
        hm.put(index, "大王");
        array.add(index);
        //:洗牌(洗的是编号),用Collections的shuffle()方法实现
        Collections.shuffle(array);
        //发牌(发的也是编号,为了保证编号是排序的,创建TreeSet集合接收)
        TreeSet<Integer> aaa = new TreeSet<Integer>();
        TreeSet<Integer> bbb = new TreeSet<Integer>();
        TreeSet<Integer> ccc = new TreeSet<Integer>();
        TreeSet<Integer> dp = new TreeSet<Integer>();
        for (int i = 0; i < array.size(); i++) {
            int x = array.get(i);
            if (i>=array.size()-3){
                dp.add(x);
            }else if (i%3==0){
                aaa.add(x);
            }else if (i%3==1){
                bbb.add(x);
            }else if (i%3==2){
                ccc.add(x);
            }
        }
        //调用看牌方法
        lookPoker("张三",aaa,hm);
        lookPoker("李四",bbb,hm);
        lookPoker("王五",ccc,hm);
        lookPoker("底牌",dp,hm);

    }
    //7:定义方法看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
    public static void lookPoker(String name,TreeSet<Integer> ts,HashMap<Integer,String> hm){
        System.out.print(name+"的牌是: ");
        for (Integer key:ts){
            String poker = hm.get(key);
            System.out.print(poker+" ");
        }
        System.out.println();
    }

    }

day08File类1.File类的概述和构造方法
  • 概念:文件和目录的抽象表示
  • 构造方法
    • new File("完整路径");
    • new File("目录",“文件”);
    • File file1=new File("目录")
    • File file2=new File(file1,"文件");


2.File类创建类方法
  • 创建文件:createNewFile();
  • 目录:mkdir() ;
  • 多级目录:mkdirs()

3.File类的判断和获取方法
  • 判断是否是目录:isDirectory()
  • 判断是否是文件:isFile()
  • 判断文件或目录是否存在:exists()
  • 名字:getName()
  • 路径:getPath()
  • 全路径:getAbsolutePath()
  • 获取目录下文件名:list()
  • 获取目录下文件:listFiles()
  • 绝对路径和相对路径的区别
    • 绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:E:\itcast\java.txt
    • 相对路径:必须使用取自其他路径名的信息进行解释。例如:myFile\java.txt


4.File类删除
  • ​        删除文件:delete()删除目录时,目录必须为空

递归5.不死神兔例子
  • f(1)=1
  • f(2)=1
  • f(3)=f(2)+f(1)=1+1=2
  • f(4)=f(3)+f(2)=2+1=3
  • f(5)=f(4)+f(3)=2+1=3+2

    public static int f(int n) {
            if(n==1 || n==2) {
                return 1;
            } else {
                return f(n - 1) + f(n - 2);
            }
        }
    递归的注意事项
    • 递归一定要有出口。否则内存溢出
    • 递归虽然有出口,但是递归的次数也不宜过多。否则内存溢出


6.阶乘
  • jc(1)=1
  • jc(2)=2*jc(1)=2
  • jc(3)=3*jc(2)=6
  • jc(4)=4*jc(3)=24
  • jc(5)=5*jc(4)=120


public class DiGuiDemo01 {
    public static void main(String[] args) {
        //调用方法
        int result = jc(5);
        //输出结果
        System.out.println("5的阶乘是:" + result);
    }

    //定义一个方法,用于递归求阶乘,参数为一个int类型的变量
    public static int jc(int n) {
        //在方法内部判断该变量的值是否是1
        if(n == 1) {
            //是:返回1
            return 1;
        } else {
            //不是:返回n*(n-1)!
            return n*jc(n-1);
        }
    }
}IO流 -->字节流7.流概述
IO流介绍
  • IO:输入/输出(Input/Output)
  • 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
  • IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载

  • 概念:数据传输的总成
  • 分类:   输入流   输出流
  • 工作方式:字节流 字符流
  • 使用场景   
    (1)纯文本文件,优先使用字符流
    (2)图片、视频、音频等二进制文件。优先           使用字 节流

   (3)不确定文件类型,优先使用字节流。字节流是万能的流
8.字节流写数据
  • 字节输出流:OutPutStream() FileOutPutStream("文件的路径")
  • 字节形式写数据:write() write(byte[]) write(byte[],off,len)
  • 释放资源:close()

9.字节流写数据的两个小问题
  • 换行:/r/n
  • windows:\r\n
  • linux:\n
  • mac:\r
  • 如何进行追加写:new FileOutPutStream("文件的路径",true)

  • finally try catch后必须要执行的代码块,做关闭资源的操作

          try{
            可能出现异常的代码;
          }catch(异常类名 变量名){
            异常的处理代码;
          }finally{
            执行所有清除操作;
          }

​     finally特点
  • 被finally控制的语句一定会执行,除非JVM退出

10.字节流读取数据
  • 字节输入流对象:InputStream() FileInputStream("")
  • 读数据的方法:
    read()     当-1时代表文件到结尾   
    read(byte[])返回值实际读取数据的长度,-1代表数据读取完成
  • 释放资源:close()


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马