JVM
jvm:java虚拟机,是运行java程序的虚拟的计算机,是Java程序的运行环境
Java常量
- 字符串常量 例如 “dsdsa”,”dasdsad”
- 整数常量 例如 1 5 8
- 浮点数常量 2.02 8.36
- 字符常量 ‘d’ ‘\a’
- 布尔常量 true false
- 空常量 null
java 打印输出
Java 在两行System.out.println(“a”)与System.out.println(“b”)两行之间会有换行,例如
1 | System.out.println("dad"); |
结果会输出
dad
da
注意:空常量不能打印输出
Java基本数据类型
整数型 byte short int long
浮点类型 float double
字符型 char
布尔型 bolean
java数据类型转换
和c++一致,Java有显示和隐式转换,但是从大范围到小范围的隐式数据转化,Java不在支持,必须为显示转换,当然,Java中不存在static_cast<>()这种转换
注意
- 强制类型转换最好不要使用,会有精度损失
相加操作例如 byte+byte 两个byte都会隐式转换为int,必须加上强制类型转换。
但是对于short/int/byte而言,如果右值没有超过范围,则编译器会进行隐式的转换,例如
short a=20;
不会报错,如果右侧大于范围,例如,char a=555;则编译器报错
但是加上操作符之后会有类型的提升,例如,short+short应该用int来接。但是右侧表达式为常量,则不会报错。short a =1+5;不会报错
注意 java死循环后面不能再加上语句
IDEA的项目结构
所有开发的源代码需要在src下,EL代表外部依赖项。最细致的管理代码的单位叫做包。其中包是一个多层级文件夹的嵌套例如我创建cn.a.b的包,系统会创建cn的文件夹,在cn文件夹下创建a文件夹,在a文件夹下创建b文件夹。
Java函数的调用与函数的重载与c++一致
java内存可以分为以下几类
Java使用类操作
- 导包
import 包名.类名
如果两个文件属于同一个包,则不需要import操作
- 使用类
Student s=new Student();
- 使用
注意:只有java.lang下的包不需要导包,其他的包都需要导入
IDEA 生成简单代码
选择最上方code,然后选择generate.如果需要选择多个功能的生成,可以按住shift键
Scanner
键盘输入
Scanner在java.util下,使用键盘输入写为 Scanner sc=new Scanner(System.in);获取输入的int 为
int a=sc.nextInt();字符串为 String s=sc.next();
Random
1 | Random R=new Random(); |
ArrayList
如同vector
1 | ArrayList<int>a=new ArrayList<>(); |
方法列举
1 | add |
list.fori遍历ArrayList
如果ArrayList里面装的是基本类型,则需要在左边模型参数中写入下面代码
String类
对于String类,例如”dsadasds”字符串被当作一个实例,不像c++当成字面值,而是一个String类的对象,也有内存。这也就意味着java不像C++是通过char*来构建String,而是把String当作一个对象。这也就意味着不能通过[]操作来访问String 元素。但是都可以使用char[]创建String
字符串的内容不可改变
每一个” “字符串不认为是一个字符串常量,而是一个有地址的
String方法
,equal(String)如果两个字符串内容相同,不管地址相不相同,都返回true.
推荐常量字符串调用方法
.equalIsIgonreCase();equals方法的增强版,忽略大小写
.indexOf(string);//返回参数字符串在字符串的位置
.concat(String s);//将调用字符串与s拼接,并返回
.charAt(char);//charAt(char);//返回字符在字符串中的位置
.substring(int begin);//从begin开始到末尾的字符子串
.substring(int begin,int end);//[begin,end)dgin,end)的字符子串
String[] spilt(string a);//按照规则a切分字符串
1 | String a="aaa,bbb,ccc"; |
并且和c++一致,所有对象共享用同一份static。和c++完全yi’zhi
静态代码块
当第一次用到本类时就会调用静态代码块
1 | public class a |
Arrays
Arrays.sort(数组)//对数组排序。如果是结构化数组,需要指出Comporable或Comporator接口
Math
Math.abs();
Math.ceil();向上取整
Math.flood();向下取整
Math.PI;
子类与基类
public class 子类 extends 父类
{
}
和c++规则一致,并且还没有虚函数
忘记保存了 从继承到内部类的内容全没了
干
算了 从匿名内部类开始把
匿名内部类
如果接口的实现类或者父类的子类只需要实现一次,则可以使用匿名内部类
例如可以在mainh函数内部写上
接口名称 对象名=new 接口名称(){里面覆盖重写接口的方法};
匿名内部类的注意事项
- 创建匿名内部类的对象是,只能创建一次
System类
System.currentTimeMillis();//返回程序现在的毫秒值
array copy函数
StringBuilder类
- StringBuilder原理
StringBuilder 有参数为String的构造方法
对象.append(任意的基本类型和字符串);返回this,并将任意的类型转化为StringBuilder里的bytes数组,该类比String的效率高,因为采用了缓冲区。
- toString方法,将StringBuilder对象转化为String对象
包装类
将基本数据类型包装成类,可以调用成员方法
装箱与拆箱
将int装箱 Integer a=new Integer(int string);
拆箱 a.intVal()
自动装箱 Interger a=11;
自动拆箱 a+=2;
将字符串变为int double
Integer类里面有static int parse(String a);
Collection 集合
Iterator 迭代器
迭代器的使用
使用集合中的方法iterator()获取迭代器的实现类对象
使用迭代器的hasNext();方法判断有没有下一个元素
使用next();获取下一个元素
创建迭代器
Collection
Iterator
泛型
与c++一致,定义泛型的方法如下 public class 类名 <模板参数>{}
泛型接口与泛型类一致,接口向右写,并且模板参数可以默认
含有泛型的方法
修饰符 <模板参数> 返回值 名称(参数){}
Colleciton类
sort
要想在自己写的类实现Collection.sort()方法,必须将该类实现一个接口Compareable<类名>并重写方法compaeTo方法。升序用this-对象。
也可以这样重写函数
1 | Collections.sort(aa, new Comparator<Integer>() { |
map集合
两个模板参数,也是键值对
hashmap
hashmap通过put方法插入,get方法通过键获得值
remove(键)。删除键所对应的值,并放回
keyset 将map中的所有键返回为一个集合。然后y可以通过key找到value
Entry对相当于C++的pair对象,map对象可以调用EntrySet对象返回
1 | hashMap与HashTable的区别 |
of方法一次性添加LIST SET MAP接口,一旦一次性添加了元素,便不能再put元素
1 | List<String>s=List.of("a","b","c"); |
Set使用of方法如果有重复的参数,会抛出异常
调试跟踪
f8逐行执行程序
f7进入方法体;
shift+f8调处方法体
f9跳到下一个断点,没有就推出
CTRL+f2调处程序
Console 切换到控制台
异常
Java中异常是个类,产生异常会抛出一个异常的类
throwable下面有两个子类 error和excepions类,该包再lang包下
使用try catch代码块可以捕获异常,并且后续代码可以实现
try
{}
catch(Exception e)
{}
异常处理的过程
异常的处理
throw关键字
使用俄式 throw new xxxException(“长生异常原因”);
注意事项
- throw关键字必须写在方法的内部
- throw后面new的对象必须是Exception或者Exception类的子类对象
- throw关键字抛出异常后我们必须处理这个异常
throw关键字抛出的RunTimeException或者其子类的对象可以不用处理 编译异常要么使用throws要么使用try catch 代码段
Object.requireNonNull(T obj,String 打印信息);如果对象obj为空,会抛出一个异常,叫做空指针异常
如果有多个异常,并且两个异常有继承关系,那么,在抛出异常的时候只需要抛出父类的异常例如
1 | public static void main(String[] args) throws IOException { |
没有抛出FileNotFind异常是因为他是IOException异常的子类,通过throw的方式,异常后的代码不在执行
try catch
try catch后续代码都会执行。可以修改以上的代码块,使用try catch方式
1 | public static void main(String[] args) { |
finally代码块无论有没有异常,都会执行的代码块
异常的处理
- 分步别try边catch
- 可以这样一次try多次catch
1 | public static void main(String[] args) { |
3 多异常一次捕获,一次处理
1 | public static void main(String[] args) { |
自定义异常
自己写的异常类必须继承Exception 一个无参的光谱早方法一个带有父类信息的构造方法
Java的thread类
妈的多线程的一章全没了 >o<
File类
java IO包类
file 文件
directiry 文件夹/路径
path 路径
构造函数
File(String a);//a为绝对路径或者相对路径
File(String parent, String zi);//父路径与子路径
.getAbsolutePath();//获取绝对路径
getPath();//获取相对路径
.getName();//获得文件、文件夹名称。
.length();//文件的大小.
.exist();//判断路径是否存在
.isFile();//判断是否是文件
.isDirectory()l//判断是否是文件夹
.creatNewFile();//创建一个新文件
.delete();//删除文件或文件夹
.madir();//创建路径
FileFileter
FileFilter接口用于过滤File对象
只有一个抽象方法 boolean accept(File ovj);
用法
实现该接口的accept方法,调用路径的的listFiles(参数为实现类对象);这样就过滤了。
方法返回true 则放入数组中。
I\O
文件字节输出流
创建FileOutputSvrean对象
调用对象的write方法
调用close释放资源
.write(byte[]);会写入byte类型的所对应的字符。如果第一个数字是正数,会对应ASCII码输入对应字符,如果第一个是负数,会将两个正数对应GBK汉字输入。
在文件后面追加写数据
创建FileOutputSvrean时,使用两个参数的构造方法,FileOutputStream(String a,bollean flag);如果flag为true会在原文加后面追加文件,否则会覆盖重写文件
字节输入流
InputStream抽象类,定义了所有的输出流的抽象方法
FileInputStream
构造方法,参数和上面一样,参数为文件的路径
字符输入流 Read
抽象类,read()一次读取一个字符,close释放资源方法。一个一个字符的读取
FileRead
- 创建FileRead对象
- 使用read方法读取文件 返回值为-1,则read失败
- close
字符输出流
创建FileWriter对象,构造方法写入目的地址
使用write方法写道内存的缓冲区中
使用flush把内存缓冲区的数据,刷新到文件中
close
flush会刷新流对象的内容到文件,流对象继续使用。close之后流对象会释放
和字节输入输出流一样 使用第二个参数的构造函数会续写文件。\r\n换行
IO异常
JDK7之后再try后面加一个括号,写上流对象,在try执行完毕,会释放流对象。不再写finally释放流对象
JDK9之后可以不用在括号内创建对象,只需要在括号内写上外边定义的对象,类似代码如下
1 | public static void main(String[] args) throws IOException { |
字节缓冲输出流
BufferedOutputStream(OutputStream a);会给a创建一个缓冲区。
使用步骤
- 创建输出 FileOutputStream对象
- 通过1创建的对象创建缓冲流对象
- 使用2的write方法写道缓冲区中
- 使用flush写道文件中
- close
字节缓存输入流与输出流类似,只是没有flush.close的时候只需要关闭缓冲流即可,无需关闭原始流。
序列化与反序列化
序列化:ObjectOutputStream把对象写入到文件中 writeObject,
反序列化:ObjectInputStream(返回object类) readObject
进行序列化和反序列化的对象必须实现Serializable接口
如果类的内容变化,则会抛出异常,序列化与反序列化不一致,解决方式是在类中声明一个变量 private static final serialVersionUID