Java基础知识随记

  1. ==与equals()的区别

    ==比较的是两个对象的地址,或基本数据类型的值。

    equals()是Object中的方法,如果没重写的话比较的也是对象的地址,在String类中重写了equals()方法所以比较的是对象的内容

  2. Java中只有值传递

    就算是传入的是对象的引用,也知识将引用赋值后传递,并不是传递对象。

  3. 线程的基本状态

    初始状态、运行状态、阻塞状态、等待状态、终止状态、等待超时状态

  4. transient 修饰的变量不会被序列化

  5. 关于JVM和JDK、JRE

    ​ JVM是运行Java字节码的虚拟机,JVM具有不同系统的实现,目的是为了相同的字节码都能给出同样的结果,即所说的一处编译到处运行,.java文件通过javac编译成.class文件,.class文件再被JVM所解释成机器码。

    JDK可以用于创建程序,JRE不能创建程序。

  6. Java与C++的区别

    • 都是面向对象编程
    • Java没有指针
    • Java是单继承
    • Java有垃圾回收,无需手动释放内存
    • C++字符串以’\0’结束
  7. String、StringBuffer、StringBuilder

    String 底层是final修饰的char数组(JDK1.9后改为byte数组),所以String是不可修改的,线程安全的,String的修改都是创建一份新的String。

    StringBuffer和StringBuilder底层char数组没有用final修饰,所以是可以修改的,但是StringBuffer是线程安全的,StringBuilder是线程不安全的。

    String:少量数据

    StringBuffer:多线程大量数据

    StringBuilder:单线程大量数据

  8. 接口和抽象类

    • 接口方法默认是public
    • jdk8之前接口方法不能实现,jdk8之后接口可以使用静态方法,也可以使用default关键字实现默认方法,默认方法实现采取覆盖的方式,如果子类也实现了方法则会把接口的默认方法覆盖。如果实现了多个接口,多个接口的默认方法相同则就必须重写避免冲突。
    • jdk9接口引入私有方法和私有静态方法
    • 接口中只能有static、final修饰的变量
    • 抽象类可以有非抽象方法
  9. 成员变量与局部变量

    • 从语法来看,成员变量属于类,而局部变量属于方法参数或方法体,局部变量不同被static所修饰
    • 从内存上看,static修饰的成员变量在方法区的常量池,未用static修饰的成员变量则属于实例对象,而实例对象存在与堆中,局部变量则存在与栈中
    • 生存时间上看,成员变量随着对象的创建而创建随着对象的销毁而销毁,而局部变量随着方法的调用而创建随着方法的结束而消失
    • 成员变量会赋予默认值,而局部变量不会
  10. 线程的执行流程

    • 初始状态,线程被创建了,但还没执行start()方法。
    • 运行状态,又可细分为就绪(READY)和运行(RUNNING),线程执行start()方法后进入就绪状态等待获得cup时间片,然后进入运行。
    • 等待状态,当线程执行wait()方法时就会进入等待状态,只有其他线程唤醒或者超时才能重新进入运行状态
    • 等待超时状态,当等待时间超过设置时间时就会自动进入运行状态
    • 阻塞状态,当线程调用同步方法时,没有获得锁就会进入阻塞状态
  11. final关键字

    • 修饰变量:修饰基本数据类型时,一旦初始化就不能修改,修饰引用类型时,初始化后就不能再指向其他对象。
    • 修饰类:不能被继承,所有方法隐式的声明为final
    • 修饰方法:防止继承类修改,所有private方法都隐式的声明为final
  12. 异常finally块不执行情况

    • finally语句块第一行发生异常,则不执行,如果在其他行发生异常,程序还是会执行
    • 前面使用system.exit(int) 退出程序
    • 程序所在线程死亡
    • CPU关闭
  13. transient 关键字修饰的变量不会被序列化

  14. 七种事务传播行为

    传播行为操作
    PROPAGATION_MANDATORY强制,表示方法必须运行在事务中,如果事务不存在则抛出异常
    PROPAGATION_NESTED支持当前事务,新增savepoint点,与当前事务同步提交回滚
    PROPAGATION_NEVER从不,方法不能运行在事务中,如果有事务则抛出异常
    PROPAGATION_NOT_SUPPORTED方法不能运行在事务中,否则该方法将被挂起
    PROPAGATION_REQUIRED要求,方法必须运行在事务中,没有事务就创建新的事务
    PROPAGATION_REQUIRES_NEW始终创建新的事务来运行方法
    PROPAGATION_SUPPORTS有事务就按事务执行,没有事务就按非事务执行
  15. 五中事务隔离级别

    脏读:读取了没有意义的数据,例如一个事务一在更新一条记录,但事务没有提交前另一个事务二读取了这条记录的数据,之后事务一提交了,那么事务二所读取的数据则是脏数据

    不可重复读取:在事务A中需要多次读取数据,在事务A读取数据的过程中,事务B修改了数据,那么就会导致事务A前后读取的数据不一致

    幻读:事务A对数据表进行操作,但是事务A操作的过程中,事务B对表进行了新增或删除,导致事务A操作过程中数据发送了变化。

    不可重复读取幻读相似,但是不可重复读取重点是说读取的数据改变,只需要锁住行就行,而幻读重点说明新增和删除的改变,需要锁住表。

    隔离级别操作
    ISOLATION_DEFAULT使用数据库默认隔离级别,Mysql的默认隔离级别是可重复读取
    ISOLATION_READ_UNCOMMITTED允许读取未提交的数据,可能导致脏读、不可重复读、幻读
    ISOLATION_READ_COMMITTED允许读取事务中已提交的数据,可能导致不可重复读、幻读
    ISOLATION_REPEATABLE_READ不允许读取一个事务正在操作的数据(但是可以修改表中的其他数据),可能导致幻读
    ISOLATION_SERIALIZABLE串行化,按顺序执行,最安全,但是效率低。
  16. 装箱与拆箱

    JDK1.5之后当声明为:

    ​ Integer i = 1; 时会自动装箱,并且[-128,127]之间的的数在IntegerCache.cache中已经存在缓存,所以当需要装箱时则拿出缓存中的Integer对象,超过范围的则创建一个新的Integer对象。

    当Integer对象运行运算时:

     Integer a = 1 ; 
     Integer b = 2;
     Integer c = a + b;
    
    • a、b初始化时会自动装箱

    • a + b执行时会先将a和b先拆箱,执行运算,令Integer c = 40,然后在触发装箱机制,然后再将运算结果装箱。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值