JAVA基础相关
Java基础
喵行星
1
展开
-
为什么需要重写 equals方法?
因为如果不重写equals方法,当将自定义对象放到 map或者 set中时;如果这时两个对象的 hashCode相同,就会调用 equals方法进行比较,这个时候会调用 Object中默认的 equals方法,而默认的 equals方法只是比较了两个对象的引用是否指向了同一个对象,显然大多数时候都不会指向,这样就会将重复对象存入 map或者 set中。这就破坏了 map与 set不能存储重复对象的特性,会造成内存溢出。...原创 2022-01-04 20:09:36 · 2471 阅读 · 0 评论 -
2021年11月11日19:53:29
/** * flag:1207 * 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。 * <p> * 如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。 */ public boolean uniqueOccurrences(int[] arr) { Map<Integer, Integer> map = new HashMap<>(); ...原创 2021-11-08 15:26:46 · 260 阅读 · 0 评论 -
ThreadLocal
ThreadLocalThreadLocal 不是用来解决共享对象的多线程访问问题的,ThreadLocal只适用于 共享对象会造成线程安全的业务场景ThreadLocalMapThreadLocalMap是ThreadLocal的静态内部类,数据存放在ThreadLocalMap.Entry里面。thread,threadLocal,threadLocalMap,Entry之间的关系:Tips:实线表示强引用,虚线表示弱引用需要注意的是Entry中的key是弱引用,当threadLoc原创 2021-09-29 09:59:05 · 67 阅读 · 0 评论 -
Optional简单测试
@Test void optionalTest() { User user = new User(); user.setUserId(1L); user.setName("张三"); Optional<User> optionalUser = Optional.ofNullable(user); optionalUser.filter(u -> u.getUserId() == 1L);原创 2021-09-28 16:48:15 · 93 阅读 · 0 评论 -
反射相关以及isAccessible()的正确使用
User.class@Data@NoArgsConstructor@AllArgsConstructorpublic class User {// @JsonProperty("pId") private Long userId; private String name; private void say(String word){ System.out.println("Hello" + word); } private vo原创 2021-09-28 15:19:19 · 416 阅读 · 0 评论 -
CountDownLatch、 CyclicBarrier、 Semaphore
CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行。【类似于门栓,想出去就必须等着(countDownLatch.await())把门栓全部打开,一个门上有几个门栓(new CountDownLatch(3)),你要开门就必须打开所有的门栓(countDownLatch.countDown())】例子: /** * countDownTest */ @Test void countDownTest() t原创 2021-09-27 20:31:10 · 44 阅读 · 0 评论 -
Condition相关
Condition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒await():把当前线程阻塞挂起【和wait方法语义相同】,使当前线程进入等待队列并释放锁,同时线程状态变为等待状态。当从 await()方法返回时,当前线程一定获取了Condition 相关联的锁signal():唤醒阻塞的线程【和notify方法语义相同】,将Condition队列的第一个节点转换到AQS同步队列中,同时修改 AQS 队列中原先尾节点的状态。当.原创 2021-09-27 20:00:16 · 50 阅读 · 0 评论 -
算法111
@Test void OJTest() { int K = 5, N = 4, M = 5, t = K - N; List<Integer> person = new ArrayList(N); for (int i = 1; i <= N; i++) { person.add(i); } List<Integer> book = new ArrayList(M).原创 2021-09-15 21:04:27 · 45 阅读 · 0 评论 -
2021-09-15
@Test void OJTest() { int K = 5, N = 4, M = 5, t = K - N; List<Integer> person = new ArrayList(N); for (int i = 1; i <= N; i++) { person.add(i); } List<Integer> book = new ArrayList(M);原创 2021-09-15 20:52:09 · 43 阅读 · 0 评论 -
PostgreSQL模式(SCHEMA)
PostgreSQL 模式(SCHEMA)可以看着是一个表的集合。一个模式可以包含视图、索引、数据类型、函数和操作符等。相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1 和 myschema 都可以包含名为 mytable 的表。使用模式的优势:允许多个用户使用一个数据库并且不会互相干扰。将数据库对象组织成逻辑组以便更容易管理。第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。模式类似于操作系统层的目录,但是模式不能嵌套。...原创 2021-09-15 15:18:39 · 442 阅读 · 0 评论 -
BufferedInputStream练习
@Test void closeIOTest() { BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(new FileInputStream("123.png")); bos = new BufferedOutputStream(new FileOu..原创 2021-09-13 16:23:28 · 101 阅读 · 0 评论 -
高并发下缓存失效问题
缓存穿透指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此记录,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义风险:利用不存在的数据进行攻击,数据库瞬时压力增大,最终导致崩溃解决:null结果缓存,并加入短暂过期时间缓存雪崩缓存雪崩是指在我们设置缓存时key采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。解决:原有的失效时间基础上增加一个随机值,比如1-5分原创 2021-09-12 23:41:12 · 121 阅读 · 0 评论 -
线程池工厂初始化对比
线程池工厂初始化对比名称corePoolSizemaximumPoolSizekeepAliveTimeunitworkQueuethreadFactoryhandlernewFixedThreadPool指定且等于maximumPoolSize指定且等于corePoolSize0LTimeUnit.MILLISECONDSnew LinkedBlockingQueue()Executors.defaultThreadFactory();也可指定new Abo原创 2021-09-10 11:34:30 · 62 阅读 · 0 评论 -
AQS方法为什么抛出异常而不是重写
例如:protected boolean tryAcquire(int arg) { throw new UnsupportedOperationException();}protected int tryAcquireShared(int arg) { throw new UnsupportedOperationException();}为什么要抛出异常而不是声明为抽象类呢?Programer肯定有他自己的考虑,因为AQS是可选模式的,我们选择的是独占模式【Reentrant原创 2021-09-10 11:28:28 · 200 阅读 · 0 评论