javase我的笔记

学习java编程
   |--需要遵循其语法规范
   |--在其开发环境下编程
 

准备开发java环境
   |--安装jdk
   |--配置jdk



jdk:含义是java提供的一套开发工具,包含jre\编译器等 
   |--编译器(xx.java --- xx.class)
   |--jre(java运行环境)
         

环境搭建
    |--JAVA_HOME=安装目录11(C:\Program Files\Java\jdk1.8.0_191)
    |--PATH = %JAVA_HOME%\bin



jar包
   |--字节码文件(xx.class)的集合
          

java运行源码文件步骤
---------------------------

      反编译(反编译软件:JDB) 
源文件<------------------字节码文件         
xx.java ------>编译------>xx.class ------------>类加载器 ------------>jre
      javac Test.java                         java Test

 

案例:


    在桌面新建Test.java,内容如下
    public class Test{
        public static void main(String [] args){
           System.out.println("hello world");
        }
    }

    //dos下如下操作
    
    C:\Users\Administrator>cd /d C:\Users\Administrator\Desktop

    C:\Users\Administrator\Desktop>javac Test.java

    C:\Users\Administrator\Desktop>java Test
    
    hello world

IDE
   |--集成开发工具
       |--

       |--IDEA


eclise
   |--新建项目
        |--File  --> NEW -- > project --> java project -->Finish

        |--新建类

        |--开发工具会自动编译源文件(bin)

        |--右击
            |--run as 
                |--application 


项目的结构
   |--.classpath .project .settings 这是eclipse生成的。

   |--bin 字节码文件

   |--src 源代码


程序入口方法

    public static void main(String [] args) {


    }


//注释
    //含义:给程序员看的,一般描述当前代码的含义,方便代码的可读性。
           在编译成字节码文件注释会忽略

    //语法
       // 单行注释

       /*
          多行注释
       */

           文档注释  /** enter
              //类
                  //谁新建的
                  //时间
                  //作用

              //方法上
                  //作用
                  //作者
                  //参数说明

      //语法  

       /**
       *  
       *
       *
       */       


-------------------------------

//注释
    //含义:给程序员看的,一般描述当前代码的含义,方便代码的可读性。
           在编译成字节码文件注释会忽略

    //语法
       // 单行注释

       /*
          多行注释
       */

       文档注释  /** enter
          //类
              //谁新建的
              //时间
              //作用

          //方法上
              //作用
              //作者
              //参数说明

          //语法  

           /**
           *  
           *
           *
           */       

 

 java特点
    |--简单
    |--使用广泛
    |--跨平台(一处编写处处运行)
                |--给不同的平台安装不同的jvm
    |--面向对象
    |--...
    

关键字
   |--jdk已经用的标识符
       |--public void static if else ....

保留字
   |--预定的,但是现在还没有使用。
 

标识符
  |--含义:用来组成代码的符号。比如类名\包名\方法名\变量名\常量名...

     组成: _ 数字 $ 英文字母

     规范:
         不能数字开头

         中间不能有空格

         类名\接口名 每个单词首字母都是大写,其他小写

         包名全部小写

         变量名\方法名,第一个单词首字母小写,其他单词首字母大写,剩余的全部小写。
 
         常量全部大写


 转义字符: 
    使用”\”把其转化成字符的本身输出,那么使用”\”的字符称作为转义字符。
      \r  回车
      \n  换行
      \'  '
      \"  "
      \\  \


----------------------
常量
   |--含义:一旦赋值之后就不能再修改的。

   |--分类
        |--字面常量  10 
        |--final :就是在 变量 前面添加final 关键字

变量
   |--含义: 变量是程序中数据的临时存放场所,并且保存的值是可以被修改的。

   |--组成
        数据类型 变量名 [=初始值];

   |--常用操作
        修改
           变量名= 新值
        获取
           System.out.println(变量名);

      比如int age = 10;
      age =20;  //修改

      System.out.println(age); //获取

    |--注意
        |--在同一作用范围变量不能重复定义


java
   |--基本数据类型
        |--数字
             |--整数
                 |--byte short int long   区别范围不一样,语法
             |--小数点
                 |--float double
        |--布尔型
             |--boolean
        |--字符
            char

   |--引用数据类型(对象类型)
        |--|--数组
        |--String
        |--...

  
运算符的种类:
   赋值运算符:=、+=、﹣=、*=、/=、%=

   算术运算符: +、﹣、*、/、%、++、 --

   比较运算符:>、<、>=、 <=、= =、!=、instanceof

     ==用法
        |--用于比较基本数据类型,值是否一样
        |--用于比较引用数据库类型,比较是否同一个对象(即:比较对象的内存地址)
             String str1 = new String("str");
             String str2 = new String("str");
             System.out.println(str1==str2);//false,因为new会开辟一块新的内存

     instanceof 用于比较某个对象是否属于指定的类型
       String str1 = new String("str");
       System.out.println(str1 instanceof String);  

   逻辑运算符:!、&&、||
      操作数都是boolean型
      案例
         boolean sign = ! true;
         boolean sign = true && false;
         boolean sign = true || false;


  位运算符: &、|、^ 、 ~、>>、<<、>>>



  三目运算符: 表达式 ? 成立:不成立;
     int count = 29;
     int pageSize =10;
     int page = count%pageSize ==0 ? count/pageSize:count/pageSize+1; 


数据类型转换
   |--自动类型转换(存储范围较小的转成范围较大的)
      byte -- > short --> int -- > long -- > float --> double

   |--强制类型转换(存储范围较大的转成范围较小的)
      注意了:可能造成数据溢出

      int a = 10;
      byte b = (类型)a;

 
自动类型提升
    |--byte short char int 类型的操作数进行运算符操作结果类型都是 int
    |--类型较小和类型较大的结果类型是较大的
 
    案例

        byte a = 1;
        a = a+1;     //报错吗?为什么?

        byte a = 1;
        a +=1;       //报错吗?为什么?


快捷键
  |-- main + alt + /

  |--syso  + alt + /

  |--快速运行main ctrl + f11

  |--复制光标|选中  ctrl + alt + 上或下箭头

  |--移动光标|选中  alt + 上或下箭头

  |--多行编辑  alt + shift + a

  |--单行注释  ctrl + / 

  |--多行注释  添加 ctrl + shift + /  取消  ctrl + shift + \

  |--ctrl + z

  |--ctrl +1 快速修复


  条件结构
     if(){

     }

     if(){

     }else{

     }

     if(){

     }else if(){

     }else{

     }


作业

  // && &区别 

  // || | 区别

  //前置++ 后置++ 区别

  //==

  //instanceof 含义

  //类型如何转换

  //JAVA如何实现跨平台

  //自行定义常量、变量

  //你知道的命名规范有哪些

  //如何导入项目

  //如何到处可执行jar文件

  //eclipse设置
     //设置全局编码
     //调整文字大小

day3
switch
   |--含义:
   |--语法
       switch(需要比较的值){

           case 具体值1:
              //...
           breakcase 具体值2:
              //...
           breakdefault:
           break;
       }

    |--执行流程
        |--先匹配case,匹配到了执行case里面的代码,直到遇到break 或者 switch结束
    注意
       |--default可以放在case前面,也可以放在后面,建议后面
       |--case default 建议加上break;

       |--switch能用在byte short char int 
       |--String可以可以,但是需要1.7以上版本


循环
   while(条件){  
        循环体   
   }


   do{
        循环体   
   }while(条件);

   for(初始化一次;条件;每次循环之后执行的操作){

   }


死循环
   while(true){  
        循环体   
   }

   do{
        循环体   
   }while(true);

   for(;true;){

   }


控制
   |--break;     //终止当前循环
   |--continue;  //跳过当次循环,进行下一次


循环嵌套
   |--循环包含循环
        |--比如:99乘法表 TODO  

   |--如何结束最外层循环
        |--内层控制外层的循环条件
        |--标签
             label:for
                     for
                        break label;


 一维数组
    |--含义:存放相同数据类型的容器。内存是连续的。
    |--创建的方式
        |--数据类型 [] 名称;
        |--数据类型 [] 名称 = new 数据类型[大小;
        |--数据类型 [] 名称 = {元素1,...};

        |--注意:创建的数组对象是存放在堆中的,数组名是放在栈中的(数值就是数组对象的首地址)

    |--常用操作
        |--获取长度 数组名.length; 
        |--获取System.out.println(数组名[下标]); //下标从0开始

        |--修改数组名[下标] = 新值;

        |--常见异常
            |--数组下标越界
            |--空指针异常

        |--循环
            for(){

            }

            增强for

    |--作业
        |--元素交换


二维数组
   |--一维数组中元素又是一个一维数组;行和列组成
   
   |--创建方式
       |--数据类型 [][] 数组名;
       |--数据类型 [][] 数组名 = new 数据类型[行][列]; 
            //行:一定要写
            //列:可以不写
                   //如果不写:每一行都是null

                   //如果写:每一行的列是固定的,不是null的

       |--数据类型 [][] 数组名 = {{元素1,...},{元素1,...},...}; 
                   //每一行,列个数可能是不一样的


   |--常见操作
        |--获取多少行:数组名.length
        |--获取指定行的列数:数组名[指定行].length

        |--常见异常
            |--数组下标越界
            |--空指针异常

        |--作业
            从随机构造班级学员成绩,找出全班学员的最高分\平局分
            数据类似如下
                [31,98,98,78,6,71,87,98]  
                [85,58,98,78,6,72,87,98]
                [51,98,98,78,6,73,87,98]
                [61,88,68,78,6,74,37,98]
                [81,38,98,78,6,77,97,98]

            知识点
               |--Math随机生产整数
               |--二维数组定义
               |--二维数组数据的访问\修改
               |--二维遍历
--------------------------------------------------

  冒泡排序
       |--原始数据9 2 5 4 
       |--过程
           第一趟   2 5 4 9
           第二趟   2 4 5 9
           第三趟   2 4 5 9
 

    查找算法
        |--顺序查找
            {1, 2, 3, 4, 5}
            4所在的位置


        |--二分查找(折半查找)
            {1, 2, 3, 4, 5}  //有顺序 小-->大
            4所在的位置
            思路:
                 取中间值3 ,因为3!=4 && 4>3;所以下标从3开始到4结束。 

------------------------------------------------------
方法
   |--含义:处理某一个功能的代码集合。
   |--好处:可以重复使用。

   |--定义语法
        范围修饰符 其他修饰符 返回类型 方法名([参数类型 参数名,....]){  //形参
            方法体
            [return 返回数据]
        }

        //入口
        public static void main(String [] args){

        }

        范围修饰符:public private protected 不写

        其他修饰符:static final synchronized


        返回类型是java的数据类型其中一个

        方法名:合法标识符

        参数类型是java的数据类型其中一个

        参数名:合法标识符

        返回数据:必须和返回类型匹配

  |--方法调用
       方法名(实参,实参N,...);
       类型 变量名 = 方法名(实参,实参N,...);

  |--return
       |--方法调用结束了。方法结束。
       |--return的数据类型要和返回类型匹配

       


 方法调用的本质
    |--方法的入栈和出栈的过程。

    
 递归
     含义:有限次数的自己调用自己,如果调用的深度太深容易造成栈溢出


//方法重载
   |--在同一个类中,方法的名字相同

   |--必须满足如下条件

       |--方法名字一样

       |--参数不同
           |--参数个数
           |--参数的类型

       |--与方法的返回类型没有关系

 
//面向过程 
    //含义: 
          实现一个功能的一组命令组合成为一个函数;

    //遇到的问题
          当项目庞大的时候,函数越来越多,很容器造成命名冲突。不适合大型软件开发。


//面向对象
    //含义
       从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位。


抽象
   |--含义:只关注与处理问题相关的。

对象
   |--含义:具体存在的事物。 

 类
    |--含义:对 对象的一种分类。具有相同属性和行为。对象是类的一个实例。

  

//类的定义
    //含义:

    //如何定义
        //范围修饰符 其他修饰符  类名{
             0-N个属性描述;
             0-N个方法描述;
        }

//对象
    //含义:类的具体存在的事物。

    //常用操作
        //创建对象
        //设置||获取属性值
        //调用对象的方法
        //打印对象
        //对象比较

 //成员变量和局部变量





-------------------------------------------
冒泡排序

选择排序
   |--含义:选择指定位置的元素,然后将它和后面的依次比较,如果   大于  的话,就交换位置。经过一轮可以确定最小值。
   2 3 1  0
   

   一轮
   2 3 1 0

   1 3 2 0

   0 3 2 1

   二轮  0 3 2 1

   0 2 3 1

   0 1 3 2

   三轮   0 1 3 2
   0 1 2 3
---------------------------------------
二分查找
   |--前提:要有顺序
   |--含义:....


构造器
   |--含义:创建并返回对象\初始化对象;是一个特殊的方法
   |--语法
        |--修饰符  类名([参数1,...]){
               初始化逻辑
           }

   |--特殊
         |--不能return 任何数据。
         |--构造器名字必须和类名一样
         |--不能有返回类型,包括void


 默认构造器
    |--含义:自带的无参构造器,如果添加了其他构造器,默认的构造器就会失效。
    |--


   匿名对象
       |--含义:没有名字的对象 || 没有在栈中引用的对象;
       |--特点
           |--只能使用一次,并且使用之后就变成垃圾对象,GC就会回收。


this
    |--含义:当前对象本身
    |--使用场景
        |--调用构造器
        |--方法链
        |--方法参数的二义性
  
GC
   |--Garbage Collection,是JVM中优先级较低的线程,用于回收在   堆中  没有引用的对象;
   |--如下场景会被回收
        Persion p = new Persion(); p=null;
        new Persion().say();
        超出作用范围
           if(true){
              Persion p = new Persion();
           }


   |--当GC回收对象的是,会先调用对象的finalize方法

   |--System.gc();  //让GC执行一次回收操作。

   


static修饰符

成员变量细分

成员方法细分

变量细分 & 生命周期
     变量类型    存放位置 生命周期开始  生命周期结束
     --------------------------------------------


作业
什么是类?什么是对象?类和对象的关系?
类是属性行为相同的方法集合的地方。
对象是通过类实例化出来的

构造器含义?构造器可以重载吗?
含义:每一个类都有一个构造器,创建并初始化对象的一种特殊方法
可以重载,但是必须不同参数类型和数量


this 含义?使用场景?并编写案例
 含义:当前对象
场景:调用构造器        
          方法参数的二义性   this.age=age
    方法链             
public 类名 add(int param) {
        result = result+param;
        return this;
    }
new 类名().add(1).add(2).add(3);

super含义?使用场景?并编写案例
含义:调用本类的父类构造器
场景:当子类 继承 父类 时,需要用到super来继承父类的构造器
当父类构造器已被修改为有参构造器时,子类继承时也要改为super(参数)


static修饰符可以修饰什么?什么是类级别方法?什么是对象级别方法?

修饰:
属性
代码块
方法

static属于类级别方法


封装的理解
通过在类中给变量赋予私有变量private,在加上调用setter和getter方法,实现隐藏代码,对输入输出进行限制,只允许用户调用方法来操作变量,增加安全性
继承的理解

方法重写含义?注意点有拿些?

static{ } 和 {}的区别
前者加载类时就实现一次,后者调用对象一次就实现一次,后者可以实现多次
抽象类和接口的区别
抽象类 下的抽象方法,在子类中若继承了父类抽象类,则必须实现父类提供的方法,否则自身变为抽象类
抽象类不能被实例化
抽象方法不能加static 因为会需要子类的重写
抽象类中可以全部为抽象方法,也可以不一定全是抽象方法
抽象类有构造器

接口
可以实现多继承
即interface A extends B,C ()....
若一个类要实现某一个接口,则必须实现它的所有抽象方法,否则这个类就变成抽象类

多态含义?,实现机制?自行编写案例
同一个接口,使用不同的类进行不同的操作即为多态

单例含义?自行实现一个饿汉式案例
使得一个类只能被访问一次,打印出的地址都为一个样

GC是什么?
垃圾回收机制,jvm线程会在创建的对象无用时对其进行回收即自动释放,gc作用于堆内存,于栈无关

1、定义一个点类Point,
包含2个成员变量x、y分别表示x和y坐标,
2个构造器Point()和Point(int x0,y0),
以及一个movePoint(int dx,int dy)方法实现点的位置移动,
创建两个Point对象p1、p2,分别调用movePoint方法后,
打印p1和p2的坐标。[必做题]


2、定义一个矩形类Rectangle: [必做题]
2.1  定义三个方法:getArea()求面积、getPer()求周长,showAll()分别在控制台输出长、宽、面积、周长。
2.2  有2个属性:长length、宽width
2.3  通过构造方法Rectangle(int width, int length),分别给两个属性赋值
2.4  创建一个Rectangle对象,并输出相关信息

3、定义一个笔记本类,该类有颜色(char)和cpu型号(int)两个属性。 [必做题]

3.1 无参和有参的两个构造方法;有参构造方法可以在创建对象的同时为每个属性赋值;

3.2  输出笔记本信息的方法

3.3  然后编写一个测试类,测试笔记本类的各个方法。



4、定义两个类,描述如下: [必做题]
  4.1定义一个人类Person:
    4.1.1定义一个方法sayHello(),可以向对方发出问候语“hello,my name is XXX”
    4.1.2有三个属性:名字、身高、体重
  4.2定义一个PersonCreate类:
    4.2.1创建两个对象,分别是zhangsan,33岁,1.73;lishi,44,1.74
    4.2.2分别调用对象的sayHello()方法。


5、设计一个类Student,该类包括姓名、学号和成绩。设计一个方法,按照成绩从高到低的顺序输出姓名、学号和成绩信息。

6、定义一个汽车类Vehicle,要求如下:[选做题]
    6.1属性包括:汽车品牌brand(String类型)、颜色color(String类型)和速度speed(double类型),并且所有属性为私有。
    6.2至少提供一个有参的构造方法(要求品牌和颜色可以初始化为任意值,但速度的初始值必须为0)。
    6.3为私有属性提供访问器方法。注意:汽车品牌一旦初始化之后不能修改。
    6.4定义一个一般方法run(),用打印语句描述汽车奔跑的功能
    6.5定义测试类VehicleTest,在其main方法中创建一个品牌为“benz”、颜色为“black”的汽车。

-------------
    final          |--常量
       |--含义:类、定义常量、方法名
               |            |--含义:该方法不能被子类重写
               |--含义:该类不能被继承

    static
       |--含义:修饰的都属于类级别
                            |--可以直接通过  类名.来调用
       |--修饰内容:
             |--方法名
                  |--类名.
                  |--对象.  x

             |--成员变量
             |--成员常量

             |--类名

    继承
        |--含义:把相同的属性、行为提取到父类,子类通过继承就可以获得父类的属性、方法
        |--注意点
            |--单继承
            |--一切类直接或者间接的继承了Object

    方法重写:
        |--含义:父类方法不满足子类的要求。
        |--注意点
            |--@overried注解表示,当前方法是重写父类的
            |--重写方法的范围修饰符要>=原来的。
            |--不能抛出比父类更大的异常
            |--静态方法不能重写
            |--final修饰的不能被重写


    this
       |--含义:当前对象
       |--使用场景
            |--构造器之间调用
            |--避免参数二义性
            |--构造方法链
                |--TODO 
    super
       |--含义:父对象
       |--使用场景
            |--调用父类的构造器
            |--调用父类的方法
            |--调用父类的属性

    封装
       |--含义:隐藏内部实现,对外提供公共的方法。
       |--如何实现
           |--属性设置成private的,如果外部能设置就提供setter、如果外部需要获取就提供getter方法
           |--范围修饰符能越小就越小
           |--boolean 不要is开头


      
    抽象类  
       |--含义:具体子类 一定 要实现父类的抽象方法.
                         |--因为:不同的子类有不同的实现。将其实现放在父类是不合理的。
       |--语法
            abstract class

    抽象方法
       |--没有方法体的方法,抽象方法必须在抽象类中.

       |--语法
           方法的返回类型前 abstract,并且该方法没有{};


    注意点:
       |--抽象类不可以是final,抽象方法不可以是final,
       |--抽象方法不可以是static
       |--抽象类可以没有抽象方法;但是抽象方法一定是在抽象类中
       |--抽象类的构造器不能否全部都是私有的
       |--抽象类可以有普通方法
       |--具体子类是通过继承(extends)



    接口
       |--含义:特殊的抽象类
                |--没有构造器
                |--没有普通方法
                |--全部方法都是抽象的
                |--不能有成员变量

       |--注意点
           |--全部方法都是抽象的,并且修饰符 public abstract  
           |--属性修饰符都是 public static final 
           |--不能直接new
           |--具体子类是通过实现(implements) 


    如何选择?
       |--接口优先

    多态
       |--含义:一个事物多种状态;只有运行的时候才能确定。
       |--原理
            |--实现接口
            |--通过继承
 

   子类实例过程
       |--含义:调用子类的构造器,会先调用父类的构造器创建父对象,然后在创建子对象。


   单例
      |--含义:在程序运行期间最多只会创建一次。
                                
      |--方式
           |--饿汉式
               |--私有的构造器--->避免外部重复new
               |--定义一个private static final 常量
               |--对外提供public static 获取实例的方法
           |--懒汉式


  代码块
      |--普通代码块 
        {

            //创建一个对象都会执行一次
        }

      |--静态代码块
            static{
                 //只会执行一次,类加载的时候
            }


  内存模型
     |--含义:
          |--堆:存放对象的;(数组,User,字符串,...)
          |--栈:变量名


  GC
     |--含义:Garbage Collection
            是一种优先级较低的线程,会检查堆内存中没有被引用的对象,然后回收。
   


----------------------------------------------------------------------------
Object
   |--含义:一切类的根类。
   |--常见的方法
        |--hasCode  //根据对象的地址计算出来的。
         //hasCode
                //含义:返回对象的哈希码值(是根据对象存放的地址),编号
                //同一个对象多次调用hasCode值都是相同的。 
                //多次启动程序创建的同一个对象那个hasCode可能不一样。

        |--equals   //里面是==实现的     
            //一般情况会重写上述两个方法
                  //source-->equals hasCode

        |--Class clazz = getClass();  //获取的是字节码对象<----字节码文件

        |--finalize   //当GC回收对象会调用该方法

        |--toString  //打印对象
            //本质打印对象.toString();
            //com.neuedu.day04._01ObjectDemo@15db9742
    |--类名(全限定名) com.neuedu.day04._01ObjectDemo 
          
    |--简单名  _01ObjectDemo

包装类型
        |基本装拆
          //基本类型  变成   包装数据类型,装箱
            Byte data2 = Byte.valueOf(temp);
            //包装类型  变成   基本数据类型,拆箱
            byte data3 = data2.byteValue();  
            
           |-- 自动装拆
            byte data4 = 10;
            Byte data5 = data4;  //自动装箱
            
            data4 = data5;       //自动拆箱
           |--面试
               //有了基本数据类型,为什么要有包装数据类型?
                   //包装数据类型的默认值,可以表示特殊的含义
                   //包装数据类型提供了其他api
                         //解析字符串为基本数据类型:parseXX



|--工具类
    |--String类
        //字符串
            //本质:final的字符数组
            //final修饰的,不能被继承
        
            //字符串是不可变的
        String str1 = "test";
        String str3 = "test";
        //因为有缓存功能,所以str1==str3,比较内容时可以用equal
    |--常用的方法
             //equals  equalsIgnoreCase
             //trim
             //startsWith
             //endsWith
        //replace("old str","new str")
        //contains
        //substring
        //indexOf
        //lastIndexOf
        //length
        //charAt
      |--stringbuilder
        //常用api  String
        //SB.toString()
        //SB.append
        
        //SB.length()
        //SB.substring(start)
        //SB.indexOf(str)
        //SB.lastIndexOf(str)
        
        //SB.delete(start, end)
        //SB.deleteCharAt(index)
        
        //SB.replace(start, end, str)
        
        //SB.reverse
        
        //StringBuilder
            //含义:内容可以改变的字符串
    |--stringbuffer
        //StringBuffer 和  StringBuilder
                //含义和方法基本上一样
    
        //区别
            //StringBuffer的方法有synchronized修饰

    |--math
        //Math.ceil(x)大于x的最小整数
        //Math.floor(x)小于x的最大整数
        //math.round(x)正数-》四舍五入,负数-》+0.5后向下取整  //Math.round(-6.4));   

日期
//日期
        //Date 不用了
        //Calendar   //Calendar cal = Calendar.getInstance();  当前时间的日历对象
        //SimpleDateFormat
            
        //创建方式1
        //SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
        //simpleDateFormat.applyPattern(pattern);
        //创建方式2
        //SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd HH:mm:ss");


        //使用2
        Date date = new Date();
        simpleDateFormat.format(date);//将date格式化//2019年07月21 16:29:41
        
        String result = simpleDateFormat.format(date);
        date = simpleDateFormat.parse(result);//将格式化后的时间进行解析2019-7-21 23:13:32
数组
        //Arrays
        //含义:提供对数组的常用api
        //常用api
            //toString   数组转成字符串
            //binarySearch 负数说明不存在
            //copyOf   复制
            //copyOfRange
            //sort 排序



异常
        //ClassNotFoundException 什么类型的异常
    
    //运行时,非检查RunTimeOutException 经验高质量代码解决
    
    //非运行时,检查,可能产生该异常,则必须写出相应的处理代码,否则无法通过编译
        //ClassNotFoundException



异常
   |--含义:代码出错了 || 有可能出错。不是语法错误。
   |--体系结构
           Throwable
              |--Error (非常严重)
                   |--栈溢出        //
                   |--内存溢出      //
                   |--....
              |--Exception
                   |--RuntimeExcpetion
                         |--含义:非检查异常,代码运行着就报错了,往往都是代码不严谨。
                         |--方案:代码严谨性
                         |--常见的
                              |--算术异常 0/0  
                              |--数组下标越界
                              |--空指针异常

                   |--非RuntimeException
                         |--检查异常
                         |--含义:代码有可能会错误,所以要处理这些错误。不处理编译不通过。
                         |--处理方式
                               |--自行处理
                                    try  catch 
                                    try finally
                                    try catch finally

                               |--抛出
                                    throw e  在方法声明后面throws 异常种类

//自定义异常
    //含义:果Java提供的异常类型不能满足程序设计的需要,我们可以定义自己的异常类型。

    //方案:
       |--继承Exception

       |--继承RuntimeException

------------------------------------------------------------------------------------------

串行
  |--含义:强调按照顺序执行

并行
  |--含义:同一时刻多个事物一块执行。 

并发
   |--含义:一段时间范围,多个事物执行。 //时间段

单个cpu,一遍听音乐,一遍写代码,
   |--微观角度不行,
   |--宏度角度可以的。   //cpu调度

//进程
    //含义:正在运行的软件
                    //一个软件可以可以有多个进程
    //特点
        //有自己独立内存,进程独享.


//开软
   //一遍音乐
   //打游戏
 

xx
   |--音乐进程

   |--游戏进程

   |--聊天进程

   |--....


线程
   |--含义:
       //执行索引(分之)。

   |--使用场景
       //多个任务,比如:批量发送邮件

       //多线程文件下载: TODO 
            
       //模拟多个人抢票
  
       //....

   |--如何创建
       |--extends Thread
       |--implment Runnable
            //有线程安全问题

       |--区别
            |--通过继承方式不能共享同一份资源;通过实现接口方式是可以的。
            |--通过实现接口方式有线程安全问题
            |--java是单继承的,第一中方案不能在继承其他类,第二种方案是可以的。

        //

概念
    |--串行:多个事物依次执行。
    |--并行:同一时刻多个事物一块发生。
    |--并发:一段时间内多个事物发生。   

    |--进程:一个正在运行的软件(程序);都有自己 独立 的内存空间;  
               //可以有多个进程。

    |--线程:执行的索引(分之);没有独立的内存空间;不能脱离进程。

    |--创建方式
         |--extends Thread
         |--implements Runnable

    |--区别:
         //继承方式不能独立共享资源;实现接口方式可以
         //实现接口方式可以继承其他类。
         //实现接口方式可以共享资源,所在修改资源的时候会有线程安全问题。
                                                        //如何处理
                                                              //监视对象,监视同一时刻只能有一个线程修改资源
                                                                    //同步方法  synchronized
                                                                         //static 字节码对象
                                                                         //非static this
                                                                             

                                                                    //同步代码块
                                                                            synchronized(this||字节码对象){
                                                                            }

                                                                    //
                                                                    try{


                                                                    }finally{
                                                                          //释放锁
                                                                    }

    |--api
        getName
        getId
        Thread.currentThread(); //获取当前线程

        setProirity    //设置优先级  (1 5(default) 10)
        getProirity    //获取优先级

        join()         //加入

        interrput      //中断

        Thread.sleep(long millstime); 睡眠,不会释放锁

        Object
            wait
            wait(long mills)

            notify
            notifyAll


    |--生命周期

    |--生产者 VS 消费者
 --------------------------------------------------------------


 集合
    |--Map
        |--HashMap
        |--LinkedHashMap
        |--TreeMap
        |--HashTable
        |--Properties

    |--Set
        |--HashSet
        |--TreeSet


    |--List
        |--ArrayList
             |--含义:封装了对数组的常用操作,底层采用变长数组来存储数据。
        |--LinkedList
        |--Vectory
        |--Stack
        |--Queue
        |--Deque
--------------------------------------------------

数组 [1,2,3,4,6,7]
   |--特点
        //大小固定;下标查询快;修改快;插入慢;删除慢;

   |--操作
        |--删除:手动移动元素
        |--添加:手动移动元素
        |--...
            


class ArrayList{

      private Object datas[];

      private int size;  //元素个数

      public ArrayList(){
            datas = new Object[10];
      }

      //datas 添加一个数据
      public void add(Object data){
          //...

          if(size==10){

              //扩容
             datas =  Arrays.copy

          }else{
              //继续添加
          }
      }

      public Object get(int index){
          //...
      }

      //.......都是操作数组 
}
 
 




Collection
   |--Set
        |--HashSet 含义:Hash--->hasCode
             |--LinkedHashSet
                  |--底层采用LinkedHashMap


   
   |--List

        |--LinkedList 链表
             |--查找、更新慢
             |--删除|添加快
   |--Queue
        |--Deque

|--Map
       |--HashMap
             |--LinkedHashMap


       |--Hashtable
             |--Properties
                   |--可以加载配置        |--ArrayList

        |--SortedMap
             |--TreeMap 采用二叉树(红黑树)  二叉树
                  |--含义:采用红-黑树存储数据结构
                  |--api
                       |--基本HashMap一样

                  |--注意点
                       |--要提供一个比较器或者key要实现Comparable接口
                       |--key 
                            |--有序,顺序和compareTo || compare 返回-1 或者 1有关系 不可以重复
                                    |--重复的依据是compareTo || compare 返回0

                       |--添加的元素有没有顺序
    |--Set
         |--


 



 集合
     |--存放对象
          |--存放对象的引用 VS 数据


ArrayList

HashMap






















       |--Vector
             |--方法基本上和ArrayList一样,线程安全的
回顾
----------------
   集合
       |--Collection
             |--List   
                  |--ArrayList:底层采用数组,是一种变长;   [有序可以重复]
                        |--Vector(线程安全的)
                             |--Statck
                  
             |--Queue(单向队列)                         [有序可以重复]
                  |--Deque(双向队列)     
                        |--LinkedList(链表) 双向链表(TODO 是否循环链表) (implements List)


            |--Set
                |--HashSet(底层采用HashMap来存储的)【无序】
                      |--LinkedHashMap(底层采用LinkedHashMap来存储的)  【有序】

                |--TreeSet ....

                ----------------------------

             
       |--Map


            |--SortedMap 【有序】                              |--重复的依据:比较返回0
                 |--TreeMap 【api和HashMap几乎一样】  [有序,key不可以重复]
                      |--注意:因为需要排序,所以需要比较
                                                   |--方案一:构建TreeMap的时候传递一个比较器
                                                   |--方案二:key必须实现Comparable接口


                                                                             |--hasCode一样,equals返回true
            |--HashMap (哈希表:存储结构数组+链表)链表:什么情况下会产生??   【无序,key不可以是重复】
                                                   添加hasCode对应的位置有元素,但是他们两个的equals返回为false
                 
                 |--LinkedHashMap【有序】

            |--Hashtable【无序】 syschronized
                 |--Properties


            //HashMap Hastable
                //Hashtable是重量级的HashMap,线程安全
                //HashMap的key 和 value都可以是null,Hashtable是不可以的。
                //都是无序的,都实现了Map接口

------------------------------------------------------------------------------------

----------------------------------------------------
泛型
    |--含义:参数化类型,类型用一个参数来表示,可以确定操作数据的类型。
    |--作用
         |--确定数据类型
         |--避免强转
    |--用法
         |--类\接口\方法返回类型\方法参数

         public MyArrayList<T extends BaseDTO>{  //T进一步约束,代表T 一定是BaseDTO的子类

              public void add(T t){

              }

              public T get(int index){
                   return null;
              }

         }

         |--其他用法
              List<? extends XX>  //? 是XX本身或者是XX的子类

              List<? super XX>    //? 是XX本身或者是父类

         |--
            public static  <T> T get() {
                Object obj = "xx";
                return (T) obj;
            }

IO  
    |--File
         |--含义:文件或文件夹
         |--api
              |--如何创建对象
              |--获取文件名
              |--获取绝对路径
              |--创建文件
              |--判断是否存在
              |--删除文件
              |--判断是文件还是文件夹
              |--列出子文件 

    |--FileInputStream 
         |--read()
         |--read(byte [] temp)
         |--close



    |--FileOutputStream
         |--write
         |--close
 

    |--字符流(一个一个字符读取)
        Reader
            |--FileReader    
            |--BufferReader   //可以一行一行
        Writer
            |--FileWriter
            |--BufferWriter


//思路
   //cope


   创建输入流  input  字节
   创建输出流  output

   //复制的逻辑(边读边写)

   int len = -1;
   byte [] temp = new byte[1024]; //
   while((len=input.read(temp))!=-1){
     output.writer(temp,0,len);
   }




//io
//socket
//swing
    //



-----------------------------------------
Server                                         
   |--ServerScoekt SS =  new ScoektServler(8080);
      Socket socket = SS.accept();  //等待客户端连接  

      socket.getInputStream();

      socket.getOutputStream();  //将数据响应给客户端

      //自行关闭


 Client
    |--Socket socket = new Socket("127.0.0.1",8080);

      socket.getInputStream();

      socket.getOutputStream();  //将数据响应给客户端

      //自行关闭
posted @ 2019-10-19 21:21  FA发  阅读(128)  评论(0编辑  收藏  举报