自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(127)
  • 收藏
  • 关注

原创 3-sum问题

编写一个ThreeSum程序,用它统计一个文件中所有和为0的三整数元组的数量(假设整数不会溢出)

2019-08-23 15:33:04 571

原创 使用last节点完成一个单向循环队列

使用last节点完成一个单向循环队列

2019-08-16 00:26:20 329

原创 递归(二)

编写一个函数,接受一条链表的首节点作为参数,将链表反转并返回结果链表的首结点

2019-08-14 23:12:43 256

原创 使用一个节点实现环形Queue

用环形链表实现Queue。环形表也是一条链表,只是没有任何节点的链接为空,且只要链表非空则last.next的值为first。只能使用一个Node类型的实例变量(last)。

2019-08-13 23:39:52 191

原创 递归(一)

使用递归方法编写一个`max()`,接受一条链表的首结点作为参数,返回链表中键最大的节点的值(假设所有键均为正整数,如果链表为空则返回0)。

2019-08-13 16:16:13 146

原创 中缀表达式转后缀表达式

一.为什么需要将中缀表达式转成后缀表达式编译器从左到右扫描表达式中缀表达式形式为 a + b,后缀表达式形式为 a b +考虑表达式 a op1 b op2 c op3 d 如果op1 = + op2 = * op3 = +编译器首先扫描表达式b * c,然后再次扫描表达式以向其添加a。然后在另一次扫描后将结果添加到d。当然也可以通过添加括号来直接确定计算顺序,形式为 ( ( a + ( ...

2019-08-12 16:19:34 191

原创 判断输入的日期是否合法并输出该日期对应星期几

《算法4》的课后练习题1.2.11,页码为72页。实现一个SmartDate类,在日期非法时抛出异常,并添加一个dayOfTheWeek()方法,输出这天是星期几。public class SmartDate { private int year; private int month; private int day; public SmartDate(int...

2019-08-07 18:43:53 598

原创 String两次赋值可能得到两个不同对象

在Java中,除了基本数据类型之外,其他数据类型均为对象。常见的String,数组均为对象。对象在赋值时,会传递地址,两个变量指向同一个地址。String string1 = "hello";String string2 = string1;StdOut.println(string2.hashCode() == string1.hashCode());结果为true这时为str...

2019-08-06 20:59:56 1334

原创 自制一个简单的数字加密

最近在学习《算法4》。本书的56页,使用一个数值来保存年月日。看到这里我为算法的强大感到惊叹。public class DateDefination { private final int value; public DateDefination(int m,int d,int y){ value = y*512+ m * 32 + d; } ...

2019-08-05 22:35:43 2220

原创 一个简便的范型带有迭代器的栈实现

package Chapter1;import java.util.Iterator;//支持范型的自定义栈//N表示栈中元素的数量,实际元素的数量,随着入栈和出栈操作会发生变化//a.length是创建栈容器时指定的数组的大小,不会随着入栈或出栈而改变//注意这里实现的接口是Iterable而不是iterator//为什么不直接实现iterator接口?//1.无法指定光标的位置。...

2019-05-14 16:33:15 258

原创 Dijkstra的双栈算术表达式求值算法

表达式由括号,运算符("+","-,"*","/",“sqrt”)和操作数组成。用两个栈(一个用于保存运算符,一个用于保存操作数)完成任务。该算法必须保证每次运算都有括号包裹。public class Evaluate { public static void main(String[] args) { Scanner in = new Scanner(System...

2019-05-14 09:24:18 316

原创 LinkedList源码分析

//初始化一个空的列表public LinkedList() {}//添加一个特定的元素到列表的末尾public boolean add(E e) { linkLast(e); return true;}//定义末尾结点lasttransient Node<E> last;//链接e作为最后一个元素void linkLast(E e) ...

2019-05-13 21:34:50 95

原创 ArrayList源码分析

//ArrayList容器为数组transient Object[] elementData; //数组实际存储的元素数量private int size;//构造函数public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}//添加一个元素public boolean ad...

2019-05-13 20:22:03 112

原创 SpringAOP原理分析

SpringAOP使得代码关注点分离,不同的问题交给不同的部分去解决。将业务功能代码与切面代码分开,架构也变得高内聚,低耦合。一.AOP的三种织入方式编译时织入:需要特殊的Java编译器,如AspectJ类加载时织入:需要特殊的Java编译器,如AspectJ和AspectWerkz运行时织入:Spring采用的方式,通过动态代理方式,实现简单二.理解三个W理解如下代码@...

2019-04-30 17:49:04 268

原创 SpringIOC原理分析

一.IOC是什么IOC-Inversion of Control,即控制反转,不是什么技术,而是一种设计思想。在Java开发中,IOC意为着将设计好的对象交给容器控制,而不是传统的在对象内部直接控制。传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IOC是有专门一个容器来创建这个对象,即由IOC容器来控制对象的创建。它能够指导我们如何设计出...

2019-04-29 17:45:08 145

原创 访问目录中的项

静态的Files.list方法会返回一个可以读取目录中各个项的Stream<Path>对象。目录是被惰性读取的,这使得处理具有大量项的目录可以变得高效//因为读取目录涉及需要关闭的系统资源,所以应该使用try块try(Stream<Path> entries = Files.list(pathToDirectory)){ } catch (IOException ...

2019-04-27 20:50:30 126

原创 获取文件信息

下面的静态方法都将返回一个boolean值,表示检查路径的某个属性的结果。existsisHiddenisReadable,isWritadble,isExecutableisRegularFile,isDirectory,isSymbolicLinksize方法返回文件的字节数:Files.size(path);Files.getOwner(path);方法将文件的拥有者作为...

2019-04-27 13:07:09 221

原创 操作文件

Path和Files类封装了在用户机器上处理文件系统所需的所有功能。例如,Files类可以用来移除或重命名文件,或者查询文件最后被修改的时间。换句话说,输入/输出流类关心的是文件的内容,而Path和Files类关心的是在磁盘上如何储存文件。一.PathPath表示的是一个目录名序列,其后还可以跟着一个文件名。路径中的第一个部件可以是根部件,例如 / 或 C:\ ,而允许访问的根部件取决于...

2019-04-27 10:54:30 226

原创 为克隆使用序列化

序列化为克隆对象提供了一种简便的途径,只要对应的类是可序列化的即可。其做法很简单:直接将对象序列化到输出流中,然后将其读回。这样产生的新对象是对现有对象的一个深拷贝。在此过程中,我们不必将对象写出文件中,因为可以用ByteArrayOutputStream将数据保存在字节数组中。具体做法就是拓展SerialCloneablepublic class SerialCloneable impl...

2019-04-26 21:35:23 117

原创 序列化中的版本管理

如果使用序列化来保存对象,就需要考虑在程序演化时会出现的问题。例如,新版本可以读入旧文件吗?旧版本可以读入新版本产生的文件吗?乍一看,这好像是不能的。无论类的定义产生了什么样的变化,它的SHA指纹也跟着变化,而我们都知道对象输入流将拒绝读入具有不同指纹的对象。但是,类可以表明它对早期版本保持兼容,要想这样做,就必须首先获得这个类的早期版本指纹。这个类的所有较新的版本都必须把serialVers...

2019-04-26 21:17:24 489

原创 对象输入/输出流与序列化

Java语言支持一种称为对象序列化的非常通用的机制,它可以将任何对象写出到输入流中,并在之后将其读回。一.保存和加载序列化对象为了保存对象数据,首先需要打开一个ObjectOutputStream对象。可以直接使用ObjectOutputStream的writeObject方法。对应的,将对象读回,首先需要获得一个ObjectInputStream对象,然后用readObject方法以这...

2019-04-26 18:15:47 671

原创 ZIP文档

ZIP文档(通常)以压缩格式存储了一个或多个文件,每个ZIP文档都有一个头,包含诸如每个文件名字和所使用的压缩方法等信息。在Java中,可以使用ZipInputStream来读入ZIP文档。浏览文档中每个单独的项,getNextEntry方法就可以返回一个描述这项的ZipEntry类型的对象。向ZipInputStream的getInputStream方法传递该项可以获取用于读取该项的输入流。然...

2019-04-26 15:09:20 980

原创 随机访问文件

RandomAccessFile类可以在文件中的任何位置查找或写数据。磁盘文件都是随即访问的,但是与网络套接字通信的输入/输出流却不是。打开一个随机文件,只用与读入或者同时用于读写,可以通过使用字符串r(用于读入访问)或rw(用于读入/写出访问)作为构造器的第二个参数来指定这个选项。RandomAccessFile in = new RandomAccessFile("C:\\Users\\...

2019-04-25 16:51:01 793

原创 读写二进制数据

一.DataInput 和DataOutput接口DataOutput接口定义了下面用于以二进制格式写数组,字符,boolean值和字符串的方法: public void writeBoolean(boolean v) throws IOException {} public void writeByte(int v) throws IOException {} public void...

2019-04-24 22:28:33 220

原创 文本输入与输出

一.文本输入在保存数据时,可以选择二进制格式或文本格式。例如,整数1234存储成二进制数时,它被写为00 00 04 D2构成的序列(十六进制表示法),而存储成文本格式时,它被存成了字符串"1234"。尽管二进制格式的I/O高效,但是不宜人来阅读。在存储文本字符串时,需要考虑字符编码方式。在Java内部使用的UTF-16编码方式中,字符串"1234"编码 00 21 00 32 00 33 ...

2019-04-24 18:28:21 698

原创 输入/输出流

在Java API中,可以从其中读入一个字节序列的对象称做输入流,而可以向其中写入一个字节序列的对象称做输出流。这些字节序列的来源地和目的地可以是文件,而且通常都是文件,但是也可以是网络连接,甚至是内存块。抽象类InputStream和OutputStream构成了输入/输出(I/O)类层次结构的基础。因为面向字节的流不便于处理以Unicode形式存储的信息,所以从抽象类Reader和Writ...

2019-04-22 22:32:13 146

原创 安卓课堂作业

一.作业要求界面如下图所示:当输入的用户名或密码为空时,弹出一吐司,提示用户名或密码不能为空;当所有信息正确填完后,并点击“注册”按钮,在注册结果处,显示所填的所有信息。当点击“重置”按钮,则清空所填选项。本人严格按照作业要求,最终完成作业。界面展示如下:需要的同学可以拿去。百度云链接提取码:3uxp...

2019-04-22 19:08:30 490 1

原创 同步器

java.util.concurrent包包含了几个能帮助人们管理相互合作的线程集的类。这些机制具有为线程之间的共用集结点模式提供的预置功能。如果有一个相互合作的线程集满足这些行为模式之一,那么应该直接重用合适的库类而不要试图提供手工锁与条件结合。一.信号量概念上讲,一个信号量管理许多的许可证明。为了通过信号量,线程通过调用acquire请求许可。其实没有实际的许可对象,信号量仅维护一...

2019-04-20 18:10:46 194

原创 可完成Future

处理非阻塞调用的传统方法是使用事件处理器,程序员为任务完成之后出现的动作注册一个处理器。当然,如果下一个动作也是异步的,在它之后的下一个动作会在一个不同的事件处理器中。尽管程序员会认为,先做步骤1,然后是步骤2,再完成步骤3,但实际上程序逻辑会分散到不同的处理器中。如果必须增加错误处理,情况会更糟糕。假设步骤2是用户登录。可能需要重复这个步骤,因为用户输入凭据时可能会出错。要尝试在一组事件处理器...

2019-04-20 17:16:21 315

原创 Fork-Join框架

假设想要统计一下数组中有多少个元素满足某个特定的属性。可以将这个数组一分为二,分别对这两部分进行统计,再将结果相加。public class ForkJoinTest { public static void main(String[] args) { final int SIZE = 10000000; double[] numbers = new ...

2019-04-20 16:02:58 93

原创 控制任务组

将一个执行器服务作为线程池使用,以提高执行任务的效率。有时,使用执行器有更有实际意义的原因,控制一组相关任务。例如,可以在执行器中使用shutdownNow方法取消所有的任务。invokeAny方法提交所有对象到一个Callable对象的集合中,并返回某个已经完成了的任务的结果。无法知道返回的究竟是哪个任务的结果。invokeAll方法提交所有对象到一个Callable对象的集合中,并返回一...

2019-04-20 12:25:00 178

原创 预定执行

ScheduledExecutorService接口具有为预定执行或重复执行任务而设计的方法。它是一种允许使用线程池机制的java.util.Timer的泛化。Executors类的newCachedThreadPool和newSingleThreadScheduledExecutor方法将返回实现了ScheduledExecutorService接口的对象。可以预定Runnable或Call...

2019-04-20 11:48:17 123

原创 线程池

构建一个新的线程是有一定代价的,因为涉及与操作系统的交互。如果程序中创建了大量的生命期很短的线程,将Runnable对象交给线程池。一个线程池中包含许多准备运行的空闲线程。将Runnable对象交给线程池,就会有一个线程调用run方法,当run方法退出时,线程不会死亡,而是在池中准备为下一个请求提供服务。另一个使用线程池的理由是减少并发线程的数目。创建大量线程会大大降低性能,甚至使虚拟机崩溃。...

2019-04-20 11:35:22 83

原创 Callable与Future

Runnable封装一个异步运行的任务,可以把它想象成为一个没有参数和返回值的异步方法。Callable与Runnable类似,但是有返回值。Callable接口是一个参数化的类型,只有一个方法call。public interface Callable<V> { //计算并返回结果 V call() throws Exception;}类型参数是返回值类型。例...

2019-04-20 10:01:11 125

原创 阻塞队列

对于实际编程来说,应该尽可能远离底层结构。使用由并发处理的专业人士实现的较高层次的结构要方便得多,要安全得多。对于许多线程问题,可以通过使用一个或多个队列以优雅且安全的方式将其形式化。生产者线程向队列插入元素,消费者线程调用它们。使用队列,可以安全地从一个线程向另一个线程传递数据。例如,考虑银行转账程序,转账线程将转账指令对象插入一个队列中,而不是直接访问银行对象。另一个线程从队列中取出指令执...

2019-04-18 17:49:46 952

原创 弃用stop和suspend方法

初始的Java版本定了一个stop方法用来终止一个线程,以及一个suspend方法用来阻塞一个线程直到另一个线程调用resume。stop和suspend方法有一些共同点:都视图控制一个给定的线程行为。stop,suspend和resume方法已经弃用。stop方法天生就不安全,经验证明suspend方法会经常导致死锁。stop方法终止所有未结束的方法,包括run方法。在模拟银行转账中,假定...

2019-04-18 14:30:34 244

原创 读/写锁

如果很多线程从一个数据结构读取数据而很少线程修改其中数据的话,可以使用java.util.concurrent.locks.ReentrantReadWriteLock。在这种情况下,允许对读者线程共享访问是合适的。当然,写者线程依然必须是互斥访问的。public class ReentrantReadWriteLockTest { //构造一个ReentrantReadWriteLock...

2019-04-18 12:06:31 97

原创 锁测试和超时

线程在调用lock方法获得另一个线程所持有的锁的时候,很可能发生阻塞。应该更加谨慎地申请锁。tryLock方法试图申请一个锁,在成功获得锁后返回true,否则,立即返回false,而且线程可以立即离开去做其他事情。if(myLock.tryLock()){ //获得锁 try{...} finally { myLock.unlock(); }}else ...

2019-04-18 11:51:32 286

原创 ThreadLocal线程局部变量

有时可能要避免共享变量,使用ThreadLocal辅助类为各个线程提供各自的实例。例如,SimpleDateFormat类不是线程安全的。可以这样处理:public class ThreadLocalTest { public static final ThreadLocal<SimpleDateFormat> dateFormat = Thre...

2019-04-18 11:13:22 157

原创 原子性

java.uitl.concurrent.atomic包中有很多类使用了很高效的机器级指令(而不是使用锁)来保证其它操作的原子性。例如,AtomicInterger类提供了方法incrementAndGet和decrementAndGet,它们分别以原子方式将一个整数自增或自减。AtomicInteger atomicInteger = new AtomicInteger(1);//以原子...

2019-04-18 09:46:34 459

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除