• Java学习记录


    Java快速入门

    Java基本知识

    • Java 最大的特点跨平台

    • JavaSE(个人版)、JavaEE(企业版)、JavaME(微型版,用于消费电子产品开发)

    • Java地位类似Windows

    Java运行机制

    • 运行流程:源文件(.java)---[Javac编译器]--->字节码(.class)---[JVM虚拟机]--->可执行程序

    • JDK JRE JVM之间的关系

      JDK(Java Development Kit)

      ​ 调试器、编译器(javac)

      JRE(Java Runtime Environment)

      ​ 库函数

      JVM(Java Virtual Mechine)

    Java方法

    方法的重载

    定义:名字相同,参数不同(要求功能类似)

    int add(){...}; int add(int a){...}

    面向对象

    • 对象类似表格,由属性和方法组成
    • 面向对象是一种设计者思维,组装

    内存机制

    • 栈:负责函数运行,main开始
    • 堆:负责存储对象部分
    • 方法区:负责存储类的不变部分(方法、常量)

    垃圾回收机制

    原理:

    • Java的内存管理很大部分是堆中对象的释放
    • 堆分为3个部分:年轻代(Eden区+Survivor1区+Survivor2区)、年老代、永久代(元数据空间)
    • 有3种回收器:Mini GC(负责年轻代)、Major GC(负责年老代)、Full GC(全部都可以负责)
    • System.gc()可以建议系统进行垃圾回收

    算法:

    • 引用计数法
    • 引用可达法

    静态和普通

    普通属性、普通方法有this指针(隐式参数),区分和局部变量相同的普通属性,如this.a=a,再构造函数中调用重载的构造函数时显示使用,如

    Test(int a, int b){
        this.Test(a);
        ...
    }
    

    静态属性、静态方法没有this指针,有静态构造方法,用于静态属性的初始化,即

    static{
        ...
    }
    

    package 和 import

    package作用就是对类进行分类存放,使其有条理性,一定程度上解决类同名问题。

    import导入有两种

    • 导入类
    import java.lang.Math; //导入java.lang.Math类
    import java.lang.*; //导入java.lang包下的所有类
    
    • 导入静态变量或者静态方法
    import java.lang.Math.PI; //导入PI静态变量
    import java.lang.Math.random; //导入random()静态方法
    import java.lang.Math.*; //导入Math类下所有静态变量和方法
    

    重写Override

    要求:

    • ==:方法名、形参列表相同
    • <=:返回值类型、声明异常类型,子类小于等于父类
    • >=:访问权限,子类大于等于父类

    组合

    对象持有另一个对象

    封装

    目的

    • 高内聚、低耦合:高内聚指的类内部数据操作细节自己完成,不允许外部干涉;低耦合指的是仅暴露少量的方法给外部使用,尽量方便外部调用。举例:手机高内聚,所有的实习细节都封装在手机壳里面,并且独立运行,手机也是低耦合,对外部只有屏幕、充电口、开关、音量调节按钮而已。

    实现

    • private: 类内友好

    • (default): 包内友好

    • protected: 包内友好、父子友好

    • public: 全局友好

    get set方法

    封装的一般方法是将属性都设置为private,然后外部通过set get函数进行访问。

    多态

    同一个方法,不同对象调用方法完全不同

    对象类型转化

    • 向上转化(子类转化为父类): 自动转化
    • 向下转化(父类转化为子类): 强制转化,(子类类型)对象

    抽象类

    抽象方法:只有方法名没有实现,前面加abstract。

    含有抽象方法的类就是抽象类,抽象类不能产生对象,子类必须实现抽象父类的抽象方法。

    接口

    基本格式:

    控制符 interface 接口名 [extends 接口1, 接口2, ...]{
        //常量
        /*public abstract final*/数据类型 变量名 = 值;
        //抽象方法
        /*public abstract*/返回类型 方法名(形参列表);
        //默认方法
        default 返回类型 方法名(形参列表){...}
    }
    

    接口是一种规则,需要类来实现.

    内部类

    内部类是为了封装而生的,是编译才有的概念

    有4种内部类:

    • 成员内部类

      • 非静态内部类

      • 静态内部类

    • 匿名内部类

    只使用一次,所以不需要名字

    • 局部内部类

    在方法中定义类

    数组

    数组的创建

    数组的初始化

    • 静态初始化
    • 动态初始化
    • 默认初始化

    数组的常用操作

    数组遍历

    • for(int i=0; i < array.length; ++i)
      
    • for(int i:array)
      

    数组拷贝

    数组的打印、排序、查找、填充

    利用Array类中的方法

    • 打印: Array.toString(数组对象)

    • 排序: Array.sort(数组对象),该类数组对象需要实现comparable接口,comparable中有compareTo()方法需要实现

    • 查找: Array.binarySearch(数组对象,查找元素)

    • 填充: Array.fill(数组对象, 开始pos, 结束pos, 填充元素)

    二维数组

    即数组的数组

    总结

    • JDK、JRM、JVM的包含关系

    • .java --javac-->.class--JVM-->可执行文件

    • 基本数据类性,引用类型 (基本数据类型也有对应的应用类型)

    • 类和对象

    • pacakage 包名;
      
      import 包名.类名(*);
      import static 包名.类名.静态方法;
      
      /*
      类的成员有属性、方法、内部类
      类和成员都有修饰符:
         1.public protected default private
         2.static final abstract
      */
      
      public class 类名(和文件名一致) [extends 父类名]{
          //属性
          //构造方法
          修饰符 构造方法(形参列表){
              
          }
          //方法
          
          //静态内部类
          public static class A{
              //静态成员
          }  
          
          //非静态内部类
          public class B{
              
          } 
      }
      
      
    • 类和对象的存储(JVM内存模型)

      • 栈(存放方法,从main方法开始)
      • 堆(对象)
      • 方法区(方法、静态成员、常量池)
    • 接口

      public interface 接口名 [extends 接口1, 接口2, ...]{
          [public static final] 类型名 属性名 = 值;
          [public abstract] 返回类型名 方法名(参数列表);
          
          //补充默认方法
          default 返回类型名 方法名(形参列表);
          
          //补充静态方法
          static 返回类型名 方法名(形参列表);
      }
      
    • 封装

      public protected (default) private 的作用范围

    • 继承

      • 类继承 (单) 接口继承(可多)
      • super
      • 重写 @Override
    • 多态

    Java 基础深化与提高

    泛型与泛型类

    容器

    基本结构

    • Collection接口

      • Set接口

        • HashSet类
        • LinkedHashSet类
        • TreeSet类
      • List接口

        • ArrayList类
        • LinkedList类
        • Vector类
    • Map接口

      • HashMap类
      • LinkedHashMap类
      • TreeMap类
      • Properties类
      • HashTable类

    Collections接口

    //查看基本信息
    int size();
    boolean isEmpty();
    //增删操作
    boolean add(Object element);
    boolean addAll(Collections c);
    boolean remove(Object element);
    boolean removeAll(Collections c);
    boolean retainAll(Collections c); //只保留与容器c交集的元素
    void clear();
    //查看
    boolean contains(Object element); //是否包含某个元素
    boolean containsAll(Collections c);
    //迭代器
    Iterator iterator(); //返回迭代器,用于容器遍历
    //转化
    Object[] toArray();  
    

    List接口

    特点:有序+可重复

    //增加操作
    boolean add(int index, Object element);
    //删除操作
    boolean remove(int index);
    //修改操作
    boolean set(int index, Object element);
    //查看/查找
    Object get(int index);
    int indexOf(Object element);
    int lastIndexOf(Object element);
    

    ArrayList类

    特点:

    • 通过数组实现,所以查找效率高,增删操作效率低
    • 线程不安全

    IO

    基本概念

    输入输出流

    • 输入流:程序外部-->内部
    • 输出流:程序内部-->外部

    数据源

    • 源设备:发送数据的设备
    • 目标设备:接受数据的设备

    节点流、处理流(包装流):流像管子一样,可以嵌套

    • 节点流:直接链接数据源的流
    • 处理流:包装其他流的流

    4大IO抽象类

    字节

    • InputStream

    方法:

    int read(); //字节读取,读取成功则返回0-255的十进制数,读取失败则返回-1
    void close(); //关闭流
    

    ·子类:

    节点流:
    FileInputStream;  //操作文件
    ByteArrayInputStream; //操作字节数组
    处理流:
    ObjectInputStream; //操作对象
    DataInputStream; //操作基本数据类型和字符串类型
    BufferdInputStream; //增加缓存功能,提供效率
    
    • OutputStream

    方法:

    void write(int ); //写入一个字节
    void close(); //关闭流
    

    子类:

    节点流:
    FileOuputStream;
    ByteArrayOuputStream;
    处理流:
    ObjectOutputStream;
    DataOutputStream;
    BufferedOutputStream;
    PrintStream;
    

    字符

    • Reader

    方法:

    int read(); //字符读取,读取成功则返回0-65535的十进制数,读取失败则返回-1
    void close(); //关闭流
    

    子类:

    节点流:
    FileReader;
    处理流:
    BufferedReader;
    
    • Writer

    方法:

    void write(int ); //写入一个字符
    void close(); //关闭流
    

    方法:

    节点流:
    FileWriter;
    处理流:
    BufferedWriter;
    

    File类

    File类是处理磁盘文件或者目录的包装类

    方法:

    //初始化
    File(String path); //相对路径获取方式System.Property("user.dir");
    //创建文件/目录
    boolean createNewFile();
    boolean mkdir();
    boolean mkdirs();
    //删除文件
    boolean delete();
    //操作
    String getPath();
    ...
    

    多线程

    基本概念

    • 程序:可执行文件(静态的),一般放在磁盘,需要时在拿到内存运行;

    • 进程:进程是程序在内存上的一次运行,独占了一块内存空间,由若干个线程(至少1个)、code、数据构成;

    • 线程:线程是运行在进程内的一个线性执行单元,同个进程内线程之间共享数据(出现共享互斥问题)

    • 主线程:由main方法开始的线程

    • 子线程:由main方法创建的新线程

    java中的线程

    Thread

    Runnable

    线程控制

    • 线程结束
    • 线程暂停
      • sleep(long s); 进入阻塞状态,并在一定时间后回到就绪状态
      • yeild();进入就绪状态,给同优先级的其他线程让cpu资源

    线程联合

    join函数,被加入的线程需要等待加入线程运行完毕后才能运行

    线程优先级

    t.setPriority(5);
    t.start();
    System.out.println(t.getPriority());
    

    守护线程

    线程分为用户线程和守护线程,守护线程用来服务于用户线程,比如垃圾回收,用户线程死亡则守护线程也死亡。

    线程同步

    线程同步的基本知识
    线程同步的java实现
    • 成员变量
    synchronized(成员变量对象名){
        //需要同步的代码块
    }
    
    • this
    synchronized(this){
        //需要同步的代码块
    }
    
    synchronized public void func(){
        
    }
    
    • 类名.class
    synchronized(类名.class){
        //需要同步的代码块
    }
    
    synchronized public static void func(){
        //需要同步的代码块
    }
    

    线程的并发协作

    模型:生产者(线程) -->[缓冲区]-->消费者(线程)

    作用

    • 逻辑上实现生存者线程和消费者线程的分离,解除了他们之间的耦合
    • 协调了生产者线程和消费者线程之间的速度,提高效率

    线程之间的通信

    • wait
    • notify
    • notifyAll

    通信+syn机制才能实现生产者消费者模型

    网络编程

    基本概念

    计算机网络

    将不同地方的计算机通过通信线路链接起来,在网络操作系统网络管理软件网络通信协议的管理和协调下,实现计算机的资源共享和信息通信的系统

    网络通信协议

    • 协议:标准、规则,类似人类之间的交流需要共同的语言,计算机之间的信息交流也需要同一套规则。
    • 计算机通信太复杂,于是进行了分层,有IOS模型(理论)和TCP/IP模型(工业),每个层都有对应的协议。
    • 在模型的指导下,计算机之间的通信时层层包装(发送方)再层层拆分(接收方)的过程。

    数据的(拆分)封装与解封(合并)

    why:数据量太大很难一次传输,需要分段后按照次序发送;

    what:发送方将数据层层拆分和封装,直到物理媒体传输,接送方对受到的数据进行拆分

    how:因为每一层封装和解封都是一个原理,所以我们这里只讨论某一层。第i层的作用是传输i+1层提供的数据,发送方把上层来的数据PUD先拆分再包装,利用下层建立好的服务传送,接收方接受到数据后再合并起来。

    IP地址和端口号

    • IP: 标识计算机
    • 端口号:标识服务

    URL

    构成:https(协议)/www.baidu.com(域名)[端口号]/index.html(文件)

    作用:标识计算机的资源(目录、文件、复杂对象的引用)

    Socket

    作用:在应用层和传输层之间创建了桥梁,是传输层提供的编程接口,使得应用程序可以进行网络通信

    TCP UDP

    TCP

    位于传输层,可靠传输方式,建立虚拟链路,断开虚拟链路,类似打电话.

    3次握手,4次挥手

    UDP

    位于传输层,不可靠传输,类似于发短信

    Java网络编程中的常用类

    Socket的编程循序

    • 服务器创建ServerSocket对象,设置好监听接口;

    • ServerSocket对象调用accept()方法,并使之处于阻塞状态,等待客户端的链接;

    • 客户端创建Socket对象,设置好要连接服务器的IP和Port;

    • 客户端发出请求,客户端和服务器建立链接;

    • 通过Socket对象获得客户端和服务器的建InputStream和OutStream流对象;

    • 客户端和服务器之间利用流传输数据;

    • 关闭流关闭Socket对象

    • 信息:岗位是有限的,太晚就没了,所以要把握好时间,字节那两次机会要快一点,预计3月20号前投一次

    • 面试或者面试失败会有危险吗,不会,反而有益,锻炼胆量,学到面试经验,还是很不错的!所以不要害怕,大胆面试

  • 相关阅读:
    Docker入门,看这一篇就够了
    SpringBoot15:整合JPA
    docker 常用命令备忘录
    LeetCode 93. 复原IP地址 | Python
    LeetCode 99. 恢复二叉搜索树 | Python
    LeetCode 100. 相同的树 | Python
    LeetCode 336. 回文对 | Python
    LeetCode 337. 打家劫舍 III | Python
    LeetCode 207. 课程表 | Python
    LeetCode 415. 字符串相加 | Python
  • 原文地址:https://www.cnblogs.com/Serenaxy/p/15977501.html
Copyright © 2020-2023  润新知