
学习记录
长弓Smile
这个作者很懒,什么都没留下…
展开
-
Java中的i=i++问题
设置i的初始值为0,i=i++,然后输出i的值。在C++中,输出1,在Java中,输出0。查看了Java编译后生成的class文件,找到了原因:源代码add.java:public class Add { public static void main(String args[]){ int i =0; i = i++; System.out.p...原创 2019-03-29 10:58:52 · 729 阅读 · 2 评论 -
阻塞队列与生产者-消费者模式
参考书籍:《Java并发编程实战》 Brian Goetz 阻塞队列 阻塞队列提供了可阻塞的put和get方法,以及支持定时的offer和poll方法。如果队列已经满了,则put方法将阻塞直到有空间可用;如果队列为空,则take方法将阻塞直到有元素可用,队列可以是有界的也可以是无界的,无界队列永远不会充满,因此无界队列上的put方法永远不会阻塞。阻塞队列支持生产者消费者模式。有数据生成时,...原创 2018-08-24 15:49:42 · 825 阅读 · 0 评论 -
关于对象锁和类锁
相关说明:类锁控制类的所有实例的访问对象锁锁住的是当前实例,对同一类的不同实例就没有限制实验环节: 对象锁class Object_Lock{ //代码块上 -- 锁住调用该方法的对象 public void funA(){ synchronized (Object_Lock.this){ for(int i = 1 ;i...原创 2018-08-24 15:16:35 · 159 阅读 · 0 评论 -
notify和notifyall
原文见知乎: 作者:知乎用户 链接:https://www.zhihu.com/question/37601861/answer/145545371 来源:知乎锁池和等待池: 锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必...转载 2018-08-23 11:27:52 · 164 阅读 · 0 评论 -
5个线程依次打印1A2B3C4D5E1F2G...
问题要求: 1.使用5个线程 2.五个线程依次打印1A2B…,即第一个线程负责打印1(A、F)等等。解决思路: 1.轮询count ,当count满足当前线程的打印条件后,打印 2.采用wait和notifyAll进行通信相关方法: 1.wait()方法的作用是将当前运行的线程挂起(即让其进入阻塞状态),直到notify或notifyAll方法来唤醒线程. 2.notify和n...原创 2018-08-23 11:08:38 · 2860 阅读 · 1 评论 -
一个死锁发生的例子--Lock
接上一篇博客,使用Lock实现死锁import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class DeadlockLock { private static Lock lock1 = new ReentrantLock(); priv...原创 2018-08-23 09:24:07 · 599 阅读 · 0 评论 -
一个死锁发生的例子--synchronized
死锁发生的必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。根据以上条件,可以写一个死锁发生的例子:public class DeadlockSyn...原创 2018-08-23 09:08:19 · 1256 阅读 · 0 评论 -
关于ThreadLocal
1.ThreadLocal 的父类为Object2.用于保存某个线程共享变量 Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the {@code ThreadLocal} instance is ac...原创 2018-08-07 16:19:54 · 168 阅读 · 0 评论 -
MySQL中的锁
在MySQL中,按照锁的粒度划分,可以分为行级锁,表级锁和页级锁。行级锁引擎:Innodb - 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。 - 行级锁能大大减少数据库操作的冲突。 - 其加锁粒度最小,但加锁的开销也最大。 - 行级锁分为共享锁 和 排他锁。特点开销大,加锁慢;会出现死锁; 锁定粒度最小,发生锁冲突的概率最...原创 2018-07-30 15:36:09 · 172 阅读 · 0 评论 -
MySQL底层索引与相关知识
定义 MySQL官方对于索引的定义为:索引是帮助MySQL高效获取数据的数据结构。即可以理解为:索引是数据结构。 【索引是一个文件】MySQL常见的引擎包括: Memory引擎: 该存储引擎通过在内存中创建临时表来存储数据。每个基于该存储引擎的表实际对应一个磁盘文件,该文件的文件名和表名是相同的,类型为.frm。ISAM: ISAM是一个定义明确且历经时间考验的数据...原创 2018-07-30 01:28:03 · 209 阅读 · 0 评论 -
保留两位小数(Python和Java)
Java保留两位小数:import java.math.BigDecimal;import java.text.DecimalFormat;import java.text.NumberFormat;/** * Created by zfr on 2018/06/25. * Java保留小数的几种方式 */public class RetainTheDecimal { ...原创 2018-06-25 15:39:53 · 1489 阅读 · 0 评论 -
C++中32位和64位的数据长度
以代码为例子:#include <iostream>using namespace std;int main(){ //32位和64位系统在Windows下基本数据类型的大小都是一样的。 //只有指针的大小不一样!32位指针大小为4byte,而64位的指针大小为8byte。 cout << "****************64位***...原创 2018-09-04 10:07:05 · 2405 阅读 · 0 评论 -
线程的run()和start()
1.run() == > 运行状态方法 run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用; 2.start() 启动一个线程 == > 就绪 start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;public class Runtest { public static void...原创 2018-09-05 16:52:44 · 364 阅读 · 0 评论 -
计算机类学术论文 28个常见出版社一般写法(参考文献用)
转载一篇计算机类学术论文出版社的一般写法的博客,感谢作者的分享计算机类学术论文 28个常见出版社一般写法(参考文献用)https://www.cnblogs.com/d0main/p/9462929.html...原创 2019-03-16 23:13:49 · 3418 阅读 · 0 评论 -
python使用Notepad++同时打开多个文件
需求:有两个文件夹,文件夹中的文件名称包含一个数字index,想打开第一个文件夹中的第i个文件的同时也打开文件2中的第i个文件。每次取两个文件夹同时找到两个文件很麻烦。决定用程序来实现。自然就想到了批处理。第一步:生成批处理文件openFile.bat文件内容如下:start "" "【Notepad++程序路径】" "【需要打开的文件路径】"'需要打开n个文件,就生成n行start...原创 2019-01-16 09:44:43 · 3432 阅读 · 0 评论 -
利用编辑距离计算字符串的相似度Python实现
参考资料:原文:编辑距离计算python实现 (作者:koibiki)采用动态规划的思想,跟计算最长公共子串问题类似。编辑距离是针对二个字符串(例如英文字)的差异程度的量化量测,量测方式是看至少需要多少次的处理才能将一个字符串变成另一个字符串。利用编辑距离计算相似度的概率f(x,y):如果y为x的子串,则f(x,y)=1f(x,y)=1f(x,y)=1否则:f(x,y)=1−edit(...原创 2018-12-17 11:10:49 · 2438 阅读 · 0 评论 -
C#打开本地文件
最近项目的需求是,利用模板生成Word文件,然后,自动打开。打开部分的实现代码如下:System.Diagnostics.Process.Start("文件");原创 2018-12-16 15:53:09 · 3237 阅读 · 2 评论 -
pyCharm社区版+django创建Web项目
1.安装djangopip install django2.使用找到django的安装路径,将其添加到环境变量path中。(注意加上分号)3.在想创建项目的目录下,右键进入Powershell(也可以通过cmd进入目录),创建项目django-admin startproject 【项目名】4.在pycharm中创建项目,跟刚才项目名字一样,路径也一样,就会提示项目已存在,是否从已...原创 2018-12-26 21:23:41 · 10375 阅读 · 1 评论 -
背包问题
参考博客: https://www.cnblogs.com/fengziwei/p/7750849.html 思路都是,先放第一个物品,容量从1到max 的最大收益1.0-1背包问题 0-1背包问题是指每一种物品都只有一件,可以选择放或者不放。现在假设有n件物品,背包承重为m。import java.util.Scanner;/** * Created by zfr on...原创 2018-09-07 14:59:00 · 210 阅读 · 0 评论 -
Dijkstra 最短路径
思路: 两个集合: 1.visted 存储已经访问过的结点 2.unVisted 存储未遍历过的结点 两个数组: 1.dist[] 存储1到每个结点的最短路径 2.path[] 存储到达该结点的最短路径的上一个结点1.首先将1加入已经访问多过的结点的集合,然后将其他节点加入unVisted 集合。 2.经历n-1次循环,每次循环将unVisted 中的一个结点加入到visted ...原创 2018-09-07 11:22:08 · 206 阅读 · 0 评论 -
IO设备的类型
参考书籍:《计算机操作系统》IO设备的类型:1 按照设备的使用特性分类:1)存储设备也称为外存或者后备存储器、辅助存储器,。是计算机系统用以存储信息的主要设备。该类设备存取速度较内存慢,但容量比内存大得多,相对价格也便宜。2)输入输出设备又具体可分为输入设备、输出设备和交互式式设备。输入设备用来接收外部信息,如键盘、鼠标、扫描仪、视频摄像、各类传感器等。输出设备是用于将计算机加工处理后...原创 2018-09-17 19:45:42 · 11620 阅读 · 0 评论 -
字节流和字符流
参考书籍: 1.《Java编程思想》第四版 2.https://www.jianshu.com/p/69e4bccf9604 3.https://blog.youkuaiyun.com/cynhafa/article/details/6882061流 编程语言的IO类库中常常使用流这个概念,它代表任何有能力产生数据的数据源对象或者是有能力接收数据的接收端对象。“流”屏蔽了实际IO设备中处理...原创 2018-09-07 09:55:17 · 192 阅读 · 0 评论 -
两个线程交替打印数字1-52和字母‘a’-'z'使其打印12a34b56c78d910e...
问题描述: 使用两个线程交替打印数字1-52和字母‘a’-‘z’,每次打印两个数字 一个字母 12a34b56c78d910e…解题思路: 1.两个线程之间采用wait和notify进行通信 2.设置isNum标志,打印数字时,isNum为true则打印否则等待,打印字母时与之相反。public class PrintTwoNumAndOneChar { public s...原创 2018-09-03 09:53:02 · 2985 阅读 · 0 评论 -
利用HashMap和LinkedList实现LRU
利用HashMap和LinkedList实现最近最久未使用算法 java类库中包含LinkedHashMap用于实现LRU最好不过了,LinkedHashMap底层是就是HashMap和LinkedList,根据需要,LinkedList中可以保存访问的顺序或者插入的顺序,并且可以移除最老的节点。但是根据实际需要,判断最老的节点方式并不相同,因此,自己实现比较好。 昨天遇到的一个问题是: 实...原创 2018-09-05 17:03:50 · 2701 阅读 · 0 评论 -
Java文本文件切割
之前了解过用Java切割文件,采用的是字节流的方式读取文件,然后发现存在一个问题,就是前面的文件是正常编码的,后面的文件会乱码。于是针对个人需求(2.3G的文本文件无法打开),采用按行读取,即一行一行读取文件然后再存入到新的文本中。 具体代码如下: /** * * @Description 文件分割 * @param src 分割文件路径 * ...原创 2018-05-31 15:26:06 · 1551 阅读 · 0 评论 -
利用信息摘要比较两个文件是否相等
优快云上传文件时,会快速判断文件是否已经存在,很好奇,于是在网上查找比较两个文件相等的方法,了解到可以采用信息摘要算法判断两个文件内容是否相等。也对上次面试题有了新的解法(上次是先比较大小再一个字节一个字节对比的)。 解法如下: 根据MD5值计算两个文件是否相等//参数为两个文件的文件路径public static boolean checkByMD5(String pathA, St...原创 2018-05-26 21:14:27 · 746 阅读 · 0 评论 -
Arrays.sort()底层源码学习(1)
通过查看Arrays.sort()源码发现,从JDK7开始,底层实现在DualPivotQuicksort类,这个类是ladimir Yaroslavskiy,Jon Bentley和Josh Bloch等人实现的Dual-Pivot Quicksort算法。该算法在许多数据集上提供了O(nlogn)的时间复杂度,比传统的one-pivot 快排实现更快。 该类提供了些阈值,如下所示:...原创 2018-03-31 18:11:05 · 646 阅读 · 0 评论 -
类加载时机
以下内容为《深入理解Java虚拟机》的学习笔记: 类的生命周期: 加载-连接(验证-准备-解析)-初始化-使用-卸载 类加载时机: 1. 遇到new、getstatic,putstatic或invokestatic这四条字节码指令时没如果类没有进行过初始化,则需要先触发其初始化。 2. 使用java.lang.reflect包的方法对类进行反射调用时,如果类没有进行初始化,则需要先触...原创 2018-03-30 21:34:38 · 250 阅读 · 0 评论 -
Java初始化顺序
Java初始化的三个原则: 1. 静态对象优先于非静态对象 2. 父类优先于子类 3. 成员变量优先于任何方法,包括构造函数先后顺序为: 父类static变量->父类static代码块->子类static变量->子类static代码块->父类非static变量->父类非static代码块->父类构造函数->子类非static变量->...原创 2018-03-22 18:33:49 · 135 阅读 · 0 评论 -
栈和队列的互相实现、以及带有GetMin的栈
两个栈实现一个队列: 基本思路: 1. 创建两个栈A,B,A栈用来入栈,B栈用来出栈; 2. 入队列操作:a)A栈未满,直接入栈; b)A栈已满,B栈为空,将A栈中的元素全部出栈并入到B栈;c)A栈已满,B栈不为空,A栈扩容。 3. 出队列操作:a)B栈为空,A栈也为空,抛出异常“队列为空”;b)B栈为空,A栈不为空,将A栈中的元素全部入栈到B栈,然后B栈进行出栈操作;c)B栈不为空...原创 2018-03-19 10:05:06 · 488 阅读 · 0 评论 -
交换左右子树的两种实现(递归和非递归)
递归实现: 基本思想: - 交换左右子树 - 对左子树进行递归交换 - 符右子树进行递归交换非递归实现: - 借助栈来实现 - 首先交换左右子树 - 右子树不为空时将右子树入栈 - 左子树不为空时指针指向左子树 - 否则出栈 实验过程如下:import java.util.LinkedList;import java.util.Queue;im...原创 2018-03-18 13:28:10 · 11658 阅读 · 1 评论 -
进程与线程
进程与线程: 基本概念: 进程:进程是正在运行的程序的实例。每个进程都有自己的地址空间,一般情况下,它包括文本区域、数据区域和堆栈。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存,堆栈区存储着活动过程调用的指令和本地变量。进程由程序、数据和进程控制块组成。 线程:线程是进程中的一个实体,CPU调度的基本单位。线程不再拥有系统资源,只拥有一点在运行中必不可少的...原创 2018-03-18 10:40:43 · 166 阅读 · 0 评论 -
Java的四种引用
Java的四种引用: Java的四种引用由强到弱分为:强引用->软引用->弱引用->虚引用。 1.强引用 不会被GC回收,平时用得最多的就是强引用。Object o = new Object(),o就是一个强引用。如果一个对象是强引用,那么即使内存空间不足,JVM宁愿抛出OutofMemoryError异常,也不会强制回收强引用对象来解决内存不足问题。 例如:public class Str原创 2018-03-17 22:58:51 · 193 阅读 · 0 评论 -
Java实现多线程的方法
Java实现多线程主要包括三种方式: 继承Thread类 实现Runnable接口 实现Callable接口 区别: 1.继承Thread类和实现Runnable方法启动线程都是使用start方法,然后JVM将此线程放到就绪队列,如果有处理机可用,则执行run方法。 2.实现Callable接口要实现call方法,并且线程执行完毕后会有返回值,其他两种重写run...原创 2018-03-17 16:41:23 · 212 阅读 · 0 评论 -
Java与C++的区别
C++和Java的区别: (面试问到这个问题,特来总结一下 根据C++Prime和Think in Java两本书总结而来) 尽管Java是基于C++的的,但是相比之下,Java是一种更纯粹的面向对象程序设计语言。在Java中,一切都被视为对象。 1. C++创建对象之后,需要再使用完将其调用delete方法将其销毁;Java有垃圾回收机制,用来监视new出来的所有对象,辨别不会再被引用的...原创 2018-03-17 14:53:47 · 43795 阅读 · 13 评论 -
幂运算
//1.基本实现方法 递归 时间复杂度O(n) double pow(int x,int n){ if(n<0) return 1.0/pow(x, -n); if(n == 0) return 1; if(n == 1) return x; ...原创 2018-03-16 21:56:43 · 250 阅读 · 0 评论 -
Java线程池的使用
线程池(Thread Pool): 一种线程的使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这是未来避免在处理短时间任务时创建与销毁线程的代价。 Executor框架是JavaSE5中引入的,其内部使用了线程池机制。在java.util.concurrent包中。Executorz在客户端和任务执行...原创 2018-03-26 15:01:55 · 222 阅读 · 0 评论 -
Arrays.sort()的使用(2)
最近看Arrays.sort()的源码才发现Arrays.sort()可以对自定义对象数组进行排序,楼主以前做题都打算自己写排序来着,现在想来蠢哭。在自己定义的类中实现Comparable接口,并重写compareTo方法,在该方法中定义比较规则即可。示例代码如下:import java.util.Arrays;import java.util.Random;//使用Arrays.So...原创 2018-04-01 21:34:03 · 366 阅读 · 0 评论 -
Map实现按照Key的升降序和按照Value的升降序
1.TreeMap按照Key排序,默认为升序 2.将TreeMap按照Key降序则需要传入Comparator对象,重写compare方法。 3.按照Value排序则需要将map.entrySet()转换为list。import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;...原创 2018-05-04 20:44:46 · 347 阅读 · 0 评论 -
查找单链表的中间节点
这是今天面试测开面试官提到的一个问题,当时有点紧张,代码写的不整洁,回来整理了一下。个人有点强迫症,纸上的代码一定想用机器跑起来。特整理如下: 问题描述:查找单链表的中间节点。 我的思路:快慢指针。“` class Node { int val ; Node next; public Node(int val) { // TODO Auto...原创 2018-04-20 21:21:51 · 271 阅读 · 0 评论