java 基础知识汇总
本篇文章主要记录,我几年前学习java的知识笔记汇总
文章目录
一. java常用知识点
-
命名规范
- 类名规范:首字母大写,后边的每个单词首字母大写(大驼峰)
- 变量名规范:首字母小写,后边的每个单词字母大写(小)
- 方法名规范:同变量名
-
数据类型
- 单引号为字符类型(只可以写一个字符)
- 双引号为字符串类型
- 默认的数字为整形,长整形要在数字末尾加
L
,浮点型要在数字末尾加F
(如果数字超出范围会溢出)
-
java运算
- bity/short/char/都可以发生数学运算如加发char在数学运算是会转换为一定规则的数据加入运算都会转为int类型在运算
- 任何数据类型和字符串进行连接时都会变成字符串
- 前++和后++单独使用没有任何区别-》混合使用时前++,立刻马上加一【先加后用】,后++先用变量本来的数值【先用后加】
- 逻辑运算符中,在&&时前边是false后边就不执行了,在||中前边是true那么后边也不执行
-
方法规则
- 对于有void的方法不可以直接打印和赋值
- 方法重载:多个方法,名称一样,但是参数表不一样-》调用时自动匹配对的上的(其中与个数,类型,顺序有关,与名称,返回值无关)
- 所以引用类型都可以赋值null
-
java内存划分
-
栈(Stack):存放的都是方法中的局部变量。
- 局部变量:方法的参数,或者方法{}内部的变量
- 作用域:一旦超出作用域,立刻从栈内存中消失
-
堆(Heap):凡是new出来的东西,都是在堆当中的。(对象)
- 堆里边的东西都有一个地址值:16进制
- 堆里边的数据都有默认值规则;
- 整数 默认值为0;
- 浮点 默认0.0;
- 字符 默认’\u0000’\
- 布尔 默认false
- 引用 默认null
-
方法区(Method Area):储存类的相关信息,包含方法信息
-
本地方法栈(Native Method Stack):与操作系统有关
-
寄存器(pc Register):与CPU相关
-
二、 java常用API
- 数组的使用
正常数组的声明
int[] aray={10,20,22}; // 可以分开声明也可以一起
int[] arry1;
arry1=new int[]{1,2,3};
// 动态数组声明
int arry2[]=new int[10]; //如果期间未赋值,默认都为0
数组的遍历方法
for (int i:arry) {
System.out.println(i);
}
for (int i=0;i<arry.length;i++) {
System.out.println(arry[i]);
}
- ArrayList 对象的使用
- 数组的长度是可以改变的其中有一个尖括号代表泛型。泛型就是装在集合当中的所有元素,全都是统一类型,泛型只能是引用类型,不是基本的类型
- 对应集合来说,直接打印得到的不是地址,而是内容
- 对应ArrayList来说添加元素一定成功返回值可以不用,但是其他不一定
- 泛型只能是引用类型,不能是基本类型
- 如果希望使用基本类型就要用到包装类
ArrayList<String> list=new ArrayList<String>();
ArrayList<Integer> list=new ArrayList<Integer>();
方法 | 作用 |
---|---|
boolean add(Object obj) | 将指定元素obj追加到集合的末尾 |
Object get(int index) | 返回集合中指定位置上的元素 |
int size() | 返回集合中的元素个数 |
boolean add(int index, Object obj) | 将指定元素obj插入到集合中指定的位置 |
Object remove(int index) | 从集合中删除指定index处的元素,返回该元素 |
void clear() | 清空集合中所有元素 |
Object set(int index, Object obj) | 用指定元素obj替代集合中指定位置上的元素 |
- String字符串对象的使用
- 字符串不可改变所以是可以共享使用的
- 字符串的效果相对于char[]字符数组,但底层原理是byte[]字节数组。
char[] ca={'a','b','c','d','e'};
Stirng st=new String(ca);
方法 | 作用 |
---|---|
int length() | 获取字符串的长度 |
char charAt(int index) | 获取指定索引位置的字符 |
int indexOf(int ch) | 返回指定字符在此字符串中第一次出现处的索引 |
String substring(int start) | 开始截取字符串,到结尾 |
substring(int start,int end) | 截取对应索引字符串 |
char[] toCharArray() | 将字符串转换成为一个个字符组成的字符组 |
boolean equals (Object anObject) | 将此字符串与指定对象进行比较 |
boolean equalsIgnoreCase (String anotherString) | 比较忽略大小写,常用与验证码 |
String replace (CharSequence target, CharSequence replacement) | 将与target匹配的字符串使用replacement字符串替换 |
String[] split(String regex) | 将字符串按照regex(正则)规则进行分割成为字符串数组 |
boolean contains(CharSequence s) | 判断字符串中是否包含指定字符 |
- Math数学工具类的使用
Math.abs()
绝对值Math.ceil()
向上去找,就如2.1区3;Math.floor()
向下去找,抹零(2.9)2;Math.round()
四舍五入;Math.PI
圆周率
- Random 随机数对象
Random r =new Random();
int num=r.nextInt(10);//创建随机数范围在10以内,不填的话也可以
- Arrays类与数组相关的工具类
提供了大量的静态方法,用于数组操作
int[] a={1,2,3};
String a=Arrays.toString(a);//转换为字符串类型
Arrays.sort(a);//默认可以从小到大排序 //如果是字符串就按照字
母来排序
三、java 静态关键字static
- 一旦用了static关键字,那么这样的内容不再属于对象自己,而是属于类的,属于类的共享同一份数据。(用于成员变量)//属于类的属性了
- 大概也是是,用来static关键字后,方法或成员变量,不能通过
new 类()
的方式访问了,而是直接通过类.方法
的方式进行访问 - 成员方法可以访问成员变量和静态变量(方法)
- 静态方法,可以访问静态变量但是不能直接访问成员变量(原因,在内存中先有静态内容,后有非静态内容)静态方法中不能有this的。
- 静态代码块,当第一次用到类时,执行唯一的一次。
- 静态总是优先于非静态,多用于一次性的对静态成员变量赋值
static {
System.out.println("测试");
}
四、 final和内部类
1. final关键字
- final关键字用来修饰一个类的时候public final class 类名->当前这个类不能有任何子类(最终类)
- 当final用在一个方法时这个方法是最终的方法,不能被覆盖重写(不可重写方法)
- 对于类,方法来说abstract关键字和final关键字不能同时使用,因为矛盾
- 用于局部变量,后边就不能改变了,只要有唯一一次赋值就是正确的
- 成员变量具有默认值,所以用了final之后必须手动赋值,不会在给默认值可以直接赋值或者构造方法赋值,要保证所有构造方法都要赋值
- 同一个包里边不需要导包
2. 权限修饰符
- 外边类{内部类{}}
- 内用外,随意访问,外用内,需要内部类对象。
- 第三方访问时,在外部类的方法当中使用内部类,然后main只能调用外部类的方法
- 如果直接访问【外部类.内部类 对象名=new外部类().new 内部类】
- 同名变量方法this用法
- 局部内部类
- 修饰符class 外部类名称{修饰符 返回值类型 外部类方法(参数列表){class 局部内部类名称{}}}
- 因为只有局部方法可以访问所以什么都不能写
- 匿名内部类
- 如果接口的实现类(或父类的子类)只需要唯一的一次,那么这种情况下可以省略掉该类的定义而使用【匿名内部类】
- 接口名称 对象名=new 接口名称(){//覆盖抽象方法};
- 可以省略对象的名称,直接new【匿名对象】与【匿名内部类】不是一回事
- 成员变量可以用类作为成员变量的类型的
- 接口可以作为成员变量的类型
- 接口作为参数和返回值
五、 java的线程与异常
1. 异常
- java.lang.Throwable类是java语言中所有错误或异常的超类
- throw关键字在指定的方法中抛出指定的异常:
- throw new ***Exception(“异常产生原因”)
- throw关键字必须在方法内部
- 多用在if后边if满足条件就会执行
- throw抛出指定的异常对象,我们就必须处理这个异常对象
- 如果要判断是否为空异常可以用Objects.requireNonNull()
- 处理异常,在方法使用时throws AAAExcepiton{throw new ***Exception(“异常产生原因”)}
- 这个的报出异常不会直接处理,后边代码不会执行
- try_catch
- try可能抛出多个异常对象,那么就可以使用多个catch来处理,执行完catch中的逻辑后后边代码还会继续执行
- try没异常catch不会执行
- getMessage()返回throwable的简短描述
- toString()详细描述
- printStackTrace()JV打印异常对象,默认此方法,打印的异常最全面
- finally:有一些特定的代码无论异常是否发生,都需要执行,在这代码块中的代码一定会执行的资源释放,不可单独使用
- 如果finally中有return那么永远反复finally中的结果
2. 多线程
- 并发,同一个时间段执行,并行,同时执行
- 多线程可以解决,一个地方错误,下一个还可以执行
- 创建Thraad子类,重写run方法,设置线程任务,创建对象,调用start方法java是抢占调度,那个线程优先多高就执行哪个,同级随机执行
- 在线程run方法里边可以通过getName获取线程的名字设置线程的名称setName,创建父类的构造方法传递名称
- sleep()使当前正在执行的线程以毫秒的数暂停
- 可以通过接口来实现多线程Runnable,好处,还可以继承其他类,
- 匿名类实现线程创建,new一个线程父类、接口()然后重写run的方法调用start方法
- 线程安全问题,多线程访问了共享的数据就会产生线程安全问题
- 解决,同步代码块-》run里边的代码放进synchronized里边,静态的方法可以可以解决,this也快要Lock接口分别在代码执行前调用lock方法和结束后调用unlock方法
- 线程的转态Waiting无限等待状态,notify()线程唤醒状态,wait()方法,和notify()方法Object对象的方法,在wait里边加入参数可以做到在指定时间唤醒
- 如果有多高等待线程notify随机唤醒一个,notifyAll唤醒全部
- 为了合理利用资源所有线程之间需要通信(协作)
- 线程池,就是在用线程的时候用到很多的线程,然后创立一个线程池,用来放线程的,容器Linked
3. Lambda 表达式
new Thraed(new Runnable(){
@Override
public void run(){
System.out.println(Thread.currenthread().getName()+"线程创建了");
}
}).start();
Lambda表达式用法()里边的括号就代码run方法
new Thraed(()->{
System.out.println(Thread.currenthread().getName()+"线程创建了");
}).start();
- ()接口的抽象方法的参数列表,没有参数就空着,有参数就写参数
- ->传递的意思就是,把参数传递给方法体{}
- {}重写接口的抽象方法体
- 一句话大括号可以省略,;可以省略
六、 多态与继承
-
继承是多态的前提,如果没有继承就没有多态
-
继承-父会什么子就会什么子可以有自己的专属内容,主要解决的是:共性抽出(解决共同方法的问题);
-
区分子类方法重名情况个代表
- 局部变量 直接写成员变量名
- 本类变量 this.成员变量名
- 父类变量 suprt.成员变量
-
同名方法,创建的对象时谁就用谁,没有上父类去找
-
重写(Override):方法的名称一样,参数列表‘也一样’
-
重载(Overrload):方法的名称一样,参数列表‘不一样’
-
@Ovreeide可以用于检测你是否正确重写(覆盖)(可选安全检查)
- 子类的放回值必须小于等于父类方法的返回值范围。
- java.lon.Object类是所有公共最高父类,如java.lang.String是Object的子类。
- 子类方法的权限必须大于等于父类的的方法权限修饰符
- public>protected>(default)什么都不写>private
- super的父类构造调用,必须是子类构造方法的第一个语句,不能一个子类调用多次super的构造方法
七、抽象类
- 抽象方法必须加上abstract关键字,然后去掉大括号,直接分括号结束。
- 抽象类。抽象方法所在的类,必须为抽象类,在class前加上abstracr
- 不能直接创建new抽象对象。必须用一个子类来继承父类
- 子类必须覆盖重写抽象父类当中的所有的抽象方法,子类去掉抽象方法中的abstract关键字,然后补上大括号,通过子类对象使用
- 不用写完所以抽象方法,那子类也是抽象类。
- 抽象类不一定有抽象方法
八、单元测试Junit
- (一般) 创建对象调用类方法就是测试了
- 定义一个测试类**Text
- 定义测试方法:可以独立运行的,返回值void
- 加上@Test注解
- 导入Junit包
- 结果判定看到红色就是测试失败,绿色是成功
- @Befoer初始化方法,用于申请资源,修饰的方法会在测试方法执行之前自动执行
- @After释放资源的方法,修饰的方法会在测试方法执行之后自动执行
九、 反射
反射,将类的各个组成部分封装为其他的的对象,这就是反射
1. 获取字节码文件Class对象的方式:
Class.forName("全类名"):
将字节码文件加载进内存,返回Class对象- *多用于配置文件,将类名定义配置文件中,读取文件加载类*
类名.Class
:通过类名属性class获取可用于传参对象.getClass
:getClass方法在Object类中定义着多用于对象的获取字节码的方式- 这这个方发放在同一个字节码文件(*.class)中一次程序运行过程中,只会被加载一次,不论通过1-3那种方式调用都是同一个Class对象
- 获取成员变量getFields(获取public的成员变量)
- 获取构造方法
Constructoe<?> getContructies()
- 获取成员方法
getMethds()
- 或取类名
getName()
- 忽略访问修饰符的安全检查
setAccessible(true)
2. 其他
- 可以在cmd中输入javadoc **.java在当前目录生成一个注解文件,AIP说明
- @Deprecated注解下的方法说名方法已经过时了,在其他地方调用时就会出现下划线
- @SupperssWarnings(“all”)用于压制警告,用了之后IDE就不会标记出警告了
十、注解
- 自定义注解
- 格式:
- 元注解
- 用于描述注解的注解
- 已经定义好的
- 怎么弄查AIP文档把
- @Target描述注解能够作用的位置
- @Retention描述注解被保留的阶段
- @Documented描述注解能否被抽取到API文档中
- @Inherited描述注释是否被子类继承
- public @interface **{}注解本质上就是接口默认继承Annotation接口
- 可以定义属性就是(抽象方法)
- 属性的返回值类型 基本数据类型,枚举,注解,上边类型数组
- 定义了属于都有赋值
- 不想给他们赋值可以在定义是加上default
- 只有一个属性需要赋值可以直接定义值
- 元注解
- 格式:
十一、接口
-
接口中的常量的命名规则推荐使用完全大写字母,用下划线分隔
-
接口是没有静态代码块和构造方法的
-
一个类如果直接父类当中的方法,和接口当中的默认方法产生冲突,优先使用父类当中的方法
-
接口是一种引用类型,最重要的是:抽象方法
-
定义:
public interface name
-> 编译后**.class** -
在任何的版本java中,接口都可以定义抽象方法
-
在接口的抽象方法中是固定的public abstract(可以省略)
-
public class 实现类名称 implements 接口名称{}
-
接口的实现类必须覆盖重写(实现)接口所有抽象方法。创建对象使用
-
java8中接口可以定义静态方法。
- public static 返回值类型 方法名称(参数){}
- 注意:不可以通过接口类的对象来调用接口中的静态方法。
- 通过接口名称直接调用其中的静态方法。
十二、 java 集合操作
- 常见的集合有:
Vector,ArrayList,LinkedList,TreeSet,HashSet,LinkedHashSet
List
接口有序的集合,允许重复元素,有索引(前三个)Set
接口后三个不允许重复元素,没有索引- Collection集合
方法 | 作用 |
---|---|
boolean add | 添加元素 |
void claer | 清空集合 |
remover | 移出对象 |
contains(E e) | 判断当前集合是否有某个对象 |
isEmpty() | 判断集合是否为空 |
size() | 判断集合的大小 |
Object[] toArray() | 把集合元素存到数组中 |
-
上方举例的集合都有表格中的方法
-
迭代,即Collection集合元素通用的获取方式,在取出元素之前要先判断集合中有没有元素,如果有,就把这个元素取出来,继续判断,如果还有在继续取出,直到把所有的元素都提取出来
-
Iterator<Stirng> it=coll.iterator();
迭代器多态 -
使用增强for循环遍历数组
for(int i:arr)
arr数组 -
set接口HashSet哈希表,没有顺序的的接口查询的速度非常快
-
Collections工具类addAll(集合,元素)可以一次性的往集合中加入多个元素元
shuffle(list)
;打乱集合中的顺序sort
对集合元素进行排序
泛型
-
一种未知的数据类型,当不知道又啥时就用这个<>
- 不使用泛型,好处:集合不使用泛型,默认的就是Object类型,可以储存任意类型的数据但是容易引发异常
- 使用,可以避免转型的麻烦,储存是什么类型,取出就是什么类型,在写代码时就会报错
- 泛型是什么类型,只能存储什么类型
-
可以定义一个泛型的类class a<>;方法等,public void a(M m)含有泛型的方法时,在调用传递什么参数,泛型就是什么类型的,泛型的接口等
-
不能对象使用只能方法使用
-
Debug调试程序,可以让代码逐行执行f8逐行执f7进入方法中,shift+f8跳出方法,f9跳到下一个断点,ctrl+f2退出debug
-
Map中元素是成对存再到,每个元素由两个部分组成,通过键可以找到对应的值。键是唯一的
-
HashMap哈希结构的,无序,速度快
- LinkeDHashMap继承哈希表,集合是有序的
-
添加元素put,删除remove,get获得指定的键值containskey判断是否有这个键Set<>keySet()获取所有的键保存到set中,set<Map,Entry<k,V>>entrySet()获取到Map的集合中所有Map的键值对象的集合
-
遍历Map
Iterator<String>it=set.iterator();
while(it.hasNext()){
String key=it.next();
Integer value=map.get(key);//迭代器遍历
//增强for
for(string key:set)