JAVA相关
面试、工作整理
大城市里的小麻雀
这个作者很懒,什么都没留下…
展开
-
@Autowired 与@Resource的区别
面试问这两个注解的区别是什么?不要仅仅回答下面这句话,一看就是背的,要把下面的demo研究明白,会让面试官为你这次面试加分的。@Autowired默认按类型装配,而@Resource默认按照名称进行装配demo01:1)TestAServiceImpl ,TestBServiceImpl 都实现了TestService 接口public interface TestService { void test();}@Servicepublic class TestAServiceIm原创 2021-06-02 21:34:23 · 125 阅读 · 0 评论 -
为什么说ArrayList是线程不安全的?
1,什么是线程安全与不安全?在多线程访问的时候,采用了加锁的机制,当一个线程访问一个类的数据时对其进行保护,在此期间,其他线程不能访问,直到该线程操作完,其他线程才可以进行操作,这样的话不会产生数据不一致或对数据产生污染等问题。如果线程不安全,多个线程操作同一个类可能会产生数据不一致的问题。2,举例写出ArrayList是线程不安全的查看add方法:从源码中看到,add方法中并没有sync...原创 2020-02-20 20:57:44 · 278 阅读 · 0 评论 -
集合源码学习--ArrayList
属性:private static final int DEFAULT_CAPACITY = 10;private static final Object[] EMPTY_ELEMENTDATA = {};private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};transient Object[] eleme...原创 2020-02-20 18:58:59 · 106 阅读 · 0 评论 -
@ConfigurationProperties与@Value的区别
最近面试被问到如何获取properties里面的值?我说用@Value,因为我只用过@Value,面试结束以后面试官说也可以使用@ConfigurationProperties,回去学习一下。。。今天来整理一下,以备以后开发使用。推荐地址:https://blog.csdn.net/qq_43513205/article/details/86564166@ConfigurationProperties可以理解为编写一个JavaBean来和配置文件进行映射;如果只想在某个业务逻辑中获取一下配置文件中的原创 2021-06-06 18:31:43 · 203 阅读 · 0 评论 -
接口与抽象类的区别?
什么时候使用抽象类和接口?如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类。如果你想实现多重继承,那么你必须使用接口如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。...原创 2020-02-21 13:33:09 · 84 阅读 · 0 评论 -
java基础中Arrays.toString()方法
在学完数组以后,如果想要把数组中的内容打印出来,直接调用toString()方法只会打印出数组的地址,因此需要使用Arrays的toString()方法。//代码截图如下: 通过源码我们可以看出Arrays的toString()方法是一个重载的方法。方法里的参数可以是8种基本数据类型及String类型的数组。...原创 2019-08-15 00:06:52 · 6785 阅读 · 0 评论 -
大厂必问的HashMap底层原理之一
HashMap是以key-value键值对存储的,jdk1.8以后,底层的数据结构是数组+链表+红黑树,数组是HashMap主体,链表是为了解决hash冲突解决的(hash冲突是指两个对象调用hashCode()计算出的哈希值一致导致计算的数组索引值相同),也称“拉链法”解决哈希冲突。当链表长度大于阈值(默认为8)时并且数组的长度大于64时,链表将会转换为红黑树,加入红黑树是为了高效的查询。注意...原创 2020-03-10 14:23:54 · 940 阅读 · 1 评论 -
java关于面向对象的三大特性
java关于面向对象的三大特性面向对象的三大特征:1,封装性我们在设计程序的时候,主要最多的时间花在类的设计上,将相应的功能都体现在类的方法中,体现了封装性,封装也称为隐藏。在 Java中,设计了4种不同的权限修饰符,根据不同的权限修饰符去修饰类的结构,体现了被调用时可见性的大小。开发中用的最多的是public和private。封装性的具体体现之一是将类的属性私有化(private),通过公...原创 2019-08-10 21:22:24 · 140 阅读 · 0 评论 -
创建线程的四种方式
1,继承Thread类(底层 Thread类也实现了 Runnable接口)class MyThread extends Thread2,实现Runnable接口class MyThread implements Runnable3,(JDK1.5以后)实现Callable接口4,使用线程池面试题:说说方式1与方式2的优缺点:实现Runnable要好于继承Thread,原因:① ...原创 2020-02-20 14:05:37 · 96 阅读 · 0 评论 -
String类中的==与equals()的区别面试笔试题
String中的与equals()区别:解析:在Object类中,如果自定义的类没有重写equals()方法默认比较类似于的作用,即地址值是否相等源码如下:但在String类中,我们可以看出String类重写了equals()方法源码如下:通过源码,String类比较的是两个对象的实体内容是否相等接下来我们来看一下容易混淆的面试笔试题:其内存结构如下: 通过上面的方式定义肯定是...原创 2019-08-27 22:46:39 · 502 阅读 · 0 评论 -
spring.profiles.active的使用
以前在工作中总是不明白spring是如何区分不同环境的,今天写了一个简单的小demo,明白了。记录一下,以备自己以后独立开发项目使用。首先应该在pom.xml中添加以下配置: <profiles> <profile> <!-- 生产环境 --> <id>prod</id> <properties> <pr原创 2021-09-16 16:16:47 · 30143 阅读 · 5 评论 -
SpringBoot定时任务基于@Scheduled注解实现
今天整理的demo适合简单的业务场景使用,实现起来非常简单。1,首先创建一个SpringBoot工程@SpringBootApplication@EnableScheduling //开启定时任务public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }}2,在配.原创 2021-07-21 16:02:17 · 271 阅读 · 0 评论 -
EasyExcel实现数据的导出
简单的测试demo,针对场景:只对一个sheet的导出操作1,首先引入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.4</version> </dependency>2,假设只.原创 2021-07-21 15:47:00 · 3663 阅读 · 0 评论 -
List中属性转换成以指定字符分隔的字段串
在工作中会遇到下面一个场景:从数据库中根据某些条件查询会返回很多条数据,这些数据返回到后台我们用List集合接收,由于List的泛型是我们后台自定义实体类,我们只想要获取这些数据中实体类的某一个字段的值并将其转换成以逗号分隔的字符串。说了这么多都是业务场景,技术上讲其实说白了就是将list中对象的属性以逗号分隔转为字符串。代码如下:方法一:List<自定义类>@Data@AllArgsConstructorclass Student { public String name;原创 2021-04-09 16:01:06 · 888 阅读 · 0 评论 -
线程池中submit与execute的区别
ExecutorService executorService = Executors.newCachedThreadPool(); //调用execute() executorService.execute(()-> System.out.println("执行execute方法!") ); //调用submit() executorService.submit(() -> ...原创 2020-06-07 16:15:27 · 338 阅读 · 0 评论 -
volatile不保证原子性验证
原子性:一个线程在操作时,中间不可能有其他线程来抢占资源,此操作要么成功,要么失败。验证不保证原子性:public class AtomicTest { volatile int num; void add() { num++; } public static void main(String[] args) { AtomicTest atomicTest = new AtomicTest(); for (int i原创 2020-06-05 16:26:20 · 200 阅读 · 0 评论 -
JVM面试题---进阶篇(一)
一,垃圾回收,如何判断哪些对象当作垃圾需要被回收?在内存中,要进行垃圾回收,首先我们先明确什么是垃圾?内存中不再使用的内存空间我们都称为垃圾。如何判断该对象是否需要垃圾回收?可达性分析算法也称根搜索路径算法:从GC Root对象为起点,向下开始搜索,如果一个对象到GC Root没有任何引用链相连时,则说明此对象不可用,也即给定一个集合的引用作为根出发,通过引用关系遍历对象,能被遍历的对象则判定为存活,没有遍历到的则判定为死亡。上面我们提到GC root,哪些对象可以作为GC Root对象?《深入理原创 2020-05-20 18:59:50 · 578 阅读 · 0 评论 -
volatile保证可见性验证
可见性:在多线程的环境下,一个线程对共享变量的修改,其他线程可以看到变量修改后的值。验证可见性demo:public class TestVolatile extends Thread { volatile boolean flag; @Override public void run() { try { Thread.sleep(3000L); } catch (InterruptedException e) {原创 2020-05-19 11:32:14 · 236 阅读 · 0 评论 -
Semaphore使用
构造器:public Semaphore(int permits) :permits 表示许可线程的数量,多个线程同时执行,但是限制同时执行的线程数量为permits个。方法:acquire() 表示阻塞并获取许可release() 表示释放许可模拟6辆车驶入3个停车位的场景:public class Demo01 {public static void main(String[] ...原创 2020-02-23 20:50:04 · 164 阅读 · 0 评论 -
CyclicBarrier使用
作用:一个线程组的线程需要等待所有线程完成任务后再继续执行下一次任务构造器:public CyclicBarrier(int parties, Runnable barrierAction)public CyclicBarrier(int parties)parties 是参与线程的个数第二个构造方法有一个 Runnable 参数,这个参数的意思是最后一个到达线程要做的任务模拟集齐五...原创 2020-02-23 20:16:57 · 99 阅读 · 0 评论 -
countDownLatch使用
存在于java.util.cucurrent包下作用:countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后等待的线程就可以恢复工作了。构造器:public CountDownLatch(int count){ } ...原创 2020-02-23 19:09:18 · 118 阅读 · 0 评论 -
自己手写线程池模拟拒绝策略
自己手写一个线程池,模拟使用JDK默认的拒绝策略:执行结果:当请求任务多于8个以后,就会报错获取本机CPU核数:Runtime.getRuntime().availableProcessors()...原创 2020-02-23 17:31:21 · 225 阅读 · 0 评论 -
线程池中的4种拒绝策略
一,什么是线程池的拒绝策略?拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)线程池会按照设定的拒绝策略(四种)拒绝.二:线程池中的4种拒绝策略?AbortPolicy(默认):直接抛出RejectedExecutionException异常,阻止系统正常运行。CallerRunsPolicy:“调用者运行“一种调节机制,该策略既不会抛弃任务,...原创 2020-02-23 13:42:51 · 203 阅读 · 0 评论 -
线程池底层原理
线程池工作流程:当有任务来请求时,1,先判断正在运行的线程数量,如果正在运行的线程数量小于corePoolSize,就马上创建核心线程执行该任务,正在运行的线程数量大于corePoolSize,就将请求任务放在堵塞队列。2,这时堵塞队列满了且正在运行的线程数小于maximumPoolSize,就创建非核心线程执行该任务。堵塞队列满了且正在运行的线程数大于maximumPoolSize,就请求...原创 2020-02-23 13:07:36 · 93 阅读 · 0 评论 -
线程池的7大参数
线程池理解为银行的网点int corePoolSize:常驻核心线程数,创建完线程以后,当有请求任务时,就会安排核心线程去完成任务,即理解为今日银行的办理窗口,当到达corePoolSize数量以后,就会放到缓存队列中。long keepAliveTime:多余空闲线程数的存活时间,当前线程数大于corePoolSize,并且等待时间大于keepAliveTime,多于线程或被销毁直到剩...原创 2020-02-23 12:11:56 · 384 阅读 · 0 评论 -
synchronized与Lock的区别
1,synchronized属于jvm层面的,带有Synchronized语句块的class文件可以看到在同步代码块的起始位置插入了moniterenter指令,在同步代码块结束的位置插入了monitorexit指令。wait和notify只能在同步代码块和同步方法中使用。Lock是java.util.concurrent.locks包下的,属于api层面的。2,是否可以释放锁synchro...原创 2020-02-22 20:40:35 · 133 阅读 · 0 评论 -
细说Callable接口
在说callable之前我们先说一下FutureTask这个类当一个线程需要等待另一个线程把某个任务执行完后它才能继续执行,此时可以使用FutureTask。(下面具体详细展开这句话)从上图我们可以看到FutureTask实现了RunableFuture接口,同时RunableFuture又继承Future,Runable接口构造器:从构造器中我们看出参数是Callable接口那我们考虑...原创 2020-02-22 19:24:06 · 199 阅读 · 0 评论 -
HashMap线程不安全解决方案ConcurrentHashMap
HashMap线程不安全demo:故障现象:会报java.util.ConcurrentModificationException异常解决方案:Map<String,String> map=new ConcurrentHashMap<>();原创 2020-02-22 15:42:59 · 748 阅读 · 1 评论 -
HashSet底层结构及线程不安全解决方案CopyOnWriteArraySet
当我们Set set = new HashSet<>();以后我们会发现HashSet底层是HashMap源码截图:那我们不禁想到Map是以key,value键值对存在的,而set只有一个值,所以我们继续看set.add()源码:所以我们从源码中add()确实调用了put(),我们set.add()时添加到map中的key为,value是一个固定的Object类型的常量。这因为这...原创 2020-02-22 14:20:35 · 309 阅读 · 0 评论 -
ArrayList线程不安全及解决方案CopyOnWriteArrayList
ArrayList在多线程情况下,会报异常,ArrayList线程不安全基础篇:https://blog.csdn.net/weixin_44774355/article/details/104417223下面我们分析具体产生的原因,故障现象:java.util.ConcurrentModificationException导致原因:一个线程在写的时候,另外一个线程来争夺,导致数据不一致...原创 2020-02-22 13:53:34 · 318 阅读 · 0 评论 -
什么线程池,如何使用?
问题一:什么是线程池?线程池就是事先将多个线程对象放到一个容器中,当使用的时候就不用 new 线程而是直接去池中拿线程即可,节省了开辟子线程的时间,提高的代码执行效率。问题二:线程池的优点?1.提高响应速度(减少了创建新线程的时间)2.降低资源消耗(重复利用线程池中线程,不需要每次都创建)3.便于线程管理问题二:有几种常见的线程池?在 JDK 的 java.util.concurr...原创 2020-02-20 14:39:44 · 107 阅读 · 0 评论