08 2019 档案
摘要:前言:最近看了一些Java虚拟机方面的知识,在此做一下整理工作。 一、简单聊聊jvm 1.1我们先来看一个简单的Java程序 现在我有一个JavaBean 一个测试类: 我们初学Java的时候都学过Javac命令,就是将一个.java文件编译成.class文件 然后用Java命令执行.class文件
阅读全文
摘要:题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 例如,以下二叉树层次遍历的结果为:1,2,3,4,5,6,7 解题思路就是使用一个队列,第一次入队根节点,之后一直循环直到队列为空,每次弹出队列第一个元素并添加第一个元素的左右节点。
阅读全文
摘要:题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数 字均不相等。 例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该 压栈序列的弹出序列。 解题思
阅读全文
摘要:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)) 可以建立两个栈一个栈是数据结构,一个栈存最小值 这个方法有个缺点就是当前不是最小值的时候没存,于是每次pop的时候都必须比较一下再pop。 可以改进一下。stackmin每次存的都是当前最小值,每次
阅读全文
摘要:题目描述 下图的矩阵顺时针打印结果为:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10 解题思路 r1,c1相当于左上角点的横纵坐标,r2,c2相当于右下角点的横纵坐标 注意两个特殊情况
阅读全文
摘要:题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的 方法一:和镜像树比较是否相同,注意要先拷贝树。 方法二: 可以直接递归比较左右子树是否一样
阅读全文
摘要:题目描述 解题思路,就是普通递归,但后来发现还有简单方法,做的复杂了 递归二: 第二个方法的思想更一目了然一点
阅读全文
摘要:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 利用递归思想
阅读全文
摘要:题目描述 方法一:按部就班算 方法二:递归
阅读全文
摘要:输入一个链表,反转链表后,输出新链表的表头。 方法一、直接反转 方法二:使用头插法 方法三: 递归
阅读全文
摘要:一个链表中包含环,请找出该链表的环的入口结点。 如果可以使用额外空间就存入set中然后检查。 方法一: 方法二: 使用双指针,一个指针 fast 每次移动两个节点,一个指针 slow 每次移动一个节点。因为存在环,所以两个指针必定 相遇在环中的某个节点上。假设相遇点在下图的 z1 位置,此时 fas
阅读全文
摘要:题目描述 输入一个链表,输出该链表中倒数第k个结点。 方法一就是暴力法,遍历出最后第k个结点 方法二 设链表的长度为 N。设置两个指针 P1 和 P2,先让 P1 移动 K 个节点,则还有 N - K 个节点可以移动。此时让 P1 和 P2 同时移动,可以知道当 P1 移动到链表结尾时,P2 移动到
阅读全文
摘要:题目描述 需要保证奇数和奇数,偶数和偶数之间的相对位置不变 解题思路 方法一:超级暴力,创建一个新数组,遍历原数组,如果是偶数写进去,遍历第二次原数组如果是奇数写进去,最后第三次遍历赋值原数组,时间复杂度应该是3n,空间复杂度是n 方法二 创建原数组的copy数组,先遍历一遍数组奇数个数,然后两次赋
阅读全文
摘要:题目描述 解题思路 使用正则表达式进行匹配。 还有正常解法 12e说明e的后面必须有数字,不能有两个e +-5说明符号位要么出现一次在首位,要么出现一次在e的后一位,其他地方都不能有 12e4.3说明e的后面不能有小数,1.2.3说明不能有两个小数点 1a3.14说明不能有其他的非法字符,比如这里的
阅读全文
摘要:请实现一个函数用来匹配包括 '.' 和 '*' 的正则表达式。模式中的字符 '.' 表示任意一个字符,而 '*' 表示它前面的字符 可以出现任意次(包含 0 次)。 当模式中的第二个字符不是“*”时: 1、如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串和模式都后移一个字符,然后匹配剩余的
阅读全文
摘要:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 首先想到的是先查出哪些元素的值是重复的丢到set里面,然后遍历删除。 另外可以递归删除
阅读全文
摘要:由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点,通过遍历链表找到该节点的上一节点和下一节点的方法是行不通了。所以实现的思路是,根据给定的要删除的节点,可以直接找到其后年的节点,把后面的节点的内容复制到当前节点处,同时将当前节点指
阅读全文
摘要:题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即 999。 首先最容易想到的方法是 但这样遇到n是特别大的时候会溢出 于是也可以用大数类改造一下 另外,可以用 char 数组进行存储。 使用回溯法得到所有的数。 一个位
阅读全文
摘要:题目描述 给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent,求 base 的 exponent 次方。 方法一:直接调包 方法二:普通循环乘法 方法三: 注意公式中是整除 所以可以利用递归了 因为 (x*x)n/2 可以通过递归求解,并且每次递归 n 都减小一
阅读全文
摘要:虚拟存储器作为现代操作系统的存储管理的一项重要技术,实现了内存扩充功能。 但该功能并不是从物理上实际的扩大内存的容量,而是逻辑上实现内存容量的扩充,让用户感觉到的内存容量比实际内存容量大的多 有的作业很大内存不够就无法运行,或有大量作业,这样只能在外存等待。 根本原因是内存不够大,最简单的方法就是加
阅读全文
摘要:题目描述:输入一个整数,输出二进制中表示的1的个数 如果用Integer.toBinaryString就很容易暴力解决 如果使用bitCount那就更暴力了 有一个位运算的技巧 n&(n-1) 这个位运算可以消除掉n 的位级表示中最低的那一位。 运算之后第三位的1没了 时间复杂度:O(M),其中 M
阅读全文
摘要:题目描述: 把一根绳子剪成多段,并且使得每段的长度乘积最大 解法一:贪心法 尽可能多剪长度为3的绳子,并且不允许有长度为 1 的绳子出现。如果出现了,就从已经切好长度为3的绳子中拿 出一段与长度为1的绳子重新组合,把它们切成两段长度为2的绳子。 思想: 我们首先考虑分成哪些数时乘积才会尽可能的大。
阅读全文
摘要:题目描述 地上有一个m行和n列的方格。一个机器人从坐标(0,0)的格子开始移动,每一次只能向左右上下四个方向移动一格,但是不能进入行坐标和列坐标的位数之和大于k的格子。 例如当k为18时,机器人能够进入放格(35,37),因为3+5+3+7=18,但是不能进入方格(35,38),因为3+5+3+8=
阅读全文
摘要:判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以 在矩阵中向上下左右移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如下面的矩阵包含了一条 bfce 路径 解题思路 使用回溯法(backtracking)进行求解
阅读全文
摘要:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 首先暴力法,没有丝毫意
阅读全文
摘要:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 喜闻乐见的递归算法是。 n=1,是1,n=2,结果是2。 然后可以用递归公式 当n = n 时,第一次跳出一阶后,后面还有f(n-1)中跳法; 第一次跳出二阶后,后面还有f(n-2)中跳法
阅读全文
摘要:题目描述 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法 解题思路: 当n=1时只有一种跳法 当n=2时,有两种跳法 跳 n 阶台阶,可以先跳 1 阶台阶,再跳 n-1 阶台阶;或者先跳 2 阶台阶,再跳 n-2 阶台阶。而 n-1 和 n-2
阅读全文
摘要:我们可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩 形,总共有多少种方法? 解题思路,当n为1时,只有一种覆盖方法,当n为2时有两种覆盖方法 要覆盖 2*n 的大矩形,可以先覆盖 2*1 的矩形,再覆盖 2*(n-1) 的矩形;
阅读全文
摘要:题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 解题思路 stack1 栈用来处理入栈(push)操作,stack2 栈用来处理出栈(pop)操作。一个元素进入 stack1 栈之后,出栈的顺序被反 转。当元素要出栈时,需要先进入 stack2 栈,此
阅读全文
摘要:题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 解题思路 ① 如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点; ② 否则,向上找第一个左链接指向的树包含该节点的祖先节点。 1 /*
阅读全文
摘要:根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的 数字。 前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右 部分为树的右子树中序遍历的结果。
阅读全文
摘要:题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 这就是喜闻乐见的暴力法,先一个个输入到ArrayList里面然后再翻转一下即可。 再看看别的方法 第一个思路是使用递归,要逆序打印链表1->2->3 (3,2,1),可以先逆序打印链表2->3(3,2),最后再打印第一个节点。而
阅读全文
摘要:将一个字符串中的空格替换成 "%20" Input: "A B" Output: "A%20B" 一看到题目就想到了无耻的偷懒方法 可以通过测试 然后紧接着就是暴力 最后,试试别的方法。 解题思路,在此字符串尾部填充任意字符,使得字符串长度等于替换之后的长度。 因为一个空格要替换成三个字符(%20)
阅读全文
摘要:给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数 组中。 Consider the following matrix: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10,
阅读全文
摘要:从今天开始刷算法题,先刷完剑指offer再说吧 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重 复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 第一眼看到题,就只想到了暴力循环的方法。 然后我就去搜索了别
阅读全文
摘要:3.1 tcp和udp协议的区别 UDP在传送数据之前不需要先建立连接,远地主机在收到UDP报文之后不需要给出任何确认。虽然UDP不提供可靠交付,但某些情况下UDP确实是一种最有效的工作方式(一般用于即时通信):如qq语言,qq视频,直播等等。 TCP提供面向连接的服务。在传送数据之前必须先建立连接
阅读全文
摘要:一、概述 对于Java程序员来说,在虚拟机自动内存管理机制下,不需要像C/C++程序开发程序员一样为每个new操作去写对应的delete和free操作,不容易出现内存泄漏和内存溢出的问题。正是因为Java程序员把内存控制权力交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问题。如果不了解虚拟机是怎
阅读全文
摘要:一、Java基础知识 Java基础知识_注解 Java基础知识_反射 Java基础知识_泛型 Java基础知识_重载与重写的区别 Java基础知识_String、StringBuffer和StringBuilder Java基础知识_自动装箱和拆箱 Java基础知识_equals和== Java基础
阅读全文
摘要:AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面。 AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其
阅读全文
摘要:一、介绍一下Atomic 原子类 Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 所以,所谓原子类说简单点就是具
阅读全文
摘要:为什么要用线程池? 线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务 的数量。 好处: 1、降低资源消耗。 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度。 当任务到达时,任务可以不需要的等到线程创建就能立即执行。 3、
阅读全文
摘要:一、讲一下Java内存模型 在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而在当前 的 Java 内存模型下,线程可以把变量保存本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就 可能造成一个线程在主存中修改了一个变量的值,而
阅读全文
摘要:1、说一下对于synchronized关键字的了解 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块,在任意时刻只能有一个线程执行。 另外,在Java的早期版本中,synchronized属于重量级锁,效率低下,因为监
阅读全文
摘要:JDK1.7(上面有示意图) 首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的 数据也能被其他线程访问。 ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。 Segment 实现了 Reent
阅读全文
摘要:ConcurrentHashMap和Hashtable的区别主要体现在实现线程安全的方式上的不同。 1、底层数据结构:jdk1.7的ConcurrentHashMap底层采用分段的数组+链表实现,jdk1.8采用的数据结构是跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable
阅读全文
摘要:Hash Set底层就是基于Hash Map实现的,基本上都是直接调用HashMap中的方法。 Hashset使用成员对象来计算hashcode, 对于两个对象来说hashcode可能相同, 所以equals方法用来判断两个对象的相等性, 如果两个对象不同的话,那么返回false
阅读全文
摘要:在多线程下,进行put操作会导致HashMap死循环,原因在于Hash Map的扩容resize()方法。由于扩容是新建一个数组,复制原数据到数组。由于数组下标挂有链表,但是多线程操作可能导致环形链表。 复制过程如下: 以下模拟2个线程同时扩容,假设当前的空间为2(临界值为1),hashcode分别
阅读全文
摘要:为了能让HashMap存取高效,尽量减少碰撞,也就是要尽量把数据分配均匀,Hash值的范围是-2147483648到2147483647,前后加起来有40亿的映射空间,只要哈希函数映射的比较均匀松散,一般应用是很难出现碰撞的,但一个问题是40亿的数组内存是放不下的。所以这个散列值是不能直接拿来用的。
阅读全文
摘要:1、线程是否安全:Hash Map是非线程安全的,Hash Table是线程安全的,Hash Table的内部方法基本上都经过了synchronized修饰,如果你要保证线程安全的话就使用ConcurrentHashMap吧。 2、效率:因为线程安全问题,HashMap要比HashTable效率高一
阅读全文
摘要:Hash Map底层是数组和链表结合在一起使用,也就是链表散列。 Hash Map采用Entry数组来存储key-value对,每个键值对组成了一个Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体,可以解决Hash冲突的问题。 Hash Map通过key的ha
阅读全文
摘要:Vector类的所有方法都是同步的。可以由两个线程安全的访问一个Vector对象,但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。 ArrayList不是同步的,所以在不需要保证线程安全时,建议用ArrayList
阅读全文
摘要:1、是否保证线程安全:ArrayList和linkedlist都是不同步的,也就是不保证线程安全 2、底层数据结构:ArrayList底层使用的是Object数组,LinkedList底层使用的是双向链表数据结构 3、插入和删除是否受元素位置影响: Arraylist采用数组存储,所以插入和删除元素
阅读全文
摘要:1、接口的方法默认是public,所有方法在接口中不能有实现(Java8开始接口方法可以有默认实现),抽象类可以有非抽象的方法 2、接口中的实例变量默认是final类型的,而抽象类中不一定 3、一个类可以实现多个接口,但最多只能实现一个抽象类 4、一个类实现接口的话要实现接口的所有方法,而抽象类不一
阅读全文
摘要:方法一:通过Scanner 方法二:通过BufferedReader
阅读全文
摘要:Java异常层次结构图 在Java中,所有的异常都有一个共同的祖先就是java.lang包下的Throwable类。 Throwable有两个重要的子类:Exception异常和Error错误,二者都是Java异常处理的重要子类,且各自都包含大量子类。 Error(错误):是程序无法处理的错误,表示
阅读全文
摘要:Object类是一个特殊的类,是所有类的父类。它主要提供了以下11个方法: hashCode() hashCode返回散列值,而equals是用来判断两个对象是否等价,等价的两个对象散列值一定相同,但是散列值相同的两个对象不一定等价 在覆盖equals方法的时候应该总是覆盖hashCode方法,保证
阅读全文
摘要:final关键字主要用在三个地方:变量、方法和类 1、对于一个final变量,如果是基本数据类型,则其数值一旦初始化后便不能修改,如果是引用类型的变量,则在对其初始化后不能再让其指向另一个对象。但是引用对象本身是可以修改的。 2、当用final修饰一个类时,表面这个类不能被继承了。final 类中的
阅读全文
摘要:==:它的作用是判断两个对象的地址是否相等,即判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址) equals():它的作用也是判断两个对象是否相等。它一般有两种情况: 情况一:类没有覆盖equals方法,则通过equals比较类的两个对象时,等价于通过“
阅读全文
摘要:装箱就是将基本类型和他们对应的引用类型包装起来 拆箱就是将包装类型转换成基本的数据类型 缓存池 new Integer(123)与Integer.valueOf(123)的区别在于: 1、new Integer(123)每次都会创建一个新的对象 2、Integer.valueOf(123)会使用缓存
阅读全文
摘要:可变性: 简单来说:String类中使用final关键字字符数组保存字符串, 所以String的对象是不可变的,而StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串 cha
阅读全文
摘要:一、重载 重载是overload,存在于同一个类中,指的是一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。方法返回值和访问修饰符可以不同。发生在编译时,另外值得注意的是,返回值不同,其他都相同不算是重载。 二、重写 重写是override,存在于继承体系中,发生在父子类中
阅读全文

浙公网安备 33010602011771号