[toc]
java
T 表示任意类型
用泛型不需要强转,减少了用object时产生的装箱拆箱操作,性能更好
双引号表示字符串;单引号表示字符,返回ascii码,可与数字进行运算
包声明;在包文件头部
package xxx
执行
- 编译
javac Hello.java
- 执行 Hello.class 使用
java Hello
语法相关
- 语句后面注意加分号
关键字
- java 关键字区分大小写
标识符
- 给变量, 类,方法等命名的符号
- 数字,字母,下划线,$,组成,不能以数字开头
- 严格区分大小写
变量
- 区分大小写
- 变量类型 变量名 = 变量值
- 先申明,后使用
数据类型
- java是强类型
- 基本数据类型(括号中的值为字节数)
|-- 数值型
|-- 整数:byte(1),short(2),int(4),long(8)
|-- 浮点:float(4)数字后添加字母f, double(8)
|-- 字符型 char(2) 用单引号 只能是一个字符
|-- 布尔型 boolean(1)
int 默认初始值:0
基本类型包装类(与基本类型之间可以自动转换): 包装类型默认为NULL
// 所有包装类 Byte Short Integer Long Float Double Character Boolean BigInteger BigDecmail
int num = 123;
Integer n1 = new Integer(num)
float n2 = n1.floatValue()
- 基本类型转换为字符串
- 使用 基本类型的封装类的 toString() 方法
- 使用 String 类的 valueOf() 方法
- 利用与 空字符串相加
- 字符串转基本类型
- 包装类.parseXxx(xx)
- 包装类.valueOf(xx)
int num = 12;
System.out.println(Integer.toString(num));
System.out.println(String.valueOf(num));
System.out.println(num + "");
String s = "12.36";
Double db = Double.parseDouble(s);
Double dd = Double.valueOf(s);
- 引用类型
|-- 类
|-- 接口
|-- 数组
float与double的区别:
- float占4字节,32位(但有9位要拿来放符号位和指数位),最大数 8388608 最多7位,但只能保证6位精准
- double 位数部分52位 最大数2^52 4503599627370496 精度15-16位
- double消耗内存是float的两倍,double的运算速度比float慢
String
- 两种方式:
String str = ""
或String str = new String("")
- 引用数据类型 ;是字符串,用双引号
- 位于java.lang包中,默认自动引入所有的程序
- 每次创建一个字符串都是新对象
String s1 = "字符串";
String s2 = "字符串";
String s3 = new String("字符串");
s1 和 s2 相等 因为多次出现的字符常量,java编译时只创建一个
s1,s2 和 s3 是不同的对象
s1 存放的是指向 "字符串"对象存在于堆内存中的地址
s1.equals(s3) 返回true;equals只比较内容
== 比较的是内存地址
程序中频繁操作字符串,就会产生很多的临时变量,使用StringBuilder
和 StringBuffer
就不会出现该问题;二者基本相似,不同在于 StringBuilder
是线程安全的, StringBuilder
没有实现但性能更高;所以一般情况下创建内容可变字符串,优先考虑 StringBuilder
自动类型转换
- 两种类型要相互兼容
- 目标类型要大于源类型
强制类型转换
语法:(要转化为的数据类型)值
运算符
- 算术运算符
+ - * / % ++ --
- % 用来求余数,也称为”取模运算符
- 赋值运算符
= += -= += /= %=
- 比较运算符
> < >= <=
两边的操作数是数值类型
== !=
两边既可以是数值类型也可以是引用类型
- 逻辑运算符
&& || !
^
有且必须一个为true一个为false
- 条件运算符
? :
三元运算符
条件语句
swith
switch后的值必须是整形或字符型
case后面的可以使常量也可以是常量表达式
匹配后,只有遇到break或语句结束,才会停止执行,否则会执行下一个case中的值
for(循环变量初始化;循环条件;循环变量变化) {}}
- 循环变量初始化在循环中只执行一次
- 进行循环条件的判断,为真执行循环体
- 改变循环变量的值
2 -> 3 ->4
- 括号中的三个表达式可以省略但是分号不能省略
- 循环变量初始化和循环变量变化,可以用逗号隔开
- break continue
foreach
遍历数组,集合 语法:
for(类型 xxx: 遍历对象) {
print(xxx)
}
数组
声明:
- 类型[] xxx;
- 类型 xxx[];
分配空间 xxx = new 类型[ 长度]
合并以上: int[] xxx = new int[ 3]
- 赋值
xxx[ 1] = xx
int[] xxx = { 11, 12, 13 }
等同于 int[] xxx = new int[ 不能有长度]{ 11, 12, 13 }
- 工具方法Arrays的使用
import java.util.Arrays;
String[] names = {"sports", "game", "movie" };
Arrays.sort(names);
System.out.println("all name:" + Arrays.toString(names));
二维数组
- 声明:int[][] arr = new int[2][3] 或者 int[][] arr ={{1,2,3},{4,5,6}}
- 赋值只能具体到某个值进行操作: arr[1] = {1,3,3}; arr = {{1,3,3}, {1,4,3}} 报错
方法
语法:
访问修饰符 返回值类型 方法名(类型) {
方法体
}
- 访问修饰符:public, protected, private,或省略
- 返回值类型:没有返回值用void
方法重载
- 同一个类中
- 相同的方法名
- 方法的参数个数,顺序,类型不同
- 与方法的修饰符,返回值没有关系
类
- 所有java程序都是以类为组织单元
- 定义类(定义类名,定义属性,定义方法)
对象
- 类是对象的类型
- 创建对象
类名 对象名 = new 构造方法()
- 使用对象 对象名加调用
成员变量和局部变量
成员变量:在类中定义,描述对象将要有什么 局部变量:类的方法中定义,方法中保存临时数据
- 只会给成员变量初始值
- 成员变量和局部变量同名,遵循就近原则
构造方法
- new 构造方法 创建新对象
- 定义用来初始化对象的方法,构造方法与类同名且没有返回值
public 构造方法名(参数) {
}
- 没有指定无参的构造方法,系统会自动生成一个,也可以自己写无参构造方法
- 有参数构造方法
静态变量
在类中定义
用static修饰,它属于整个类所有,而不是某个对象所有;可以直接用类名进行访问
static可修饰变量、方法、代码块
final 关键字
语法 : final xxx
- 修饰类 类不可继承
- 修饰方法 方法不可覆盖
- 修饰属性 只可以在初始化时赋值一次
子类构造方法中,没有显示调用父类的构造方法。则系统默认调用父类午餐的构造方法
Object类是所有类的父类
- toString() 方法重写
- equals 比较对象的引用地址是否相同
多态
同一个接口,使用不同的实例,执行不同的操作
引用的多态 父类的引用指向子类的对象 父类的引用指向本类的对象
Parent p = new Child();
继承
重写,子类重写父类方法
不能使用子类的特有的属性和方法,强制转换:Tiger tg = (Tiger) am;
后即可访问
tg 指向最开始在堆内存中创建的那个 Tiger类型的对象
减少了多余对象的创建
UML 统一建模语言
图形话语言
- 用例图
- 序列图: 按照交互,发生的一系列顺序
- 类图
异常处理
Throwable 类 java中所有不正常类都继承于它
-- Error: 虚拟机错误,线程死锁,一般出现 程序就挂了
-- Exception:编码、环境、用户操作输入出现问题
-- RuntimeException:非检查异常,数组越界,引用空对象的属性或方法,等等;由虚拟机自动抛出并捕获。
-- NullPointerException(空指针异常) `String a = null;print(a.length())`
-- ArrayIndexOutOfBoundsException(数组下标越界)
-- ClassCastException(类型转换异常)
-- ArithmeticExceptior(算术异常) `1/0`
-- 其它:检查异常;手动添加捕获,以及处理语句
-- IOException(文件异常)
-- SQLException(SQL异常)
catch 多异常捕获,从子类到父类捕获
finally语句中去释放占用的资源
抛出异常:throw
throws 声明将要抛出何种类型的异常
如下是将错误抛出给更上一层的tryCatch,否则就直接在内部写tryCatch
public void 方法名(参数列表) throws Exception {
// 调用会抛出异常的方法或
throw new Exception("异常说明");
}
- 自定义异常 继承Exception
时间处理
- 将 Calendar 转换为 Date 使用 getTime()
- getTimeInMillis() 获取 Calendar 的时间值,以毫秒为单位
集合
- 集合中元素可以是任意类型的对象的引用
- 在类的内部对数据进行组织
- 简单快捷的搜索大数量的条目
- 有些集合提供了一系列有序的元素,可以在序列中快速的插入或删除有关元素
- 有些集合,提供了映射关系,可以通过关键字去快速查找唯一对象,这个关键字可以是任意类型
- 集合长度可变
Collection-- List 排列有序,可重复
-- ArrayList(数组序列)
-- Queue 排列有序,可重复
-- LinkedList(链表)
-- Set 无序,不可重复
== HashSet(哈希集)
存储的是一个一个的对象
Map -- HashMap(哈希表)
映射关系,键值对
- hashMap.values() 返回集合包含的值
List
- 调用contains方法,遍历list中的每一个元素,再调用每一个元素的equals方法,与传入的参数比较
Set:
- Set 中没有 get 方法
- 循环Set 每次的结果循序不一致
- 调用 contains 时,先调用每一个元素的 hashCode 方法返回hash码,如果hash码相同,再调用equals判断是否相等。都相等才相等
Map:
- 元素为键值对 key-value
- 键值对以Entry类型的对象形式存在
- key不可重复 value可以
- Map接口提供了返回key值集合,value值集合以及Entry集合的方法
- 支持泛型,
Map< key类型, value类型>
HashMap
- 是Map的一个重要实现类,
- 其中的Entry对象是无序列的
- key和value都可以为null
泛型
- 规定了某个集合只可以存放特定类型的对象,会在编译期间进行类型检测
- 泛型集合不能添加除泛型及其子类型以外的对象,否则会报错
- 不能是基本类型,要用基本类型,要使用包装类
HashMap
- ConcurrentHashMap 解决其在多线程编程中是线程不安全的,而Hashtable由于使用了synchronized修饰方法而导致执行效率不高