【Java】每日一点Java小知识 --- day4

每日一点Java基础小知识 — day4

欢迎来到叮当猫学编程的Java基础小知识系列~在这里,你将会看到叮当猫每日关于Java的基础知识总结,期待大家的点赞关注喔

  1. 在异常处理中,所有的异常都是Exception类的子类,如果想要使用 try - catch 语句捕获异常,若catch中的参数类型有父类子类关系,应该将父类放在后面,子类放在前面

    假设父类是Exception,因为所有异常都是Exception的子类,如果把Exception放在前边捕获,后边的catch将永远不会执行

  2. Set 不能有重复的元素,且是无序的,要有空值也就只能有一个。因为它不允许重复。 List 可以有重复元素,且是有序的,要有空值也可以有多个,因为它可重复

  3. String是final修饰的,不可变;在运行速度上StringBuffer因为兼顾了线程安全,效率不及StringBuilder;StringBuffer是线程安全的

  4. C语言当中的String是char类型的数组char[]实现的,并以“\0”结尾;Java的String虽然也是char类型的数组char[]实现的,但并不以“\0”结尾

  5. Char类型在Java语言里面存储的不是ASCII码,而是Unicode 编码

  6. servlet:

    • init方法: 是在servlet实例创建时调用的方法,用于创建或打开任何与servlet相关的资源和初始化servlet的状态,Servlet规范保证调用init方法前不会处理任何请求
    • service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用,根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法
    • destory方法:是在servlet实例被销毁时由web容器调用。Servlet规范确保在destroy方法调用之前所有请求的处理均完成,需要覆盖destroy方法的情况:释放任何在init方法中打开的与servlet相关的资源存储servlet的状态
  7. 在接口中,属性都是默认public static final修饰的,这三个关键字可以省略,不能用private关键字修饰,final修饰的属性必须赋值

  8. 面向对象的多态性是指:针对一消息,不同的对象可以以适合自身的方式加以响应

    《疯狂java讲义》的标准解释是: 相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态

  9. java多态有两种情况:重载和覆写

    • 在覆写中,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法
    • 在重载中,运用的是静态多分派,即根据静态类型确定对象,因此不是根据new的类型确定调用的方法
  10. 局部变量,没有像成员变量那样类加载时会有初始化赋值,所以要使用局部变量时,一定要显式的给它赋值,也就是定义时就给它数值

  11. final、finally、finalize三个关键字的区别是:

    • final:可用来定义变量、方法传入的参数、类、方法
    • finally:只能跟在try/catch语句中,并且附带一个语句块,表示最后执行
    • finalize:是垃圾回收器操作的运行机制中的一部分,进行垃圾回收器操作时会调用finalize方法,因为finalize方法是object的方法,所以每个类都有这个方法并且可以重写这个方法,在这个方法里实现释放系统资源及其他清理工作,JVM不保证此方法总被调用
  12. 关于静态方法:

    • 静态方法是一个属于类而不属于对象(实例)的方法
    • 静态方法只能访问静态数据,无法访问非静态数据(实例变量)
    • 静态方法只能调用其他静态方法,不能从中调用非静态方法
  13. ResultSet跟普通的数组不同,索引从1开始而不是从0开始

  14. 在类的声明中,只能有final和abstract的一个,因为final是最终类,不能继承,必须可以创建实例,而abstract是抽象类,只能继承,不能有实例

  15. 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制

    **可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。**也就是一个线程修改的结果,另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。但是这里需要注意一个问题,volatile只能让被他修饰内容具有可见性,但不能保证它具有原子性。比如 volatile int a = 0; 之后有一个操作 a++; 这个变量a具有可见性,但是a++ 依然是一个非原子操作,也就是这个操作同样存在线程安全问题

    在 Java 中 volatile、synchronized 和 final 实现可见性

  16. 原子性:**原子是世界上的最小单位,具有不可分割性。**比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。一个操作是原子操作,那么我们称它具有原子性。java的concurrent包下提供了一些原子类,我们可以通过阅读API来了解这些原子类的用法。比如:AtomicInteger、AtomicLong、AtomicReference等

    在 Java 中 synchronized 和在 lock、unlock 中操作保证原子性

  17. **有序性:**Java 语言提供了 volatile 和 synchronized 两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含“禁止指令重排序”的语义,synchronized 是由“一个变量在同一个时刻只允许一条线程对其进行 lock 操作”这条规则获得的,此规则决定了持有同一个对象锁的两个同步块只能串行执行

  18. str.split(","); 方法是把str字符串根据分割符",“划分成一个字符串数组,如果str字符串中找不到分隔符”,",则把整个str字符串放入字符串数组的第一个元素

  19. 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

    • 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的
    • 禁止进行指令重排序

    volatile只提供了保证访问该变量时,每次都是从内存中读取最新值,并不会使用寄存器缓存该值——每次都会从内存中读取

    而对该变量的修改,volatile并不提供原子性的保证

    由于及时更新,很可能导致另一线程访问最新变量值,无法跳出循环的情况

    多线程下计数器必须使用锁保护

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值