java基础知识

java 基础知识汇总

本篇文章主要记录,我几年前学习java的知识笔记汇总



一. java常用知识点

  1. 命名规范

    • 类名规范:首字母大写,后边的每个单词首字母大写(大驼峰)
    • 变量名规范:首字母小写,后边的每个单词字母大写(小)
    • 方法名规范:同变量名
  2. 数据类型

    1. 单引号为字符类型(只可以写一个字符)
    2. 双引号为字符串类型
    3. 默认的数字为整形,长整形要在数字末尾加L ,浮点型要在数字末尾加F(如果数字超出范围会溢出)
  3. java运算

    1. bity/short/char/都可以发生数学运算如加发char在数学运算是会转换为一定规则的数据加入运算都会转为int类型在运算
    2. 任何数据类型和字符串进行连接时都会变成字符串
    3. 前++和后++单独使用没有任何区别-》混合使用时前++,立刻马上加一【先加后用】,后++先用变量本来的数值【先用后加】
    4. 逻辑运算符中,在&&时前边是false后边就不执行了,在||中前边是true那么后边也不执行
  4. 方法规则

    1. 对于有void的方法不可以直接打印和赋值
    2. 方法重载:多个方法,名称一样,但是参数表不一样-》调用时自动匹配对的上的(其中与个数,类型,顺序有关,与名称,返回值无关)
    3. 所以引用类型都可以赋值null
  5. java内存划分

    1. 栈(Stack):存放的都是方法中的局部变量。

      1. 局部变量:方法的参数,或者方法{}内部的变量
      2. 作用域:一旦超出作用域,立刻从栈内存中消失
    2. 堆(Heap):凡是new出来的东西,都是在堆当中的。(对象)

      1. 堆里边的东西都有一个地址值:16进制
      2. 堆里边的数据都有默认值规则;
        • 整数 默认值为0;
        • 浮点 默认0.0;
        • 字符 默认’\u0000’\
        • 布尔 默认false
        • 引用 默认null
    3. 方法区(Method Area):储存类的相关信息,包含方法信息

    4. 本地方法栈(Native Method Stack):与操作系统有关

    5. 寄存器(pc Register):与CPU相关

二、 java常用API

  1. 数组的使用

正常数组的声明

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]);
}
  1. ArrayList 对象的使用
    1. 数组的长度是可以改变的其中有一个尖括号代表泛型。泛型就是装在集合当中的所有元素,全都是统一类型,泛型只能是引用类型,不是基本的类型
    2. 对应集合来说,直接打印得到的不是地址,而是内容
    3. 对应ArrayList来说添加元素一定成功返回值可以不用,但是其他不一定
    4. 泛型只能是引用类型,不能是基本类型
    5. 如果希望使用基本类型就要用到包装类
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替代集合中指定位置上的元素
  1. String字符串对象的使用
    1. 字符串不可改变所以是可以共享使用的
    2. 字符串的效果相对于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)判断字符串中是否包含指定字符
  1. Math数学工具类的使用
    1. Math.abs() 绝对值
    2. Math.ceil()向上去找,就如2.1区3;
    3. Math.floor()向下去找,抹零(2.9)2;
    4. Math.round() 四舍五入;
    5. Math.PI 圆周率
  2. Random 随机数对象
Random r =new Random();
int num=r.nextInt(10);//创建随机数范围在10以内,不填的话也可以
  1. Arrays类与数组相关的工具类
    提供了大量的静态方法,用于数组操作
int[] a={1,2,3};
String a=Arrays.toString(a);//转换为字符串类型
Arrays.sort(a);//默认可以从小到大排序 //如果是字符串就按照字

母来排序

三、java 静态关键字static

  1. 一旦用了static关键字,那么这样的内容不再属于对象自己,而是属于的,属于类的共享同一份数据。(用于成员变量)//属于类的属性了
  2. 大概也是是,用来static关键字后,方法或成员变量,不能通过 new 类()的方式访问了,而是直接通过类.方法的方式进行访问
  3. 成员方法可以访问成员变量和静态变量(方法)
  4. 静态方法,可以访问静态变量但是不能直接访问成员变量(原因,在内存中先有静态内容,后有非静态内容)静态方法中不能有this的。
  5. 静态代码块,当第一次用到类时,执行唯一的一次。
  6. 静态总是优先于非静态,多用于一次性的对静态成员变量赋值
static {
    System.out.println("测试");  
}

四、 final和内部类

1. final关键字

  • final关键字用来修饰一个类的时候public final class 类名->当前这个类不能有任何子类(最终类)
  • 当final用在一个方法时这个方法是最终的方法,不能被覆盖重写(不可重写方法)
  • 对于类,方法来说abstract关键字和final关键字不能同时使用,因为矛盾
  • 用于局部变量,后边就不能改变了,只要有唯一一次赋值就是正确的
  • 成员变量具有默认值,所以用了final之后必须手动赋值,不会在给默认值可以直接赋值或者构造方法赋值,要保证所有构造方法都要赋值
  • 同一个包里边不需要导包

2. 权限修饰符

  • 外边类{内部类{}}
  • 内用外,随意访问,外用内,需要内部类对象。
  • 第三方访问时,在外部类的方法当中使用内部类,然后main只能调用外部类的方法
  • 如果直接访问【外部类.内部类 对象名=new外部类().new 内部类】
  • 同名变量方法this用法
  • 局部内部类
  • 修饰符class 外部类名称{修饰符 返回值类型 外部类方法(参数列表){class 局部内部类名称{}}}
  • 因为只有局部方法可以访问所以什么都不能写
  • 匿名内部类
    1. 如果接口的实现类(或父类的子类)只需要唯一的一次,那么这种情况下可以省略掉该类的定义而使用【匿名内部类】
    2. 接口名称 对象名=new 接口名称(){//覆盖抽象方法};
    3. 可以省略对象的名称,直接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可以用于检测你是否正确重写(覆盖)(可选安全检查)

    1. 子类的放回值必须小于等于父类方法的返回值范围。
    2. java.lon.Object类是所有公共最高父类,如java.lang.String是Object的子类。
    3. 子类方法的权限必须大于等于父类的的方法权限修饰符
    4. public>protected>(default)什么都不写>private
    • super的父类构造调用,必须是子类构造方法的第一个语句,不能一个子类调用多次super的构造方法

七、抽象类

  1. 抽象方法必须加上abstract关键字,然后去掉大括号,直接分括号结束。
  2. 抽象类。抽象方法所在的类,必须为抽象类,在class前加上abstracr
  3. 不能直接创建new抽象对象。必须用一个子类来继承父类
  4. 子类必须覆盖重写抽象父类当中的所有的抽象方法,子类去掉抽象方法中的abstract关键字,然后补上大括号,通过子类对象使用
    1. 不用写完所以抽象方法,那子类也是抽象类。
  5. 抽象类不一定有抽象方法

八、单元测试Junit

  1. (一般) 创建对象调用类方法就是测试了
  2. 定义一个测试类**Text
  3. 定义测试方法:可以独立运行的,返回值void
  4. 加上@Test注解
  5. 导入Junit包
  6. 结果判定看到红色就是测试失败,绿色是成功
  7. @Befoer初始化方法,用于申请资源,修饰的方法会在测试方法执行之前自动执行
  8. @After释放资源的方法,修饰的方法会在测试方法执行之后自动执行

九、 反射

反射,将类的各个组成部分封装为其他的的对象,这就是反射

1. 获取字节码文件Class对象的方式:

  1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
  2. *多用于配置文件,将类名定义配置文件中,读取文件加载类*
  3. 类名.Class:通过类名属性class获取可用于传参
  4. 对象.getClass:getClass方法在Object类中定义着多用于对象的获取字节码的方式
  5. 这这个方发放在同一个字节码文件(*.class)中一次程序运行过程中,只会被加载一次,不论通过1-3那种方式调用都是同一个Class对象
  6. 获取成员变量getFields(获取public的成员变量)
  7. 获取构造方法Constructoe<?> getContructies()
  8. 获取成员方法getMethds()
  9. 或取类名getName()
  10. 忽略访问修饰符的安全检查setAccessible(true)

2. 其他

  1. 可以在cmd中输入javadoc **.java在当前目录生成一个注解文件,AIP说明
  2. @Deprecated注解下的方法说名方法已经过时了,在其他地方调用时就会出现下划线
  3. @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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

StarLightLu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值