`
文章列表
实现一个哈希表,首先我们要知道哈希表可以干什么,包含什么方法,实现哪些功能。 哈希表又叫散列表,是根据关键码值(Key, value)而直接进行访问的数据结构。oracle文档里面提到,用哈希表进行检索和存储,key首先要完成hashcode方法,以确定这个key属于哪个区间,也就是说具有相同hashcode的被放在同一块区间里,hashcode往往是取模得出的结果。 确定了位置,我们还要解决冲突问题,如果表中已经存在当前要存的key,我们应该先删除以前的那个key,先后把新的key加入到表中,这里我们要做两步,判断是否存在相同的key,如果存在就删除以前的key,注意的是这里说的key实际 ...
JDBC链接MySQL数据库 首先我们到官网(mysql.com)下载MySQL数据库,安装完毕后,我们还要去下载MySQL JDBC 驱动,然后我们就可以在一个java工程中使用JDBC链接数据库了。 具体过程: 1,加载驱动。将JDBC驱动的jar文件加入到工程的classpath中。我们通常在工程中创建一个lib文件夹,用来盛放需要的jar文件,然后添加JARs到classpath中(右键选择properties,然后选择java build path,选择libraries 添加相应的JARs)在老版本的MySQL还要使用Class.forName("com.mysql.jd ...
写程序难免会出错,不管你有多细心,当我们运行程序的时候,总是会报错,有编译时的错误也有运行时的错误,尽管有很多工具可以帮我们debug,我认为我们不能依赖debug工具,我们要在写程序的时候就尽量的避免错误。在这里主要说一下编译错误,也就是因为粗心而写错。避免逻辑上的错误就得靠提高自身编程水平了。 在面试的时候,我们往往都是在白板上写代码,如果平时我们依赖编译器帮我们找错误,那我们在面试中就会很吃亏,如何尽量减少编译错误呢,下面的几点完全是我自己的体会。 写完一段程序,在运行之前,应该注意的问题: 1,先检查标点符号是否都正确,有没有遗漏标点 2,快速检查拼写,比如length写成length ...
DFS(深度优先遍历) 图的深度优先搜索和树的深度优先搜索思想很相似,都是从一个顶点v出发尽可能像纵深方向搜索,访问了顶点v,下一个访问与v相邻的顶点v1,然后以v1作为初始节点,依次访问后面的节点。对于深度优先搜索的实现,我们采用堆栈来实现。 递归实现DFS的伪代码: void dfs(vertex v) { if(v == null) return; v.visited = true; foreach(vertex v.adjancent){ if(v.adjancent.visted == false) dfs(v.adjancent); } } ...
单例模式(Singleton pattern) 一个singleton 类是指这个类只能有一个实例,当系统只要求一个类的唯一实例时,我们就采用单例模式。要实现一个singleton类,我们首先要设置一个全局的点,以便其它类可以得到这个实例,其次很重要 ...
Semaphore(信号量),是用来控制同时访问特定资源的线程数量,它通过计数来协调各个线程,以保证合理的使用公共资源。我的理解是:信号量控制着一个线程池中并发线程的数量。就好像我们去一家饭店吃饭,这家饭店最多可以同时供应50人,如果饭店中已经坐满50人,这时新来的客人就必须等待,直到有客人离开他们才可以进入,并且总的数量不可以超过50人。这里饭店就好比线程池,饭店里的服务人员和厨师就好比共享的资源,每个客人都相当于一个线程, semaphore就记录着里面的人数,要根据semaphore的数量来决定是否让新的客人进入。为了得到一个资源,每个线程都要先获取permit,以确保当前可以访问。 S ...
在java中,每一个线程都是由Thread类对象创建和控制的。通常我们有两种方式来创建一个线程,一种是继承java.lang.Thread 类,第二种是创建类的时候实现Runnable接口。下面分别介绍两种方式。 1,继承Thread类 首先创建Thread子类的一个实例,然后重写run方法,然后子类的实例必须调用start()方法之后run方法才被执行. 代码如下: public class MultiThread extends Thread { public void run() { System.out.println(getName()+"线程开始运行&quo ...
去官网mysql.com下载相应地程序包,下载完成后,打开mysql.dmg文件,按照他的默认设置进行安装,值得我们注意的是,5.7以后安装的mysql不再使用旧版的默认密码:root,安装的过程中将出现一个弹窗提示,那里是一个临时密码,切记要保存这个密码,以便第一次连接数据库时使用。 打开终端,在终端中输入 sudo /usr/local/mysql/support-files/mysql.server start,这是服务器就开启了。还有一种方式是在系统设置里面,有mysql选项,可以手动开关mysql服务。 开启服务后,我们就开始连接数据库,在/bin目录下 输入./mysql -u ...
二叉树是计算机中一个重要的数据结构,在这里主要谈一下二叉树的深度优先搜索(DFS)和广度优先搜索(BFS)。 所谓DFS,就是沿着树的深度一直往下,一直到达一个叶子节点,然后再返回遍历剩余的节点。根据树的性质,树结构不存在环,因此遍历的时候不需要标记。如果在遍历一个图的时候,因为图中有环的存在,因此需要标记访问过的节点,以防止程序进入死循环。言归正传,树的DFS有三种方式,分别为:前序遍历,中序遍历,和后序遍历。根据这个性质,我们很容易想到用堆栈完成DFS。遍历的时候我们将元素压栈,利用堆栈后进先出的性质来实现不同的遍历。 所谓前序遍历,就是每次都先访问根节点,然后依次为左子树,和右子树。根 ...
在java中,参数的传递方式只有一种:值传递。但是这个“值”的的含义我们不能单从字面理解。确切的说它分为两种:一个是基本类型的值传递,一个是对象的值传递。 对于基本类型来讲,值传递很容易理解,就是把实参的的 ...
常见的排序算法有冒泡排序,简单选择排序,直接插入排序,快速排序,归并排序,堆排序,桶排序等,这篇文章中我们主要分析前五种排序,包括它们的实现,稳定性分析,时间复杂度分析以及空间复杂度分析。 以下都假设给定一个长度为n的数组 1,冒泡排序 在冒泡排序中, 我们从数组的开始进行比较,如果第一个元素大于第二个元素,我们就将两个元素互换,接下来我们比较第二个元素和第三个元素,如果第二个元素大于第三个元素我们就把它们交换,以此类推,每次循环都得到一个最大的数。代码如下: public void bubblesort(int[] array){ for(int i=0;i<array.len ...
本文主要讲栈和队列的实现方法,所以仅简单介绍栈和队列的概念,如果有疑问可以去查有关栈和队列的详细资料。 栈 Stack(LIFO线性表): 栈是一种特殊的线性表,满足后进先出,它限定仅可以在表尾进行删除和增加。push(), pop(), peek(),empty()是它的三个重要的方法。push()是往栈里压入一个元素;pop()是弹出栈顶元素,栈顶指针指向下一个元素;peek()是返回栈顶元素,但不删除栈顶元素;empty是判断栈是否为空。 队列 Queue(FIFO线性表): 队列也是一种特殊的线性表,与栈的规则相反,它满足先进先出原则,它限定只能在表尾添加元素,在表头删除元素。它的基 ...
学习过java的都知道,在java中,不是直观的表示负数,而是采用补码的形式表示负数。这是为了硬件操作的方便,把减法也转换成加法来运算。 那补码是怎样表示的呢?为了得到补码,我们引入了反码。对于正数来讲,它的反码补码都为本身,如果不明白为什么,我们可以这样理解:引入反码补码的原因就是为了解决减法的问题,换句话数就是解决java中负数的问题,正数不存在这些问题,所以它的反码补码就是它本身。在有符号的基本数据类型中,最高位0表示正数,最高位1表示负数。 对于负数来讲,它的反码就是除去符号位取反,然后加1就得到了它的补码。 这里举个简单的例子,一个byte型数据,它在计算机中占8位,-7可以表示为 ...
谈到位运算,有些人可能感觉位运算很容易出错,但是位运算可以解决很多问题,所以我们有必要掌握位运算的知识,并能用位运算解决问题。 首先我们熟悉一下位运算的基本操作符(java): ^ (xor) 代表异或,~(not)代表 ...
近期重新复习了一下动态规划(DP),整理了一些经典的动态规划问题,接下来我就给大家介绍一下,其中包括最大连续子序列的和,最长递增子序列,最长公共子序列,最长公共子串。(如果不清楚DP的概念可以查阅网上的资料,我 ...
Global site tag (gtag.js) - Google Analytics