- 博客(21)
- 收藏
- 关注

原创 将画图板界面上的图像信息保存到本地
将画图板界面上的图像信息保存到本地想必很多人的java入门级项目就是做一个画图板吧,那么,如何将画图板上的图像信息(包括直线、矩形、曲线等绘制以及马赛克、黑白、灰度等简易图像处理)保存到本地呢?这个问题困扰我好久,后来有幸在优快云见到了大佬BlueSky_USC的文章画图板图形保存才搞懂了,我会在下面讲一下原理。其实原理类似之前做过的重绘效果,关键在建立一个“存储容器”,这个容器可以是数组(Shape []),也可以是列表(ArrayList《shape》应该是尖括号<>),每次绘制后,将
2020-11-16 21:01:48
422
原创 数据库乐观锁与悲观锁
悲观锁总是假设最坏的情况,每次去操作数据的时候都认为别人会修改,所以每次在操作数据的时候都会上锁,这样别人想操作这个数据时就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,直到第一个线程用完后释放锁,其他线程才能获得该数据资源)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。悲观锁实现方式:select * from 表名 where i.
2021-03-25 15:24:30
150
原创 java多线程wait为什么用while判断而不是if(;;)
看到一个很有趣的问题:java多线程wait为什么用while判断https://blog.youkuaiyun.com/qq_39552993/article/details/91348409tzq233《java多线程wait为什么用while判断》如果有n个生产者,n个消费者,当存储空间满了之后,假如n(大于1个)个生产者被wait,进入等待唤醒队列。当某个消费者取走了一个数据后,如果调用notifyAll(),则n个生产者线程都将被唤醒,如果此时生产者线程中的wait不在while循环中而是在if中,
2021-01-05 21:57:46
221
原创 数据库连接池
背景:传统方式中,当有多个线程,每个线程都需要连接数据库执行SQL语句的话,那么每个线程都会创建一个连接,并且在使用完毕后,关闭连接。创建连接和关闭连接的过程是比较消耗时间的,当多线程并发的时候,系统就会变得很卡顿。同时,一个数据库同时支持的连接总数也是有限的,如果多线程并发量很大,那么数据库连接的总数就会被消耗光,后续线程发起的数据库连接就会失败。连接池:与传统方式不同,连接池在使用之前,就会创建好一定数量的连接。如果有任何线程需要使用连接,那么就从连接池里面借用,而不是自己创建。使用完毕后
2021-01-05 21:53:30
80
原创 MySQL事务
不使用事务的情况:假设业务操作是:加血,减血各做一次,结束后,英雄的血量不变。而减血的SQL语句不小心写错写成了 updata(而非update),那么最后结果是血量+1,而非期望的不变。String sql1 = "update hero set hp = hp +1 where id = 22";s.execute(sql1);//报错:sql语句错误。该错误只导致“减血”操作失败,但“加血”操作没有影响String sql2 = "updata hero set hp = hp -1 w
2021-01-04 22:47:34
87
原创 execute与executeUpdate的区别
不同点:之前查询用的比较多的是executeQuery,该方法的返回值就是ResultSet,String sql = "select count(*) from user";//执行查询语句,并把结果集返回给ResultSetResultSet rs = s.executeQuery(sql);实际上,execute也可以执行查询语句,然后通过getResultSet,把结果集取出来。String sql = "select * from hero";s.execute(sql);Res
2021-01-03 16:42:20
466
原创 泛型二叉树的问题
我们发现,二叉树在判断左右结点时,是根据(int) t和(int)value的大小关系,但是如果二叉树插入的对象不是int类型,那么是无法实现类型转换的,也就无法进行插入了。为了解决这个问题,我们把Node设计为public class Node<T extends Comparable<T>> {}表示只能接受那些实现了Comparable接口的泛型,也就是说只要实现过Comparable接口的类,都可以用这个二叉树,而左右结点的判断也变得简单了,t和value都是T 类型
2021-01-02 00:46:25
162
原创 泛型二叉树
import java.util.ArrayList;import java.util.List;public class Node<T>{//泛型结点 private Node<T> leftNode = null; private Node<T> rightNode = null; private T value = null; public void add(T t){ if(null == value) { value = t; }
2021-01-01 19:27:31
200
原创 Collections.sort()
https://blog.youkuaiyun.com/qq_23179075/article/details/78753136今天了解了一下Collections.sort(),说说自己的理解。在日常开发中,很多时候都需要对一些数据进行排序,然而那些数据一般都是放在一个集合中,如:Map,Set,List 等,它们都提供了一个排序方法 sort(),要对数据排序直接使用这个方法就行,但是前提是要保证集合中的对象是可比较的。如何让一个对象是可比较的,那就需要让该对象实现Comparable 接口,然后重写里面.
2021-01-01 16:08:21
139
原创 匿名内部类
今天看了一下匿名内部类,起初看不懂语法,后来才发现在之前的学习中已经接触过匿名内部类了,当时在写画图板的时候需要给鼠标添加监听器,addMouseListener方法需要传入一个MouseListener接口的对象,但是我们知道接口不能直接创建对象,所以我们的做法是先创建一个DrawMouse类实现MouseListener接口,再传入DrawMouse类的对象。而匿名内部类的作用就是省略创建子类的过程,从而让代码更加简洁清晰(适合用于这个子类只使用一次的情况,即只需要创建一个类的对象而用不到它的名字)
2020-12-30 21:26:12
106
原创 查找文件内容
给定一个文件夹路径,例如"E:\360Downloads",和一段想要查找的字符串内容,例如"@property@",找出该文件夹中所有含有指定字符串内容的指定格式(".java")的文件。package 对象流;import java.io.File;import java.io.FileReader;import java.io.IOException;public class Test { public static void main(String[] args) { File
2020-12-28 23:38:10
103
原创 io流实现文件复制,文件夹复制~
不多比比,直接上代码~~package 对象流;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class 文件复制 { public static void copyFile(String srcPath, String destPath){ File f1 = new File(srcPath);
2020-12-27 23:07:25
150
原创 java文件读操作的一个技巧:每KB读取,再拼接
今天学到了一个文件读操作的技巧,分享出来大家一起学习~文件读的时候,一般情况下会创建一个数组,用来存文件内容,如下:try(FileInputStream fis = new FileInputStream(f);){ byte[] fileContent = new byte[(int) f.length()]; //(int)f.length()可以用fis.available()替代 fis.read(fileContent);} catch (IOException e) { //
2020-12-22 21:49:55
286
原创 ArrayList问题之高并发多线程环境下会出现内部成员会出现null
问题描述最近在做飞机大战游戏,发现一个问题,就是游戏运行了一定时间后会停止,同时eclipse会报出空指针异常。为此,我针对性地在 遍历list列表并取出列表元素 的for循环中输出每个对象,发现确实会出现null值,且null值出现是随机的,因此我意识到应该不是代码问题(因为如果是代码问题,每次bug的位置、时间等条件应保持一致)。但是由于我代码中有碰撞检测并移除子弹和敌机的操作,怀疑可能是由于移除导致list该位置元素为空,但还没来得及更新就被其他代码调用的情况,因此我为了确定问题根源,将移除
2020-12-22 20:04:01
2093
1
原创 生产消费模型(3)BlockingQueue阻塞队列方法
BlockingQueue是JDK5.0的新增内容,它是一个已经在内部实现了同步的队列,实现方式采用的是await() / signal()方法。它需要在生成对象时指定仓库容量大小,用于阻塞操作的是put()和take()方法。put()方法:队列容量达到最大时,生产者线程自动阻塞。take()方法:队列容量为0时,消费者线程自动阻塞。有ArrayBlockingQueue和LinkedBlockingQueue两种实现形式,前者与ArrayList一样,内部基于数组来存放元素,后者与LinkList
2020-12-19 10:49:53
158
1
原创 生产消费模型(2)await() / signal()方法
本文参考于湘下农人的文章《Java并发:await/wait与锁》在JDK5中,用ReentrantLock和Condition可以实现等待/通知模型,具有更大的灵活性。通过在Lock对象上调用newCondition()方法,将条件变量和一个锁对象进行绑定,进而控制并发程序访问竞争资源的安全。await/waitSleepYield是否释放持有的锁释放不释放不释放调用后何时恢复唤醒后进入就绪态指定时间后立刻进入就绪态谁的方法Condition/Obje
2020-12-19 00:34:53
389
2
原创 生产消费模型(1)wait() / notify()方法
本文参考于NPU_Li Meng的文章《Java多种方式解决生产者消费者问题(十分详细)》和MONKEY_D_MENG的《生产者/消费者问题的多种Java实现方式》生产消费问题,也称有限缓冲问题(Bounded-buffer problem),是多线程同步问题的经典案例。有一块缓冲区作为仓库,生产者循环生成产品(数据)并放到仓库(缓冲区)中,直到仓库满;与此同时,消费者也在循环从仓库(缓冲区)中消耗这些产品(数据),直到缓冲区空。生产者和消费者之间必须保持同步,要保证生产者不会在缓冲区满时放入数据,消费者
2020-12-18 23:05:18
178
1
原创 初学线程安全
什么是线程安全?多线程同时操作同一个共享数据,由于多个线程之间的运行不是同步或有序的,而是抢占式,有可能会出现一种情况是:线程A取出共享数据,还没来得及修改数据值,或者已修改数据值,但还没来得及重新赋值给原变量时,线程B取出此时的共享数据,那么此时的共享数据的状态跟线程A取出时的状态是一样的。写个测试demo如下:...
2020-12-16 20:49:31
79
原创 利用递归实现山脉效果,填充山脉以及山脉颜色渐变
利用递归实现山脉效果,填充山脉以及山脉颜色渐变递归山脉要求:初始定义两个点AB取AB的中点P,让中点的Y坐标在[-range,range]范围内随机取值,得到P点要求每次迭代后range按比例rate缩小分别取AP和PB,重复上述过程递归结束,连线—————————————————————————————————————public void mountain(Graphics g,int x1,int y1,int x2,int y2,int range,double rate){//
2020-11-08 20:08:34
748
6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人