每日一点Java基础小知识 — day4
欢迎来到叮当猫学编程的Java基础小知识系列~在这里,你将会看到叮当猫每日关于Java的基础知识总结,期待大家的点赞关注喔
-
在异常处理中,所有的异常都是Exception类的子类,如果想要使用 try - catch 语句捕获异常,若catch中的参数类型有父类子类关系,应该将父类放在后面,子类放在前面
假设父类是Exception,因为所有异常都是Exception的子类,如果把Exception放在前边捕获,后边的catch将永远不会执行
-
Set 不能有重复的元素,且是无序的,要有空值也就只能有一个。因为它不允许重复。 List 可以有重复元素,且是有序的,要有空值也可以有多个,因为它可重复
-
String是final修饰的,不可变;在运行速度上StringBuffer因为兼顾了线程安全,效率不及StringBuilder;StringBuffer是线程安全的
-
C语言当中的String是char类型的数组char[]实现的,并以“\0”结尾;Java的String虽然也是char类型的数组char[]实现的,但并不以“\0”结尾
-
Char类型在Java语言里面存储的不是ASCII码,而是Unicode 编码
-
servlet:
- init方法: 是在servlet实例创建时调用的方法,用于创建或打开任何与servlet相关的资源和初始化servlet的状态,Servlet规范保证调用init方法前不会处理任何请求
- service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用,根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法
- destory方法:是在servlet实例被销毁时由web容器调用。Servlet规范确保在destroy方法调用之前所有请求的处理均完成,需要覆盖destroy方法的情况:释放任何在init方法中打开的与servlet相关的资源存储servlet的状态
-
在接口中,属性都是默认public static final修饰的,这三个关键字可以省略,不能用private关键字修饰,final修饰的属性必须赋值
-
面向对象的多态性是指:针对一消息,不同的对象可以以适合自身的方式加以响应
《疯狂java讲义》的标准解释是: 相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态
-
java多态有两种情况:重载和覆写
- 在覆写中,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法
- 在重载中,运用的是静态多分派,即根据静态类型确定对象,因此不是根据new的类型确定调用的方法
-
局部变量,没有像成员变量那样类加载时会有初始化赋值,所以要使用局部变量时,一定要显式的给它赋值,也就是定义时就给它数值
-
final、finally、finalize三个关键字的区别是:
- final:可用来定义变量、方法传入的参数、类、方法
- finally:只能跟在try/catch语句中,并且附带一个语句块,表示最后执行
- finalize:是垃圾回收器操作的运行机制中的一部分,进行垃圾回收器操作时会调用finalize方法,因为finalize方法是object的方法,所以每个类都有这个方法并且可以重写这个方法,在这个方法里实现释放系统资源及其他清理工作,JVM不保证此方法总被调用
-
关于静态方法:
- 静态方法是一个属于类而不属于对象(实例)的方法
- 静态方法只能访问静态数据,无法访问非静态数据(实例变量)
- 静态方法只能调用其他静态方法,不能从中调用非静态方法
-
ResultSet跟普通的数组不同,索引从1开始而不是从0开始
-
在类的声明中,只能有final和abstract的一个,因为final是最终类,不能继承,必须可以创建实例,而abstract是抽象类,只能继承,不能有实例
-
可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制
**可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。**也就是一个线程修改的结果,另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。但是这里需要注意一个问题,volatile只能让被他修饰内容具有可见性,但不能保证它具有原子性。比如
volatile int a = 0;
之后有一个操作a++;
这个变量a具有可见性,但是a++ 依然是一个非原子操作,也就是这个操作同样存在线程安全问题在 Java 中 volatile、synchronized 和 final 实现可见性
-
原子性:**原子是世界上的最小单位,具有不可分割性。**比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。一个操作是原子操作,那么我们称它具有原子性。java的concurrent包下提供了一些原子类,我们可以通过阅读API来了解这些原子类的用法。比如:AtomicInteger、AtomicLong、AtomicReference等
在 Java 中 synchronized 和在 lock、unlock 中操作保证原子性
-
**有序性:**Java 语言提供了 volatile 和 synchronized 两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含“禁止指令重排序”的语义,synchronized 是由“一个变量在同一个时刻只允许一条线程对其进行 lock 操作”这条规则获得的,此规则决定了持有同一个对象锁的两个同步块只能串行执行
-
str.split(",");
方法是把str字符串根据分割符",“划分成一个字符串数组,如果str字符串中找不到分隔符”,",则把整个str字符串放入字符串数组的第一个元素 -
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
- 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的
- 禁止进行指令重排序
volatile只提供了保证访问该变量时,每次都是从内存中读取最新值,并不会使用寄存器缓存该值——每次都会从内存中读取
而对该变量的修改,volatile并不提供原子性的保证
由于及时更新,很可能导致另一线程访问最新变量值,无法跳出循环的情况
多线程下计数器必须使用锁保护