JavaSE面试题
面试题总结
吴某人还需努力
这个作者很懒,什么都没留下…
展开
-
Leetcode算法题 两数之和
题目给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。暴力解法public static int [] twoSum(int [] nums, int target) { for (int i = 0; i< nums.length; i++) { for (int原创 2022-02-13 06:08:32 · 126 阅读 · 0 评论 -
Linux服务器性能监控常用命令汇总
top命令查看系统负载情况,重点在监控每个进程。当load average三个值加起来 / 3 / 100% > 60%,表示系统负载较高vmstat相比top命令,vmstat命令可以监控整个系统cpu和内存使用情况。一般通过两个数字参数来完成,第一个代表采样时间间隔单位为秒,第二个代表采样次数procs:r:运行和等待CPU时间片的进程数,原则上1核CPU的运行队列不大于2,整个系统运行队列不超过核心数2倍,否则被视为系统压力过大b:等待系统分配资源的进程数(磁盘I/O,网络原创 2022-02-13 04:53:13 · 1007 阅读 · 0 评论 -
Java垃圾回收
垃圾回收算法引用计数法:无法解决循环引用,java不采用复制算法:年轻代算法标记清除:标记整理:垃圾回收方式Serial:串行。为单线程环境设计且只使用一个线程进行垃圾回收,会暂停用户线程,不适合服务器环境Parallel:并行。多个垃圾收集线程进行垃圾回收,用户线程短暂暂停,适用于科学计算/大数据平台等弱交互场景CMS:并发。用户线程和垃圾回收线程同时执行(不一定是并行,可能是交替执行),不用暂停用户线程,适用于对响应时间有要求的场景,互联网公司多采用此方式,缺点是老年代垃圾回收采用原创 2022-02-12 19:16:37 · 278 阅读 · 0 评论 -
Java 产生内存溢出的几种情况
StackOverFlowError解释:线程栈内存溢出,原因:方法递归调用OutOfMemoryError:Java heap memory解释:堆内存溢出原因:大量对象创建撑爆堆区OutOfMemoryError:GC overhead limit exceeded解释:频繁GC且GC无效果原因:大量对象创建且无法回收,GC时间占用超过98%并且回收了不到2%的内存OutOfMemoryError:Direct buffer memory解释:直接内存溢出原因:写NIO程序时经常会原创 2022-02-12 03:19:26 · 956 阅读 · 0 评论 -
Java 生产中为什么不推荐使用Executors而推荐使用ThreadPoolExecutor?
问题引出阿里巴巴开发手册并发篇中,有这么一段话,严格规范线程池创建方式只能使用ThreadPoolExecutor。那么这是为什么呢?原因分析如图所示,FixedThreadPool和SingleThreadExecutor创建都是使用LinkedBlockingQueue,LinkedBlockingQueue最大长度为Integer.MAX_VALUE,队列中可能堆积大量的请求而导致OOM。CachedThreadPool和ScheduledThreadPool默认允许最大线程数也是Integ原创 2022-02-11 04:05:33 · 499 阅读 · 0 评论 -
Java Synchronized和Lock的区别
构成方面:Synchronized是Java关键字属于JVM层面,Lock是Java类属于API层面使用方法:Synchronized不需要手动释放锁,同步代码执行完毕自动释放锁。Lock需要手动释放锁,可能导致死锁等待是否可中断:Synchronized等待锁的过程不可中断,Lock可中断(tryLock或LockInterruptibly)锁公平性:Synchronized是非公平锁,Lock默认非公平也可设置公平锁唤醒机制:Synchronized无法做到精确唤醒,要么随机唤醒一个要么唤醒全.原创 2022-02-11 02:57:51 · 512 阅读 · 0 评论 -
Java集合线程不安全问题总结
Java集合线程不安全之并发修改异常上代码public class Demo { public static void main(String[] args) { List<String> myList = new ArrayList<>(); // 启动30个线程同时对list进行操作 for (int i = 0; i < 30; i++) { new Thread(() -> {原创 2022-02-10 17:30:53 · 2385 阅读 · 0 评论 -
Java volatile关键字详解
volatile是什么volatile关键字是Java虚拟机提供的轻量级同步机制JMM是什么JMM是一个抽象概念,定义了共享内存系统中多线程程序读写操作共享内存的行为规范,保证共享内存的正确性(可见性、有序性、原子性)。JMM中关于同步的规定:线程解锁前必须把共享变量最新的值刷新回主存中线程加锁前必须从主存中读取共享变量最新的值到自己的工作内存加锁和解锁必须是同一把volatile关键字作用保证内存可见性禁止指令重排,保证有序性volatile内存可见性代码演示不加volati原创 2022-02-09 06:16:00 · 244 阅读 · 0 评论 -
[面试]算法题走楼梯
题目假设楼梯有n层高,每次只能走一步或者两步,求有多少种走法思路一:计算过程就是方法,层数作为参数,声明方法f(x)。根据情况分析一层:1种方法 f(1) = 1二层:2种方法f(2) = 2三层:先到达f(1),然后从f(1)跨两步,或者先到达f(2),从f(2)跨一步,f(3) = f(1) + f(2)四层:先到达f(2),然后从f(2)跨两步,或者先到达f(3),从f(3)跨一步,f(4) = f(2) + f(3)n层:先到达f(n-2),然后从f(n-2)跨两步,或者先到达f(n原创 2022-02-09 02:41:29 · 819 阅读 · 0 评论 -
探究Java方法参数传递机制
概念准备值传递和引用传递值传递:对所传递的参数进行一个副本拷贝,方法中所有操作只是对副本进行操作,方法结束后副本被丢弃(即实参不变),Java中只有值传递,即便传引用类型也是传递引用的副本引用传递:传参时不拷贝副本,直接将参数本身传递到方法内部,方法内对参数所有操作都会直接反映到原参数上形参和实参形参:方法中声明的参数实参:方法调用时实际传入的参数示例代码public class Demo3 { public static void main(String[] args) {原创 2022-02-08 23:02:13 · 106 阅读 · 0 评论 -
Java类加载和初始化顺序
探究Java类加载和初始化执行顺序父类public class Father { // 普通类变量 private int i = test1(); // 静态类变量 private static int j = test2(); // 普通代码块 { System.out.println("父类普通代码块执行"); } // 静态代码块 static { System.out.println原创 2022-02-08 20:54:34 · 286 阅读 · 0 评论