环境变量配置
JAVA_HOME:配置的是jdk的根目录path:配置bin目录(%JAVA_HOME%bin)
基本格式
类名必须和文件名保持一致
public
1、java工具包
jdk:java开发工具包(java development kit),代码编写依赖jdkjre:java运行环境(java runtime environment),提供javav程序运行的环境jvm:java虚拟机(java virtual machine),确切说程序是在jvm里面运行的(只认识class字节码文件)
2、常用cmd命令
dir:显示当前路径下的目录cd:路径操作cls:清除当前屏幕
3、cmd运行步骤
先写程序 编译:javac 程序名.java 执行:java 程序名
4、注释
单行注释://注释内容 快捷键:Ctrl+/多行注释:/*注释类容*/ 快捷键:Ctrl+Shift+/文档注释:/**注释内容*/(对类和文档进行解释)
/*
目录文件夹
src文件夹:源文件夹 里面存放(包package)java文件
bin文件夹:存放编译之后的(包package)class文件
Class-->Package规范:公司域名后缀名+公司名称+其他
com/cn/edu.java.other
设置相关
字体大小调节:Window->Preferences->Appearance->Colors and Fonts->Basic->Text Font
设置统一编码格式为UTF-8:Window->Preferences->workspace->Text file encoding
设置注释格式:windows-->preference-->Java-->Code Style-->Code Templates-->code-->new Java files
变量的定义和注意事项
变量定义后,不赋值不能使用
变量有自己的作用范围,变量的有效范围定义在一对大括号内
变量不允许重复定义
数据类型
1、基本数据类型(四类八种)
int
整数默认类型是 int,小数默认类型是 double
整数:byte/short/int/long
byte:1个字节 -128~127short:2个字节int(默认):4个字节long:8个字节(过大的数后面加上L)
小数:float/double(默认)
float:4个字节double:8个字节
布尔:boolean(默认false)
boolean:1个字节
单个字符:char(默认是'')
char:2个字节
2、引用数据类型
String:字符串类(默认是null)String + 基本类型:字面量数据类型数组:数据类型[] 数组变量名 = new 数据类型[长度]任意引用数据类型都存在堆里面
3、数据类型转换
自动类型转换:范围小(byte)的可以直接转换为范围大(int)的
byte -> short -> int -> long -> float -> double
public
强制类型转换:被转后的数据类型 变量名 = (被转后的数据类型)要被转的数据
public
运算符
1、算术运算符
+ 加法,连接- 减法* 乘法/ 除法%取模,取余数++ 自增1--
public
2、赋值运算符
= / += / -= / /= / %=
public
3、比较运算符
== / != / < / > / <= / >=
结果只有 true 或者 false
比较字符串是否一致:名称1.equals(名称2)
4、逻辑运算符
对两个boolean类型数据之间进行计算结果也是boolean类型
& 与:一个false,结果就是false| 或:一个true,结果就是true^ 异或:两边相同为false,不相同为true! 取反:!true为false !false为true&& 短路与:一边是false,另一边不运行|| 短路或:一边是true,另一边不运行
5、三元运算符
公式:布尔表达式?结果1:结果2
结果1和结果2数据类型保持一致
结果1
布尔表达式是false,三元运算符结果就是--> 结果2
public
循环控制语句
1、If Else
if
2、While/Do While
两者区别: while 先判断是否满足条件 满足就执行循环体 do while 无论满不满足循环体都先执行一次
while
3、Switch Case
// switch后表达式满足的数据类型有
4、For
for
5、Break,Continue,Return
Break:直接终止整个循环体,不能单独使用在if里Continue:结束本次循环体,开始下个循环Return:结束整个方法
6、Scanner使用
Scanner input = new Scanner(http://System.in);,定义输入int a = input.nextInt();,接收用户输入 input.close(),关闭流
7、断点调试
先双击行首数字出F6程序往下走一步F8走到下一个断点处
数组
1、一维数组
语法
- 数据类型[] 变量名 = new 数据类型[长度];
- 数据类型[] 变量名 = {值1,值2,值3,值n};
- 获取数组长度:数组名.length;
2、二维数组
语法
数据类型[][] 变量名 = 数据类型[m][n];
数据类型[][] 变量名 = 数据类型[m][];
数据类型[][] 变量名 = {{元素1},{元素2},{元素3}};
// 3表示二维数组的长度是3(存放3个一维数组)
3、Arrays工具类
Arrays
排序(Sort)
1、冒泡排序
效率最慢
int
2、选择排序
for
3、插入排序
效率最快
for
类和对象
1、类的创建
public
2、类的方法
- 权限修饰符:public static(公共的),protected(受保护的),private(私有的),默认(default)
- 方法返回值:数据类型,void(无返回值数据类型)
- 方法名():规范:首字母小写,第二个单词字母大写,名字不能重复
- 方法的参数:形式参数,形参 所有数据类型都可以充当形参
//1.无参无返回值
可变参数:数据类型...参数名字,可变参数本质上是一个数组
可变参数注意事项: 1. 一个方法中,可变参数只能有一个 2. 可变参数必须写在参数列表的最后一位
3、创建对象
语法:类名 对象名 = new 类名();
Person
调用类的属性和方法
zhangSan
4、调用方法
语法:方法名();
public
5、方法重载
- 方法名相同
- 参数数据类型,参数顺序不一样
- 不考虑返回值和权限修饰符
public
6、成员变量和局部变量
- 存在位置不一样:成员变量在类里面,局部变量在方法里面
- 作用范围不一样:成员变量在类里任何地方都可以访问,局部变量只可以在方法里面使用
- 内存储存位置不一样:成员变量在堆里,局部变量在栈里
- 初始值不一样:成员变量有初始值,不需要初始化,局部变量没有初始值,必须初始化
枚举类
- 定义语法:
public
- 注意:
- 先定义对象(实例),再定义成员变量和成员方法
public
- 枚举类中的对象值一般不允许修改,所以一般只给get方法
面向对象三大特性
1、封装
对私有属性提供对外的公开访问方法:使用setter()和getter()方法
private
lombok使用教程
this关键字
- 当成员变量与局部变量重名的时候,可以使用this来辨别,this指代的是当前对象
- this充当实参
- this可以调用构造函数this(),必须在代码的第一行
- this可以访问属性
- this不能在static所修饰的方法中运用
static关键字
- 静态方法里面不能访问非静态成员
- 如果是static修饰的成员变量,最好初始化
- 静态方法中不能使用this
- 可以和任何权限修饰符一起使用:public/private/protected/final
- 数据是让所有对象共享的
静态代码块:
static
2、继承(extends)
语法:public class 类1 extends 类2{},一个类只能继承一个类
子类对象创建时会默认先执行父类的无参构造
super
- 访问父类构造方法(super())
- 访问父类的成员变量和成员方法(super.父类变量名/方法名)
方法重写(override)
前提条件:必须要有层级关系 1. 方法重写出现在子类里面 2. 方法名,形式参数必须和父类保持一致 3. 子类访问权限修饰符 >= 父类的 4. 子类返回值类型 <= 父类的 5. 重写父类方法前面加上:@Override
权限修饰符
- public:可以修饰类和成员变量,在整个项目中都是友好的
- protected:可以修饰成员变量,在整个包内和子类中友好
- 默认不写:可以修饰类和成员变量,在包内友好
- private:可以修饰成员变量,在本类中友好
- final:可以修饰常量,被修饰的方法中不能被重写,在继承中不被继承
3、多态
发生多态条件: 1. 父类对象指向任何一个子类的实例(对象) 2. 编译时数据类型(=左边)与运行时数据类型(=右边)不一致时 3. 子类对象转成父类实例向上转型 4. 创建对象发生多态:父类对象 名称 = new 子类对象(); 5. 父类对象转成子类实例(强制转换),向下转型,要配合instanceof一起使用 6. 访问成员变量看=左边的数据,访问成员方法看=右边 弊端:无法访问子类特有的成员(变量、方法)
instanceof
使用:父类实例 instanceof 子类对象
抽象类和接口
1、抽象类
使用条件:当所有子类都需要重新父类的逻辑时,父类方法体就变得没有意义,就把父类方法声明成抽象的方法使用方法:访问权限修饰符 abstract 返回值类型 方法名();注意:抽象类不能创建对象,体现在多态上,抽象类的构造方法主要是满足子类对象的创建
2、接口(interface)
创建接口
public
项目命名规范 1. Dao/DAO.java,UserDao.java
2. Service.java,UserService.java
接口中的内容
常量必须为public static final修饰,常量名字必须都是大写
抽象方法必须为publice abstract修饰JDK1.8之后有普通方法,但必须使用default static修饰
访问父类的普通方法使用super.方法名()
接口的作用 1. 接口可以通过implements实现多调用,一个类可以实现多个接口 2. 主要用于多态的使用 3. 接口和接口之间可以实现多继承
3、接口和抽象类的区别
共同点:都不能实例化,都用于多态
不同点:接口只有常量和抽象方法和default/static所修饰的功能方法,抽象类有成员变量,成员方法,抽象方法,构造方法,静态代码块
异常
异常Exception(类) ---> 可以处理
错误Error(类) ---> JVM抛出,程序直接终止
它们有共同的父类:Throwable
异常可以分为两大类: 1. 可检测到的异常checkedException:PasreException,SQLException,ClassNotFoundException,IOException 2. 运行时的异常RuntimeException:NPE,ClassCastException
1、捕获异常的方法
String getMessage():获得详细的异常信息字符串内容void printStackTrace():将详细异常信息通过流打印(输出)至控制台
出现多个异常的情况下
2、抛出异常 throws
throw 声明抛出一个具体的异常对象
public
将String时间数据转换为Data
String
lang包常用类
1、Integer
包装类分为四类八种Byte,Shory,Integer,Long,Float,Double,Character,Boolean成员变量的数据类型使用包装类
Integer介绍: 1. final所修饰的类 2. 继承于Number 3. 实现了一个Comparable<Integer>接口 4. 赋值只能给数字类型和数字类型的字符串
基本类型的数据转换成了一个包装类 ---> 自动装箱操作
// 底层实现:Integer num = Integer.valueOf(100);
包装类的对象转换成基本类型的数据 ---> 自动拆箱操作
// 底层实现:int num1 = num.intValue();
这里实现了包装类的拆箱操作
System
整数缓存池:数组 Short[] Integer[] Long[],范围在-128~127之间, 两个数比较在这之间为True,否则为False
Integer
Integer功能方法
比较数据类型是否一致
//equals方法从Object继承 是Integer重写父类的euqals
String 和 Integer转换
String
Integer 转换成 String
Integer
2、Character
Character功能方法
将字符串转换为指定进制
System
3、Math
获得随机数
Math
求几次幂
Math
四舍五入
Math
求一个数的平方根
Math
最大值最小值
Math
获取绝对值
Math
4、Object(基类/超类)
获得对象的哈希码值(返回值是int)
hashCode
获得一个对象(类/接口字节码文件)
getClass
判断元素是否为空
Objects
在另外一个线程里面唤醒另外一个正在wait的线程
notify
线程等待
wait
创建(克隆)对象,获得一个对象的副本
clone
5、Class
表示正在运行的类或者接口(获得正在运行的类或者接口的class文件)反射最基本的一个类-->获得类/接口的所有内容
一般用于底层的封装和框架的开源
获得Class类的对象的方式
1
返回到类的类加载器(bin目录)
clazz
查找具有给定名称的资源
clazz
获得类的属性 对属性赋值(Field类)
Field
操作属性
import
操作方法
import
6、String
实现了java.io.Serializable, Comparable<String>, CharSequence接口
创建字符串
构造
获得字符串的字节内容
注意编码和解码格式统一
将字符数组转换为字符串内容
char
toCharArray字符数组转换为字符串内容操作
String
String功能方法
获得字符串指定索引的字符内容(返回值是char类型)
str
将指定的字符串内容追加到字符串的末尾(返回值是String类型)
str
判断字符串中是否包含指定字符序列内容(返回值是boolean类型)
str
将任意类型的数据转换为字符串(返回值是String类型)
String
判断字符串中是否以某个类型开头和结尾(返回值是boolean类型)
str
获得指定字符串第一次出现的索引位置(返回值是int类型)
找不到指定的字符串内容返回值是
获得指定字符串最后一次出现的索引位置(返回值是int类型)
找不到指定的字符串内容返回值是
获得当前字符串的副本(返回值是String类型)
str
判断字符串是否是空(返回值是boolean类型)
str
使用分隔符连接字符串内容(返回值是String类型)
String
判断字符串是否匹配正则的要求(返回值是boolean类型)
str
使用指定字符串替换字符串内容(返回值是String类型)
str
将字符串使用指定的正则表达式进行分割(返回值是String[]类型)
str
截取部分字符串内容(返回值是String类型)
// 从第一个索引开始截取到第三个索引,包头不包尾
转换为大小写(返回值是String类型)
str
去掉字符串左右两边空格(返回值是String类型)
str
去掉中间空格
str
7、StringBuffer/StringBuilder(字符串变量类)
StringBuffer:值可以改变。线程安全(StringBuffer所有的方法都是同步的synchronized) 效率慢
StringBuilder:值可以改变 线程不安全(不同步的),效率最快,(绝对不能作为成员变量进行使用)
StringBuffer功能方法
创建初始化对象
StringBuffer
追加字符串
buffer
删除字符串
buffer
反转字符串
buffer
修改某个索引字符内容
buffer
StringBuilder功能方法
创建初始化对象
StringBuilder
String/StringBuffer/StringBuilder区别
- 从数据:
String: 数据不可变
StringBuffer/StringBuilder:值可以改变 - 从内容
String: 浪费内存
StringBuffer/StringBuilder;始终都是同一个对象 - 从线程安全
String/StringBuffer 线程安全(同步)
StringBuilder 线程不安全(不同步) - 效率StringBuilder最快,其次是String,最后是StringBuffer
8、System
System类不能手动创建对象,因为构造方法被private修饰
方法:
获取系统当前毫秒值
util包常用类
1、Date
Date类对象用来表示时间和日期
该类提供一系列操纵日期和时间各组成部分的方法构造方法重载
2、Calendar
Calendar类也是用来操作日期和时间的类,但它可以以整 数形式检索类似于年、月、日之类的信息
Calendar类是抽象类,无法实例化,要得到该类对象只能 通过调用getInstance方法来获得
3、Insatnt
JDK8的应用,推荐使用 Instant 代替 Date,LocalDateTime 代替 Calendar
4、LocalDate/LocalTime/LocalDateTime
LocalDate 获得当前系统的时间 2007-12-03LocalTime 获得当前系统的时间 10:15:30LocalDateTime 获得当前系统的时间 2007-12-03T10:15:30
此类也是不可变且线程安全
5、DateFormat
//时间转换成字符串
数字的格式化
//#.## 保留两位小数
6、Random(伪随机数类)
在多线程中是不安全的创建实例
Random
取一个随机整数值
random
ThreadLocalRandom(随机数类)
在多线程中是安全的
ThreadLocalRandom
7、加密解密
Base64
jdk1.8可正常使用Base64.Encoder(加密),Base64.Decoder(解密)
该类使用RFC 4648和RFC 2045中规定的Base64编码方案来实现用于解码字节数据的解(编)码器。
// 注册 对密码进行加密
MessageDigest
MessageDigest类为应用程序提供消息摘要算法的 功能,如SHA-1或SHA-256或MD5。 消息摘要是采用 任意大小的数据并输出固定长度散列值的安全单向 散列函数
// MD5加密 信息摘要算法的一种
泛型
- 意义:与形式参数作用一样,限定数据类型
- 作用:隐式帮助进行类型转换
- 功能:
修饰类
- 修饰接口-->泛型接口
public
- 泛型擦除概念:泛型是在编译的时候起作用,但在代码运行期间是没有作用的
- 泛型上限
- 让泛型继承一个类
java
- 泛型通配符:?
public
集合
集合作用和数组作用一致,用于存储多个元素数据
理论上可以存储任意引用数据类型的数据(开发中都存储相同类型的数据-->避免出现类型准换问题)
这个,代表这个类为泛型的标志-->参数化类型(形参) 代表集合里面只能存储泛型所规定的的类型的数据(限定集合元素数据类型) ?代表的是泛型的 通配符 ? extends 父类,限制父类,不限制子类 ? super 子类,限制子类,不限制父类
集合的接口
1、Collection(是List和Set的父类)
特征: 1. 用于存放单值元素 2. 元素是无序的(没有索引位置) 3. 元素是否可以重复要看使用的是哪个类实现的
创建集合对象
Collection
增加元素
collection
删除元素
collection
查询元素
collection
清除集合中所有的元素
collection
判断元素是否存在
collection
lambda语法:(参数类型 参数名,参数类型 参数名)->{需要进行的操作}遍历集合元素
foreach方法
集合中存储任意类型的对象
Collection
迭代器
Iterator
集合转数组
第一种方法
List<T>
特征 1. 存储单值元素 2. 元素有序的(有索引位置) 3. 元素可以重复的
包括三个子类:ArrayList<E>(重要),LinkedList<E>,Vector
E代表的是:Element 元素,实际就是一个变量
三者之间的区别: 1. 底层的数据结构 ArrayList/Vector 是由动态数组进行维护。LinkedList 是由双向链表进行维护。 2. 添加 删除 查询效率 ArrayList: 查询最快LinkedList:添加删除最快 查询较慢Vector: 都慢 3. 线程安全 ArrayList/LinkedList 都是线程不安全的Vector 线程安全的
ArrayList
初始化容量10
linkedList
初始化对象
Set
特征
1. 存储单值元素
2. 元素无序(没有索引位置)
3. 元素不可以重复的,值必须唯一(前提: 一定要重写 equals和hashcode),默认初始容量16 包含三个子类:HashSet,LinkedHashSet,TreeSet
区别:
1. 底层的数据结构 HashSet 是哈希表(哈希算法)维护,存储取出快,元素无序LinkedHashSet 是由哈希表+双向链表维护,继承HashSet,元素是有序的 (插入顺序和 输出顺序是一致的)TreeSet 是由二叉树(红黑树)进行维护 元素是有序的(按照自然顺序进行排列 要求集合元素数据类型必须有比较器 (实现 Comparable))
2. 元素是否可以为null HashSet/LinkedHashSet 元素可以为null
TreeSet 元素不允许为null
3. 线程是否安全 HashSet/LinkedHashSet/TreeSet 都不安全
哈希表存储对象的依据是对象的哈希值和equals方法实现方法和Collection一致
初始化对象
2、Map
存储的是一组元素数据,有key和value
Map中的key是不能重复的,value可以重复
实现类和子类:HashMap<K,V>(元素无序),LinkedHashMap<K,V>(元素有序),TreeMap<K,V>,HashTable<K,V>,CouncurrentHashMap<K,V>
区别:
1. 从底层数据结构 HashMap/HashTable 哈希表维护LinkedHashMap 哈希表和链表维护,是HashMap的子类TreeMap 红黑树维护,元素有序的,会按照key的自然顺序进行排序CouncurrentHashMap CAS(比较并交换) 乐观锁 + Redis
2. 线程安全 HashMap/LinkedHashMap/TreeMap 线程不安全HashTable/CouncurrentHashMap 线程安全
3. key和value是否可以为null HashMap/LinkedHashMap key/value都可以为nullTreeMap key不能为null value是可以为nullHashTable/CouncurrentHashMap key/value都不能为null
HashMap,TreeMap,HashTable,LinkedHashMap
创建对象
3、Collections
集合操作工具类
对
IO
1、File操作
File类构造方法
// windows路径下不区分大小写
显示与系统有关的路径分隔符
String
显示与系统有关的名称分隔符
String
递归
注意事项: 1. 递归一定要有出口 2. 递归次数不能过多 3. 构造方法禁止递归
public
2、字节操作
fileInputStream
public
fileOutputStream
public
3、字符操作
FileReader
public
public
4、输入输出流
DataInputStream/DataOutputStream
实现了一个DataInput接口,一般配合Socket使用必须先写入文件,才能读取文件读的顺序要和写的顺序一致
"先Write"
5、Properties
特点: 1. 存储键值对(一组数据),属性名--->属性值 2. 读取配置文件内容,*properties
"构造方法"
6、序列化
ObjectOutputStream 序列化流 写入ObjectInputStream 反序列化流 读取必须先写入文件,才能读取文件,类必须要实现Serializable接口静态的成员变量不能序列化transient(瞬态)修饰的成员变量不能被序列化
"构造方法"