java的基本数据类型
- 内置数据类型
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)
- byte 8位
- 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类
- 图示
- 在使用 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 ();
- 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 static
- 泛型类
- public class Box
- 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 创建线程
-
线程同步
-
线程间通信
-
线程死锁
-
线程控制: 挂起、停止、恢复