JVM是如何实现多态的

Java中的多态多态是面向对象的三大核心概念之一。多态简单来讲就是父类引用指向子类对象。 在Java中要实现多态需要满足三个必要条件:继承、重写、父类引用指向子类对象。 Parent p=new Child(); 多态的引入带来了这写好处: 消除类型之间的耦合关系 可替换性 可扩充性 接口性 灵活性 简化性

再读线程池源码

概述线程池故名思意就是存放线程的池子。线程是JVM的稀缺资源,使用线程池可以减少线程的创建和销毁的次数,降低系统的资源消耗。当有任务到达的时候,无效等待创建新的线程便能立即执行,提高了响应速度。使用线程池还可以方便对线程进行管理。 ThreadPoolExecuter是线程池框架的一个核心类,下面就对ThreadPoolExecuter进行分析。

JVM之分代收集算法

对象分类JVM将对象分成不同的分代,然后根据每个分代的特点采取不同的垃圾回收算法。 新生代:朝生夕灭的对象,比如方法的局部变量。 老年代:存活的比较久,但是还是要死的对象。比如缓存对象,单例对象等。 永久代:对象生成后几乎不灭的对象,例如加载过的类对象。 永久代是在方法区/元空间。新生代和老年代是在堆区。

并发编程之volatile

volatile的定义和实现原理在Java语言规范中将volatile定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该通过排他锁单独获得这个变量。Java语言提供了volatile,在某型情况下比使用锁更加方便。如果一个字段被声明为volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。

多线程之连续打印ABC

题目实例化三个线程,一个线程打印a,一个线程打印b,一个线程打印c,三个线程同时执行,要求打印出10个连着的abc。 问题为三线程间的同步唤醒操作,主要的目的就是使程序按ThreadA->ThreadB->ThreadC->ThreadA循环执行三个线程

算法之DFS

DFS深度优先搜索是在得到一个新节点时立即堆新节点进行遍历。DFS常用来求解这种可达性问题。 在实现DFS时需要考虑以下两个问题: 栈,使用栈来保存当前节点信息,当遍历新节点返回时能够继续遍历当前节点。可以使用递归栈。 标记:需要记录那些节点已经遍历过了。 695. 岛屿的最大面积给定一个包含了一些 0 和 1 的非空二维数组 grid 。 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。) 示例 1: 12345678[[0,0,1,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,1,1,0,1,0,0,0,0,0,0,0,0], [0,1,0,0,1,1,0,0,1,0,1,0,0], [0,1,0,0,1,1,0,0,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,0,0,0,0]] 对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。 解法123456789101112131415161718192021222324252627282930private int[][] direction={{0,1},{0,-1},{1,0},{-1,0}}; int m,n; public int maxAreaOfIsland(int[][] grid) { if(grid.length==0||grid[0].length==0){ return 0; } m=grid.length; n=grid[0].length; int maxArea=0; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ maxArea=Math.max(maxArea,dfs(grid,i,j)); } } return maxArea; } private int dfs(int[][] grid,int r,int c){ if(r<0||r>m||c<0||c>n||grid[r][c]==0){ return 0; } int area=1; //(r,c)为陆地 grid[r][c]=0;//标记为已经遍历 for (int[] d : direction) { area+=dfs(grid, r+d[0], c+d[1]); } return area; } leetcode原题地址

算法之栈和队列

栈和队列232.用栈实现队列使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。 示例: 1234567MyQueue queue = new MyQueue();queue.push(1);queue.push(2); queue.peek(); // 返回 1queue.pop(); // 返回 1queue.empty(); // 返回 false leetcode原题地址

算法之链表

链表160. 相交链表编写一个程序,找到两个单链表相交的起始节点。 leetcode原题地址 解法设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部开始访问链表 B;同样地,当访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点 . 123456789101112public ListNode getIntersectionNode(ListNode headA, ListNode headB) { //这道题的意思是必定有相交的 ListNode curA=headA; ListNode curB=headB; while (curA!=curB){ curA=(curA==null)?headB:curA.next; curB=(curB==null)?headA:curB.next; } return curA;}

算法之动态规划

动态规划动态规划和递归都是见原问题拆成多个子问题然后求解,它们之间最本质的区别是,动态规划保存了子问题的解,避免重复计算。 70. 爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 123456输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶 示例 2: 1234567输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶 leetcode原题地址

算法之排序

排序215.数组中的第k个最大元素在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 12输入: [3,2,1,5,6,4] 和 k = 2输出: 5 示例 2: 12输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 leetcode原题地址

123