mahaonan 的个人博客   >   标签墙   >   java 标签

java细节知识整理 有更新!

2022-07-18

java细节知识整理 java基础 普通for循环和增强for循环都需要判断是否为null list移除类型为int的元素,不能直接写,这样会默认移除下标,应该按如下写 list.remove(new Integer(1)); spring相关 HandlerMethodArgumentResolver 可以对controller的参数进行处理,用来做验证,自动赋值等等操作,详细引用参考springboot-practice中的CurrentUserIdMethodArgumentResolver

02-java反射(一) 有更新!

2022-07-18

02-java反射(一) java反射(一) 一. 反射的基本操作原理 1.1 实例化Class对象的方法 Object类中的getClass()方法 public final Class<?> getClass() 此方法不能被子类所重写,且所有类的实例化对象都可以使用 利用包.类.class的形式实例化Class对象 例如java.util.Date.class,在一些开源框架中会大量使用 利用Class类中的forName()方法 主要可以用在工厂类上,jdbc驱动加载 1.2 Class对象的应用 newInstance() public T newInstance() throws InstantiationException, IllegalAccessException InstantiationException -> 没有无参构造,类名错误 IllegalAccessException -> 构造方法私有化 该方法只能调用类中的无参构造方法,相当于使用new进行对象的实例化操作- 面试题: new实例化....

07-java8剖析(一) 有更新!

2022-07-18

07-java8剖析(一) java8剖析(一) 一. lambda表达式 1.1 lambda表达式 在java中,我们无法将函数作为参数传递给一个方法,也无法声明返回一个函数的方法 基本结构 (param1, param2, param3) -> { } lamda表达式仍然是对象 lambda表达式传递行为,而不仅仅是值 提升抽象层次 API重用性更好 更加灵活 1.2 函数式编程 函数式编程的核心在于,由方法内部实现的业务逻辑改为由调用者声明。方法内部仅提供公用的逻辑。 是一种更高层次的抽象 1.3 方法引用 是一种语法糖,对lamda表达式语法的一种简写 List<String> list = Arrays.asList("mhn", "nhh"); list.forEach(System.out:: println); 类名:: 静态方法名 引用名::实例方法名 类名:: 实例方法名 构造方法引用 类名::new 二. 函数式接口 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口 如果我们....

03-java反射(二) 有更新!

2022-07-18

03-java反射(二) java反射(二) 一. 利用反射操作简单java类 1.1 定义实体类 company类 package entity; import java.io.Serializable; import java.util.Date; public class Company implements Serializable { private String name; private String address; private Date creatDate; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Date getCreatDate() { return creatDate....

05-java并发编程(进阶) 有更新!

2022-07-18

05-java并发编程(进阶) java并发编程(进阶篇) 一. volatile关键字 1.1 作用 强制线程到共享内存中读取数据,而不从线程工作内存中读取,从而使变量在多个线程间可见 一般意义上,一个共享变量会有一个共享内存,然后每个线程都有各自的工作内存,当操作数据时,线程会将共享变量从共享内存中读取到自己的工作内存,因此在操作期间,各个线程之间是不可见的,这样就会引发线程安全问题。 使用volatile关键字,则会忽略从共享内存读取到工作内存,在工作内存中进行独立操作的步骤。而是直接从共享内存中拿数据,操作,然后写入。 不使用volatile: 从共享内存读取到工作内存-> 在工作内存中读取到程序并操作-> 写入工作内存-> 写入共享内存 使用volatile: 从共享内存中读取到程序并操作-> 写入到共享内存 因此,解决了线程可见性的问题 例子 package base; import java.util.ArrayList; import java.util.List; public class DemoThread13{ p....

04-java并发编程(基础) 有更新!

2022-07-18

04-java并发编程(基础) java并发编程(基础篇) 一. 线程安全是如何产生的 多个线程操作同一对象 没有达成原子性,即操作是各自独立的,不是一个整体 当多个线程并发运行操作同一数据时,由于线程切换的时机不可控,可能会导致操作该数据时的过程未按照程序设计的执行顺序运行,导致操作出现混乱,严重时可能会导致系统瘫痪. 二. 认识线程安全与Synchronized 2.1 线程安全 概念 当多个线程访问某一个类,对象或者方法时,这个类,对象或方法都能表现出与单线程一致的行为,那么这个类,对象或方法就是线程安全的. 缘由 线程安全问题都是由全局变量及静态变量引起的 注意事项 若只有读操作,无写操作,那么一般而言是线程安全的 若有多个线程同时写,一般都要考虑线程安全问题 2.2 synchronized 普通方法上使用synchronized(对象锁) 当一个方法是用synchronized修饰后,那么该方法变为"同步方法",多个线程不能同时进入方法内容运行.而必须有顺序的一个一个运行.这样就可以避免并发安全问题. 在方法上使用synchro....