自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(122)
  • 资源 (1)
  • 收藏
  • 关注

原创 位运算应用场景(每遇更新)

1. and运算 &and运算通常用于二进制取位操作(1)例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。// 由于自动补全动作,1的前面位全部为0,只有最后1位为1,故前面每一位与1运算结果都是0// 而最后一位如果为0,即原数为偶数;如果为1,原数为奇数if((a & 1) == 1) System.out.println("a为奇数");if((a & 1) ==

2021-03-26 18:43:40 564

原创 树-二叉树(前中后序遍历+按值查找+删除节点)

为什么需要树这种数据结构:1)数组存储方式的分析:优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者,或者插入值(按一定顺序)会整体移动,效率较低。2)链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接道链表中即可,删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从你个头节点开始遍历)。3)树存储方式的分析能提高数据存储,读取的效率,比

2021-03-26 14:00:18 902

原创 二分查找和插值查找

1.线性查找2.二分查找

2021-03-23 16:18:29 333

原创 排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序)

排序也叫排序算法,排序是将一组数据,依指定的顺序进行排列的过程。排序的分类:1)内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。2)外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。3)常见的排序算法分类:内部排序:(1)插入排序:直接插入排序、希尔排序(2)选择排序:简单选择排序、堆排序(3)交换排序:冒泡排序、快速排序(4)归并排序、基数排序我们先回顾知识点:时间复杂度时间频度:一个算法花费的时间与算法中语句的执行次数成正比例

2021-03-18 20:03:57 5906

原创 C/S结构文件上传案例

文件上传分析图解。1.客户端:输入流,从硬盘读取文件数据到程序中;2.客户端:输出流,写出文件数据到服务器端;3.服务端:输入流,读取文件数据到服务端程序;4.服务端:输出流,写出文件数据到服务器硬盘中。注意:客户端和服务器端和本地硬盘进行读写,需要使用自己创建的字节流对象(本地流)客户端和服务器之间读写,必须使用Socket中提供的字节流对象(网络流)文件上传的原理,就是文件的复制。public class TCPCFileClient { public sta

2021-03-17 15:22:33 228

原创 TCP通信程序

1.概述TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格分为客户端(Client)与服务端(Server)。两端通信时步骤:1.服务端程序,需要事先启动,等待客户端的连接。2.客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。在Java中,提供了两个类用于实现TCP通信程序:1.客户端:java.net.Socket类表示。创建Socket对象,向服务器发出连接请求,服务端响应请求,两者建立连接开始通信。2.服务端:java.net.Ser..

2021-03-17 15:00:30 195

原创 软件结构/网络通信协议/IP地址/端口号

软件结构(1)C/S结构:全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。(2)B/S结构

2021-03-17 10:45:21 411 2

原创 算法题-Java实现:从 1 到 n 整数中 1 出现的次数(时间复杂度O(logn))

前言:仅仅是自己的做题思路及优化过程记录,非官方答案,仅供参考。题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。原始思路:遍历一次1~n,使用动态字符串StringBuilder.append将数据串起来,然后转化为char数组,再

2021-03-12 16:49:45 395

原创 递归(回溯之迷宫问题+八皇后)

回顾知识点递归概念:递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归调用机制:1)打印问题2)阶乘问题// 打印问题private static void test(int n){ if(n > 1){ test(n - 1); // 到1为止 } System.out.println("n = " + n);}// 阶乘问题private static int f

2021-03-11 19:12:23 122

原创 前缀(波兰)、中缀、后缀(逆波兰)表达式

前缀、中缀、后缀表达式是对表达式的不同记法,其区别在于运算符相对于操作数的位置不同,前缀表达式的运算符位于操作数之前,中缀和后缀同理。前缀表达式(波兰表达式)前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前。举例说明(3+4)*5-6对应的前缀表达式就是-*+3456。前缀表达式的计算机求值:从右往左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶两个数,同运算符对它们做相应的计算(栈顶元素和次顶元素)...

2021-03-11 15:24:40 1311

原创 打印流

java.io.PrintStream继承了字节流,因此有父类的共性成员方法,同时为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。特点:1.只负责数据的输出,不负责数据的读取;2.与其他输出流不同,PrintStream 永远不会抛出 IOException;3.与有特有的方法,print和println方法,可以输出任意类型值,区别于是否换行。构造方法:(红色为常用)构造方法摘要 PrintStream(Filefile)创建具有指定文...

2021-03-11 11:25:24 97

原创 序列化与反序列化和transient瞬态关键字

1.概述Java提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据、对象的类型和对象中存储的数据信息,都可以用来在内存中创建对象。序列化:对象转换为字节 ObjectOutputStream反序列化:字节重构为对象 ObjectInputStream2.ObjectOutp

2021-03-10 17:32:04 226

原创 转换流InputStreamReader类和OutputStreamWriter(字符编码和字符集)

1.字符编码和字符集字符编码:计算机中储存的信息都是用二进制表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。编码:字符-->字节;解码:字节-->字符字符编码就是一套自然语言的字符与二进制数之间的对应规则。

2021-03-10 16:30:05 1042

原创 缓冲流

昨天学习了基本的一些六,作为IO流的入门,今天学习一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来,相当于是对基本流对象的一种增强。概述缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。缓冲流,也叫高效流,是对4个基本的FileXxx流的增强,所以也是4个流,按照数据类型分类:字节缓冲流:BufferInpu

2021-03-10 14:26:31 127

原创 属性集合Properties

概述java.util.Properties继承于Hashtable,来表示一个持久的属性集。Properties可以保存在流中或从流中加载。它使用键值结构存储数据,每个键及其对应值都是一个字符串(双列集合)。该类也被许多java类使用,比如获取系统属性时,System.getProperties方法就是返回一个Properties对象。Hashtable是最早期的双列集合,但由于其单线程操作被Hashmap替代了,然而其子类Properties仍活跃着,因为是唯一和IO流相结合的集合。Proper

2021-03-10 11:35:41 191

原创 栈Stack(数组模拟、单链表模拟)

栈是一个先入后出的有序列表,是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶定(top),另一端为固定的一端,称为栈底(bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。入栈图解:出栈图解:应用场景:1)子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完毕之后再将地址取出,以回到原来的程序中。

2021-03-09 19:47:07 171

原创 IO异常的处理

JDK7前的IO流异常处理无法使用throws声明抛出异常交给方法调用者直到给到JVM去处理,只能try-catch-finally代码块捕捉异常,处理异常。public static void main(String[] args) { //提高变量fw的作用域,让finally可以使用 //变量在定义的时候,可以没有值,但是使用的时候必须有值 //fw = new FileWriter("E:\\g.txt",true); 执行失败,fw没有值,...

2021-03-09 14:08:56 684

原创 字符流(字符输入流和字符输出流)

概述当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。字符输入流Readerjava.io.Reader抽象类是标识用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。磁盘-->内存public void close():关闭此流并释放与此流相关联的任何系统资源。public in

2021-03-09 13:52:42 6489

原创 字节输入流

java.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中,它定义了字节输入流的基本共性功能方法。磁盘-->内存public void close():关闭输入流并释放与此流相关联的任何系统资源。public abstract int read():从输入流读取数据的下一个字节。public int read(byte[] b):从输入流中读取一些字节数,并将它们存储到字节数组b中。FileInputStream类文件字节输入流,把硬盘

2021-03-08 17:26:49 869

原创 IO流概述+字节输出流

1.IO概述类似于从u盘将文件拷贝到电脑硬盘里,把这种数据传输,看作是一种数据流动,按照流动的方向,以内存为基准,分为输入input和输出out,即流向内存是输入流,流出内存是输出流。Java中I/O操作主要是指使用java.io包下的内容,进行输入输出操作。输入也叫做读取数据,输出也叫做写出数据。2.IO分类知识点回忆:①ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算

2021-03-08 14:50:36 222

原创 双向链表和环形链表(单向和双向)约瑟夫环实例

双向链表数组优缺点:根据下标直接查找和修改,增删需要移动后续数据,效率低。单向链表的缺点:增删快速,查找需要从头遍历,效率低。双线链表可以向前或向后查找。单向链表查找的方向只能是一个方向(双向链表可以向前向后查找),且不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除,所以前面我们单链表删除节点时,总是找到temp的下一个节点来删除的(就是指temp.next.data == data,因为要对该节点的前一个节点及后一个节点操作。)双向链表节点包含数据域data、前驱指针域prev

2021-03-06 13:10:56 449

原创 单链表LinkedList的增删改查

数组作为数据存储结构有一定的缺陷。在无序数组中,搜索性能差,在有序数组中,插入效率又很低(插入位置后面的元素需要集体后移),而且这两种数组的删除效率(集体前移)都很低,并且数组在创建后,其大小是固定了,设置的过大会造成内存的浪费,过小又不能满足数据量的存储。数组是一种通用的数据结构,能用来实现栈、队列等很多数据结构。而链表也是一种使用广泛的通用数据结构,它也可以用来作为实现栈、队列等数据结构的基础,基本上除非需要频繁的通过下标来随机访问各个数据,否则很多使用数组的地方都可以用链表来代替。注意:链表是

2021-03-04 18:31:57 487 2

原创 队列

队列,进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。队列特点:先进先出队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明队列分为:①、单向队列(Queue):只能在一端插入数据

2021-03-04 15:43:24 855 2

原创 稀疏数组

一.稀疏数组sparsearray定义:当一个数组元素中大部分元素为0,或者为同一值时,可使用稀疏数组保存数组。即从原数组中抽取有效数据、剔除相同元素从而形成一个新的数组。处理方式:记录数组一共几行几列,有多少不同的值,把具有不同值元素的行列及值记录在一个小规模的数组中,从而缩小数组的规模。应用场景举例说明:稀疏数组的第一行记录的是原数组的行列数(12)以及多少个有效值(16),注意行列数都是从0开始。因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据->稀疏数组,12

2021-03-04 14:44:20 83 2

原创 LeetCode两数之和

题目描述:给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。暴力解法:public static int[] twoSum(int[] nums, int target) { int first = 0,end = 0; for (int i = 0; i < nums.length; i++) { .

2021-03-03 17:06:50 51 1

原创 FileFilter过滤器

如打印多级目录下所有以.java结尾的文件,常规递归做法:/*练习:递归打印多级目录需求:遍历D:\\a文件及,及a文件夹下的子文件夹只要.java结尾的文件 */public class Demo13FileFilter { public static void main(String[] args) { File dir = new File("D:\\a"); getAllFile(dir); } /*

2021-03-03 15:45:09 174 1

原创 递归(斐波那契数列、类加、累乘、打印多级目录)

概述:递归:指在当前方法内调用自己的这种现象。递归的分类:递归分为两种,直接递归和间接递归。直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。注意事项:1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。3.构造方法,禁止递归。递归的使用前提:当调用方法的时候,方法的主体不变,每次调用你发给发的参数不同,可以使用递归。pub

2021-03-03 15:06:23 187

原创 File类

概述:java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。构造方法:public File(String pathname)

2021-03-03 14:14:02 114

原创 Lambda表达式

函数式编程思想概述在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿什么东西做什么事情”。相对而言,面向对象过分强调“必须通过对象的形式来做事情”。而函数式思想则尽量忽略面向对象的复杂语法--强调做什么,而不是以什么形式做。面向对象的思想:做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情。函数式编程思想:只要能获取到结果,谁去做的,怎么做的,都不重要,重视的是结果,不重视过程。冗余的Runnable代码传统写法:当需要启动一个线程去完成任务时,通常会通过java

2021-03-02 17:27:13 57

原创 线程池

我们使用线程的时候就去创建一个线程,这样实现起来非常方便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。线程池概念线程池:其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程.

2021-03-02 14:36:25 56

原创 Object类中wait带参方法和notifyAll方法

查看Object类的API文档可以看到,除了无参方法wait之外,类中还有重载的有参wait方法:以及一个 notifyAll方法:进入到Timed_Waiting(计时等待)状态有两种方式:1.sleep(long m)方法,在毫秒值结束之后,线程睡醒,进入到Runnable或BLocked状态。2.使用wait(long m)方法,wait方法如果在毫秒结束之后,还没有被notify,就会自动醒来,进入到Runnable或BLocked状态。(区别:直接wait无参,是进入wa.

2021-03-02 11:34:35 206

原创 线程状态

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,在API中java.Thread.State这个枚举中给出了六种线程状态:这里先列出各个线程状态的条件,下面将会对每种状态进行详细解析线程状态 导致状态发生条件 NEW(新建) 线程刚被创建,但是并未启动,还没调用start方法。 Runnable(可运行) 线程可以在Java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。 Blocked(

2021-03-02 11:10:57 91

原创 数据结构基本概念和术语

1.1数据结构的研究内容通常,用计算机解决一个问题的步骤:首先具体问题抽象为数学模型,然后设计算法,最后编程、调试、运行。具体问题抽象为数学模型的实质:分析问题、提取操作对象、找出操作对象之间的关系、用数学语言描述。这其中的操作对象和操作对象之间的关系就是数据结构。随着计算机应用领域的扩展,计算机被越来越多地用于非数值计算,比如学生信息录入修改等。操作对象:每位学生的信息(学号、姓名、性别、籍贯、专业...)操作算法:查询、插入、修改、删除等。操作对象之间的关系:线性关系数据结.

2021-02-28 20:23:01 1085

原创 线程安全

1.线程安全如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。代码实现:public class RunnableImpl implements Runnable{ // 定义一个多个线程共享的票源 private int ticket = 100; // 设置线程任务:卖票 @Override public void run() {

2021-02-28 19:44:03 76

原创 Thread和Runnable的区别和匿名内部类方式实现线程的创建

Thread和Runnable的区别:如果一个类继承Thread,则不适合资源共享。但如果实现了Runnable接口的话,则很容易实现资源共享。总结:实现Runnable接口比继承Thread类所具有的优势:1.适合多个相同的程序代码的线程去共享一个资源。2.可以避免Java中的单继承的局限性。(一个子类只能继承一个父类,类继承了Thread类就不能继承其它的类。而实现了Runable接口,还可以继承其他的类,实现其他的接口。)3.增加程序的健壮性,实现解耦操作,代码可以被多个线程共

2021-02-28 16:58:56 310

原创 创建多线程的第二种方式--实现Runable接口

翻阅API以后得知创建线程的方式总共有两种,一种使继承Thread类方式,一种是实现Runable接口方式,现在学习第二种方式。采用java.lang.Runable也是非常常见的一种,同样只需要重写run方法即可。步骤如下:1.定义Runable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的线程执行体。2.创建Runable实现类的实例对象,并以此实例作为Thread的target来创建Thread对象(Thread的一个构造方法,参数是Runable实现类对象

2021-02-28 16:14:23 409 1

原创 Thread类的构造方法及常用方法

API中java.lang.Thread类定义了有关线程的一些方法,具体如下:构造方法:public Thread():分配一个新的线程对象。public Thread(String name):分配一个指定名字的新的线程对象。public Thread(Runable target):分配一个带有制定目标新的线程对象。public Thread(Runable target,String name):分配一个带有指定目标新的线程对象并指定名字。常用方法:1.public Str

2021-02-28 16:04:28 1772

原创 线程类以及创建多线程的第一种方式---继承Thread类

先来看一个例子理解主线程和单线程:/*主线程:执行主(main)方法的线程单线程程序:Java程序中只有一个线程程序从main方法开始,从上到下依次执行 */public class Demo11MainThread { public static void main(String[] args) { Person p1 = new Person("易烊千玺",18); Person p2 = new Person("王俊凯",19);

2021-02-28 15:00:46 307

原创 进程与线程

前文在讲集合的时候,介绍集合只要是不安全的就是多线程的,多线程意味着速度快。1.计算机的核心是cpu,负责所有的计算任务;计算机的管理者是操作系统,负责任务的调度、资源的分配核管理(统领整个计算机硬件)。2.应用程序是具有某种功能的程序,程序是运行在操作系统之上的。一.并发与并行并发:指两个或多个事件在同一时间段内发生。并行:指两个或多个事件在同一时刻发生(同时发生)。使用cpu执行任务,譬如是一块单核cpu,左图并发:cpu在一个时间段里先执行任务1,再执行任务2,接着执行任务1,

2021-02-27 21:33:02 478

原创 自定义异常

自定义异常类:当Java提供的异常类,不够使用时,需要自己定义一些异常类。格式:public class XXXException extends Exception 或者 RuntimeException{添加一个空参数的构造方法添加一个带异常信息的构造方法}注意事项:1.自定义异常类一般都是以Exception结尾,说明该类是一个异常类2.自定义异常类,必须继承 Exception (编译异常)或者 RuntimeException(运行异常)--异常指程序执行期非正常执行导

2021-02-26 00:58:24 9640

李航统计学习配套PPT.zip

李航《统计学习》对应PPT 共十二章

2021-01-30

空空如也

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

TA关注的人

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