It’s never too late to learn-JAVA入门篇

java的基本数据类型

  1. 内置数据类型
    8种基本类型,6个数字类型(4个整数型,2个浮点型),1个字符类型,1个布尔型

    • 数字类型 范围计算方法是 [-2^(n-1),2^(n - 1)- 1 ] n是类型的位(bit)数
    • 4个整数型
      • byte 8位
        short 16位
        int 32位
        long 64位 (0L 默认值,上面三个都是0)
    • 2个浮点型
      • float (0.0f)
      • double (0.0d)
    • 字符类型char
      • char 类型是一个单一的 16 位 Unicode 字符
      • 最小值是\u0000(十进制等效值为 0);
        最大值是\uffff(即为 65535);
        char 数据类型可以储存任何字符;
    • 布尔型
      • boolean
      • false (默认)
        true
    • 引用数据类型
      • 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。
      • 这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。
      • 变量一旦声明后,类型就不能被改变了。
        对象、数组都是引用数据类型。
        所有引用类型的默认值都是null。
        一个引用变量可以用来引用任何与之兼容的类型。
      • 例子:Site site = new Site("Runoob")。

2 常量

  • 常量在程序运行时是不能被修改的
  • final 关键字来修饰常量

3 变量

  • 局部变量
    • 局部变量是在栈上分配的。
    • 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
  • 类变量(静态变量)
    • 独立于方法之外的变量,用 static 修饰
    • 静态变量储存在静态存储区。
    • 静态变量在第一次被访问时创建,在程序结束时销毁
  • 实例变量
    • 独立于方法之外的变量,不过没有 static
    • 实例变量在对象创建的时候创建,在对象被销毁的时候销毁
    • 修饰但在静态方法以及其他类中获取方式:ObejectReference.VariableName
public class Variable{
    static int allClicks=0;    // 类变量

    String str="hello world";  // 实例变量

    public void method(){

        int i =0;  // 局部变量

    }
}

4 修饰符

  • 访问修饰符
    • default
    • private
    • public
    • protected
  • 非访问修饰符
    • static
    • final
    • abstract
    • synchronized 关键字声明的方法同一时间只能被一个线程访问
    • volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值
    • transient 序列化的对象包含被 transient (adj. 短暂的;路过的)修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型

5 运算符

  • 逻辑运算符

    • ”>>>“
    • 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充
    • 举例:
      60----->0011 1100
      60 >>> 2 = 15
      15-----> 0000 1111
  • 赋值运算符

    • <<= 左移
    • &= 按位与 相同位都为1结果才为1,否则为0
    • |= 按位或 相同位只要有一个位是1结果就是1,否则是0
    • ^= 按位异或 相同位不相同为1,相同为0
  • 条件运算符

    • 跟php一样,a==10 ? 20 :30
  • instanceof

    • 该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)
  • 算数优先级(同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序)

    • 非、按位取反、自增、+、-
      • 、/、 %
    • 加法、位移、比较
    • 按位与、按位异或、按位或
    • = 右联的
    • ?: 这个三元运算符,看起来跟php不一致,php是从左向右,java是从右向左
      • 举例
        php 代码
        $a = true ? 0 : true ? 1 : 2; 
        由于php是从左向右的执行结果为:2
        (true ? 0 : true) ? 1 : 2 = 2
        java 代码
        int d = true ? 0: true ? 1:2;
        由于java代码是从右向左执行的,结果值为0
        true ? 0 :(true ? 1 :2);
        先执行的是后面的括号里面的
  • 循环结构

    • for的增强型

      for(声明语句 : 表达式)
      {
         //代码句子
      }
      
      声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。
      其作用域限定在循环语句块,其值与此时数组元素的值相等。
      
      表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
  • 条件语句

    • if ... else if... else
    • 一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行
    • switch...case
  • Number & Math函数

    • 所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类
    • 这种由编译器特别支持的包装称为装箱(由int 自动转换为Integer,反过来叫拆箱)
    • Math函数
    • Math.rint(a) 返回距离a最近的整数
    • equals() 方法用于判断 Number 对象与方法的参数进是否相等
    • x.equals(y)
    • compareTo()
    • 如果指定的数与参数相等返回0。

      如果指定的数小于参数返回 -1。

      如果指定的数大于参数返回 1。

  • Character 类

    • Character ch = new Character('a');
    • Character.isDigit('c') //是否是数字
    • Character.isLetter()//是否是一个字符
  • String 类

    • java中字符串属于对象
    • 创建方式两种:
    • 1 String str = new String("Ping++");
    • 2 String str2 = "Ping++";
    • String 创建的字符串存储在公共池(//TODO 什么是公共池)中,而 new 创建的字符串对象在堆上;
    • String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了
    • 很多函数:isEmpty() 是否为空,substring(开始索引,结束索引),
      replace(searchChar,newChar)
  • StringBuffer和StringBuilder类

    • 图示
    • image.png
    • 在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象
    • StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的,但是它有速度优势,所以优先使用
    • 方法:
      • String Builder sb = new StringBuilder(10);
      • sb.append("abc"); 把abc追加到后面
      • sb.reverse() 将字符翻转
      • sb.delete(5,8) 索引5,删到8 Ping++niub 结果为Pingi+ub 删掉了 8-5 3个字符
      • sb.insert(8,"pinig++") 在指定的索引位置插入ping
      • sb.capacity() 容量 这个go里面有切片
      • sb.length() 返回字符个数

java 数组

  • 声明数组 double[] = list;
  • 创建数组 double[] list = new double(10)
  • 初始化 double[] list = {1.9,2.9,3.4,3.5}
  • 循环:for (double element: List)
  • 方法:fill,sort,equals,binarySearch

日期时间

  • 方法对照 左侧php 右侧是java
  • time()------->getTime();
  • sleep(3)----->sleep(3000)
  • sleep()使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会。

文件、流、IO

  • FileInputStream 该流用于从文件读取数据
  • FileOutputStream 该类用来创建一个文件并向文件中写数据
  • mkdir() 创建文件夹,mkdirs() 相当于 mkdir -p
  • Scanner 主要用来获取CLI模式下的用户输入

异常处理

  • 所有的异常类是从 java.lang.Exception 类继承的子类
  • java 有throws 可以同时抛出多个异常,php好像没有
  • finally 正常情况下一定会执行,finally会在catch中的return前执行,如果把程序手动退出了 System.exit(-1);类似于php的die finally就不会输出了。php也一样

类和对象

  • 单继承 extends
  • 多继承 implements
  • super 类似php的parent
  • final 不能被继承,方法不能被子类重写
  • 重写:Override是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变
  • 重载:重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同

多态

  • 多态是同一个行为具有多个不同表现形式或形态的能力
  • 同一个事件发生在不同的对象上会产生不同的结果
  • 优点: 类型低耦合、灵活、易扩展
  • 3个必要条件: 继承、重写、父类引用指向子类对象
  • 虚拟方法 了解就好了
  • 抽象类 abstract修饰的类就是抽象类,无法实例化。抽象类只能被继承,相当于定义了”规范“
  • 接口 (interface) 如果一个抽象类,所有方法都是抽象方法,没有字段,就可以把抽象类改写为interface
  • 静态字段:static field,静态字段只有一个共享”空间“,所有实例都会共享该字段。类名.静态字段来访问静态对象

枚举

  • Java 枚举是一个特殊的类,一般表示一组常量

    enum Color
    {
     RED, GREEN, BLUE;
    }
    • 方法
      values(); 返回枚举类中所有的值
      ordinal();方法可以找到每个枚举常量的索引,就像数组索引一样,获取枚举下标
      valueOf() 方法返回指定字符串值的枚举常量
  • 构造函数
    • 枚举有自己的构造函数,必须用private访问修饰符;
    • 也可以包含抽象方法

包package

  • 为了更好的组织类,java提供了包机制,区别于命名空间

  • 作用:

    • 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
    • 同一个包内的类名不能相同
    • 包有访问权限,,拥有包访问权限的类才能访问某个包中的类
  • 导入包 import 关键字

内部类:定义在另一个类的内部,所以成为内部类(Nested Class)

classpath

  • classpath是JVM用到的一个环境变量,它用来指示JVM如何搜索class
  • java是编译型解释型语言,php是解释型语言
    因为Java是编译型语言,源码文件是.java,而编译后的.class文件才是真正可以被JVM执行的字节码。因此,JVM需要知道,如果要加载一个abc.xyz.Hello的类,应该去哪搜索对应的Hello.class文件

    • classpath就是一组目录的集合,它设置的搜索路径与操作系统相关;启动JVM时设置classpath是推荐的做法
    java -classpath .;C:\work\project1\bin;C:\shared abc.xyz.Hello

jar 包

如果有很多.class文件,散落在各层目录中,肯定不便于管理。如果能把目录打一个包,变成一个文件,就方便多了。

jar包就是用来干这个事的,它可以把package组织的目录层级,以及各个目录下的所有文件(包括.class文件和其他文件)都打成一个jar文件,这样一来,无论是备份,还是发给客户,就简单多了。

jar包实际上就是一个zip格式的压缩文件,而jar包相当于目录。

java的数据结构

  • 枚举
  • 位集合
  • 向量
  • 字典
  • 哈希表
  • 属性

java的集合

  • Collection 接口
  • List 允许有相同的元素,有序对象
  • Set 不保存重复的元素,无序对象
  • SortedSet 继承于Set保存有序的集合
  • Map Map 接口存储一组键值对象,提供key(键)到value(值)的映射。
  • Map.Entry
    描述在一个Map中的一个元素(键/值对)。是一个 Map 的内部接口
  • SortedMap
    继承于 Map,使 Key 保持在升序排列。
  • Enumeration
    这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代

集合类

  • 只写常用的
  • LinkedList 链表 查找和修改效率低,插入和删除的效率高
    • 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。
    • 链表可分为单向链表和双向链表。
    • 一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接
    • LinkedList sites = new LinkedList();
  • ArrayList 该类也是实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。插入删除效率低
    • ArrayList sites = new ArrayList();
  • HashSet
    • HashSet 基于HashMap来实现的,是一个不允许有重复元素的集合
    • HashSet sites = new HashSet();
  • HashMap
    • 是一个散列表,它存储的内容是键值对key-value映射
    • 无序的,最多有一个键为null,很快的访问速度
    • // 创建 HashMap 对象 Sites
    • HashMap<Integer, String> Sites = new HashMap<Integer, String>();

迭代器:
(迭代器)不是一个集合,它是一种用于访问集合的方法

Java 泛型

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数

  • 泛型方法
    • public static void printArray(E[] inputArray)
    • 尖括号部分是类型参数声明
  • 泛型类
    • public class Box
  • 类型通配符
    • 类型通配符一般是使用?代替具体的类型参数
    • 例如 List<?> 在逻辑上是List,List 等所有List<具体类型实参>的父类
    • 上限 List<? extends Number>
    • 下限 List<? super Number>

序列化

  • 网络编程:网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。
  • TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP 层是位于 IP 层之上,应用层之下的中间层
  • UDP 位于 OSI 模型的传输层。一个无连接的协议。提供了应用程序之间要发送数据的数据报。由于UDP缺乏可靠性且属于无连接协议,所以应用程序通常必须容许一些丢失、错误或重复的数据包
  • socket 编程

多线程编程

  • 线程:一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

    • 新建状态
      • 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程
    • 就绪状态
      • 当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度
    • 运行状态
      • 如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
    • 阻塞状态

      • 如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:

        • 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。

        • 同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。

        • 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态

    • 死亡状态
      • 一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态
  • 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。

  • 线程的优先级

    • 1-10 默认是5
    • 创建方法
      • 继承Runnable implemnts Runnable
      • extends Thread
      • 通过 Callable 和 Future 创建线程
  • 线程同步

  • 线程间通信

  • 线程死锁

  • 线程控制: 挂起、停止、恢复

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注