自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java 使用正则表达式和IO实现爬虫以及503解决

Java 使用正则表达式和IO实现爬虫以及503解决我这边找了个小说网站:基本套路:第一步:获取小说每一章的url地址第二步:获取章节url内容并使用正则表达式提取需要的内容第三步:多线程封装,实现如下效果最后测试。代码:内容获取封装:public class WebSpider { //<a href="/35/35971/13555631.html"> 第1章:边哨惨案 </a> -->...

2020-04-14 23:36:16 446

原创 Java 反射调用方法 - 不跳过安全检查、跳过安全检查和普通方法性能比较测试

Java 反射调用方法 - 不跳过安全检查、跳过安全检查和普通方法性能比较测试java中反射提供灵活性同时,给运行效率带来了一定影响。写个代码测试一下package com.xzlf.reflectTest;import java.lang.reflect.Method;import com.xzlf.bean.User;/** * 反射、反射跳过安全检查、普通方法调用性能比较 * @author xzlf * */public class Demo...

2020-04-11 18:25:57 714

原创 Java 反射 -- 获取泛型类型

Java 反射 -- 获取泛型类型先写一个类:public class Demo03 { public void test01(Map<String, User> map, List<User> list) { System.out.println("Demo03.test01()"); } public Map<Integer, User> test02(){ System...

2020-04-11 18:19:10 417

原创 Java 自定义注解及注解读取解析--模拟框架生成SQL语句

Java 自定义注解及注解读取解析--模拟框架生成SQL语句假设们使用一张简单的表,结构如下:定义注解:表注解:package com.xzlf.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.la...

2020-04-11 14:17:12 258

原创 Java 解析 xml 常见的4中方式:DOM SAX JDOM DOM4J

Java 解析 xml 常见的4中方式:DOM SAX JDOM DOM4JJava 四种解析 XML 的特点1、DOM 解析:形成了树结构,有助于更好的理解、掌握,且代码容易编写。解析过程中,树结构保存在内存中,方便修改。2、SAX 解析:采用事件驱动模式,对内存耗费比较小。适用于只处理 XML 文件中的数据时3、JDOM 解析:仅使用具体类,而不使用接口。API 大量使用了 Collections 类。4、DOM4J 解析:JDOM 的一种智能分...

2020-04-10 03:50:07 147

原创 Java 网络编程 -- 基于TCP 实现聊天室 群聊 私聊

Java 网络编程 -- 基于TCP 实现聊天室 群聊 私聊分析:聊天室需要多个客户端和一个服务端。服务端负责转发消息。客户端可以发送消息、接收消息。消息分类: 群聊消息:发送除自己外所有人 私聊消息:只发送@的人 系统消息:根据情况分只发送个人和其他人技术方面: 客户端和服务端收发消息,需要使用IO流,封装一个IOUtils工具类用来释放资源。 客户端需要同时收发消息,需要启动发送和接收两个消息,互不干扰 服务端需要接收每个客户端消...

2020-04-06 03:35:57 2179 6

原创 Java 网络编程 -- 基于TCP 模拟多用户登录

Java 网络编程 -- 基于TCP 模拟多用户登录Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传实现多用户操作之前先实现以下单用户操作,假设目前有一个用户:账号:zs密码:123服务端:public class LoginServer { public static void main(String[] args) throws IOException { System.out.println...

2020-04-05 18:16:09 736

原创 Java 网络编程 -- 基于TCP实现文件上传

Java 网络编程 -- 基于TCP实现文件上传Java TCP 操作基本流程一、创建服务器1、指定端口, 使用serverSocket创建服务器2、阻塞式连接 accept3、操作:输入流 输出流4、释放资源二、创建客户端1、使用Socket 创建客户端 + 服务器的ip和端口2、操作:输入流 输出流3、释放资源实现文件上传:客户端上传:public class FileClient { public static...

2020-04-05 16:37:15 718 2

原创 Java 网络编程 --基于UDP实现一对一聊天功能

Java 网络编程 --基于UDP实现一对一聊天功能UDP 基本流程:UDP发送端基本流程:1、使用DatagramSocket 指定端口 创建发送端2、准备数据 一定转成字节数组3、 封装成DatagramPacket 包裹,需要指定目的地4、发送包裹send​(DatagramPacket p) *5、释放资源UDP接收端基本流程:1、使用DatagramSocket 指定端口 创建接收端2、准备容器 封装成Datagra...

2020-04-05 02:31:23 866

原创 Java 多线程 -- 理解锁:手动实现可重入锁和不可重入锁

Java 多线程 -- 理解锁:手动实现可重入锁和不可重入锁JDK提供的大多数内置锁都是可重入的,也就是 说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立 刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器 将会递减,当计数值等于0时,锁释放。如果没有可重入锁的支持,在第二次 企图获得锁时将会进入死锁状态。现实中,我们一般不会去手动实现锁,而是直接使用JDK或其他框架提供的锁,手动实现主要为了理解。不可重入锁:/...

2020-04-04 16:10:34 471

原创 Java 多线程 -- volatile 山寨版的synchronized

Java 多线程 -- volatile 山寨版的synchronized在 多线程中,每个线程会把数据从主内存中拷贝到自己的工作内存中,当线程完成计算后,再把工作内存的数据更新到主内存中,或者当主内存主数据有更新是,线程会去主内存取最新数据。但是,当线程特别忙时,就不会去主内存读最新数据了。在 java 的多线程中 volatile 主要是为了保证数据的可见性同步,是一个轻量级的synchronized,但是 volatile 并不能保证数据的原子性。下面看一下加...

2020-04-03 01:45:57 525

原创 Java 多线程 -- 指令重排(HappenBefore)

Java 多线程 -- 指令重排(HappenBefore)指令重排是指:代码执行顺序和预期不一致。代码运行一般步骤为:1、从内存中获取指令解码2、计算值3、执行代码操作4、把结果写回内存而写回内存的操作比较耗时,CPU为了性能,可能不会等它完成,就进行对下一个指令解码计算。发生指令重排是CPU为了提高性能,但必须是对结果不影响的情况,比如:a =1; b =2; 先计算a 或者 b 对结果来说没有影响,就有肯能发送重排;而像 a = 5;...

2020-04-03 01:19:24 699 2

原创 Java 多线程 -- 协作模型:生产消费者实现方式二:信号灯法

Java 多线程 -- 协作模型:生产消费者实现方式二:信号灯法使用信号灯法实现生产消费者模式需要借助标志位。下面以演员表演,观众观看电视为列,写一个demo同一资源 电视://同一资源 电视class Tv { String voice; // 信号灯 // T 表示演员表演 观众等待 // F 表示观众观看 演员等待 boolean flag = true; // 表演 public synchronized void play(S...

2020-04-02 23:34:35 548

原创 Java 多线程 -- 协作模型:生产消费者实现方式一:管程法

Java 多线程 -- 协作模型:生产消费者实现方式一:管程法多线程通过管程法实现生产消费者模式需要借助中间容器作为换从区,还包括生产者、消费者。下面以蒸馒头为列,写一个demo。中间容器:为了防止数据错乱,还需要给生产和消费方法加锁并且生产者在容器写满的情况下需要等待消费者消费,同理消费者在容器为空的情况下需要等待生产者生产//缓冲区class SynContainer{ Steamebun[] buns = new Steamebun[10...

2020-04-01 22:24:41 582

原创 Java 多线程 --死锁及解决方案

Java 多线程 -- 死锁在java 多线程中 过多的同步造成相互不释放资源 从而相互等待,造成死锁线现象,一般发生于同步中持有多个对象锁如以下代码:public class DeadLock { public static void main(String[] args) { WuDao wd1 = new WuDao(0, "金毛狮王"); WuDao wd2 = new WuDao(1, "灭绝师太")...

2020-04-01 02:02:24 640

原创 Java 多线程 -- 线程安全 双重检测(double checking)

Java 多线程 -- 线程安全 双重检测(double checking)先看一个经典的12306案例:public class SynBlockTest { public static void main(String[] args) { // 一份资源 SynWeb12306 web = new SynWeb12306(); // 多份代理 new Thread(web,"黄牛").start(); new Thread(web,"码农")....

2020-03-31 22:18:15 1127

原创 Java 多线程 -- lambda 表达式推导

Java 多线程 -- lambda 表达式推导jdk 8 开始 java 引入了lambda 表达式。lambda适用场景:1、接口或父类2、接口或父类只有一个方法我们从多线程写法来推导一下:1、外部类写法:package com.xzlf.thread;/** * Lambda 表达式推导一:外部类 * @author xzlf * */public class LambdaTest01 { public stat...

2020-03-30 03:35:45 923

原创 java 多线--静态代理模式

java 多线--静态代理模式我们使用 java 多线程时,都需要通过线程代理对象来启动线程,常见的写法:new Thread(target).start();这在设计模式中叫静态代理模式,静态代理模式组成;1、公共接口2、真实角色3、代理角色以结婚为例,结婚要找婚庆公司,结婚前和结婚后的事情交给婚庆公司处理,你只要结婚就行。公共接口:// 公共接口interface Marry { void happy...

2020-03-30 01:38:09 797

原创 Java 多线程实现方式三:实现 Callable 接口

Java 多线程实现方式三:实现 Callable 接口java 通过实现Callable 接口来实现多线程相比较于继承Thread 接口和 实现Runnable 接口比较麻烦,但好处是可以有返回值。基本套路:1. 创建目标对象2. 创建执行服务3. 提交执行4. 获取结果5. 关闭服务6.继续方式一的下载图片,改写一下:public class CDownload implements Callable<Boolean>...

2020-03-30 01:28:15 869

原创 Java 多线程实现方式二:实现 Runnable 接口

Java 多线程实现方式二:实现 Runnable 接口由于java是单继承,很多时候为了实现多线程 通过继承 Thread 类后,就不能再继承其他类了。为了方便可以通过实现 Runnable 接口来实现,和Tread 类似需要重写run 方法。下面通过模拟12306 黄牛抢票来简单应用:public class Web12306 implements Runnable{ //票数 private int ticketNums = 99; ...

2020-03-30 01:19:57 798

原创 Java 多线程实现方式一:继承Thread类

Java 多线程实现方式一:继承Thread类java 通过继承Thread类实现多线程很多简单:只需要重写run方法即可。比如我们分三个线程去京东下载三张图片:1、先写个下载类:注意导入CommonsIO 包public class WebDownLoad { public void download(String url, String name) { try { FileUtils.copyURLToFile(ne...

2020-03-30 01:06:02 894

原创 Java IO 流 -- 随机读取和写入流 RandomAccessFile (文件分割和合并)

Java IO 流 -- 随机读取和写入流 RandomAccessFile (文件分割和合并)RandomAccessFile 相对其它流多了一个seek() 方法指定指针的偏移量。1、指定起始位置读取剩余内容public static void test01() throws IOException { RandomAccessFile raf = new RandomAccessFile("src/com/xzlf/io/CopyFile.java", "r"); // 随...

2020-03-29 16:50:15 966

原创 Java IO 流 -- 设计模式:装饰设计模式

Java IO 流 -- 设计模式:装饰设计模式在java IO 流中我们经常看到这样的写法:ObjectOutputStream oos = new ObjectOutputStream( new BufferedOutputStream(new FileOutputStream("obj.ser")));这其实就是IO流使用装饰设计模式,装饰设计模式通常包含:1、抽象的组件(抽象类或接口)2、具体的组件:需要装饰的对象3...

2020-03-29 16:35:45 884

原创 Java IO 流 -- 数据流和对象流 DataOutputStream ObjectOutputStream

Java IO 流 -- 数据流和对象流 DataOutputStream ObjectOutputStDataOutputStream 和 ObjectOutputStream的共同点是:1、写出后读取2、读取顺序和写出一致数据流操作:// 写入 ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(new BufferedOutpu...

2020-03-29 16:12:44 1019

原创 Java IO 流 -- 转换流: InputStreamReader OutputStreamWriter

Java IO 流 -- 转换流: InputStreamReader OutputStreamWritjava 中 转换流是以字符流的形式操作字节流,需要注意一下两点:1、操作内容必须是纯文本2、指定字符集避免乱码操作控制台输入输出:try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new Outp...

2020-03-29 15:51:38 873

原创 Java IO 流--FileUtils 工具类封装

Java IO 流--FileUtils 工具类封装IO流的操作写多了,会发现都已一样的套路,为了使用方便我们可以模拟commosIo 封装一下自己的FileUtils 工具类:1、封装文件拷贝:文件拷贝需要输入输出流对接,通过输入流读取数据,然后通过输出流写出数据,封装代码如下:/** * 对接输入输出流 * * @param is * @param os */ public static void copy(In...

2020-03-27 03:26:59 1660

原创 Java IO 流-- 字节数组流ByteArrayInPutStream ByteArrayOutPutStream

Java IO 流-- 字节数组流ByteArrayInPutStream ByteArrayOutPu字节数组流输于缓冲流,放在jvm内存中,java可以直接操作。我们使用时可以不用关闭,交给GC垃圾回收机制处理、当然我们为了保持良好习惯和代码一致性也可以加上关闭语句。当其实我么打开ByteArrayInputStream 和 ByteArrayOutputStream 源码可以发现字节数组里的colse() 方法是个空方法:/** * Closing a <tt>B...

2020-03-27 02:28:45 1050

原创 Java IO 流-- 文件拷贝

Java IO 流-- 文件拷贝IO流操作套路:1、创建源;2、选择流;3、操作;4、释放资源上代码:package com.xzlf.io;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStr...

2020-03-27 02:14:45 1080

原创 Java IO基础--File常用操作(递归)

Java IO基础--File常用操作(递归)File中经常会使用递归方法打印属性结构、统计文件夹下文件个数、子文件夹个数以及文件大小,可以作为递归的应用练习。递归的写法,百度一搜一大堆,这里我使用对javabean方式封装了一下:package com.xzlf.io;import java.io.File;public class TestCount { private String dir;//文件夹 private...

2020-03-26 03:40:49 1055

原创 理解java容器底层原理--手动实现HashSet

理解java容器底层原理--手动实现HashSetHashSet的底层其实就是HashMap,换句话说HashSet就是简化版的HashMap。直接上代码:package com.xzlf.collection2;import java.util.HashMap;public class MyHashSet<E> { HashMap<E, Object> map; private static fina...

2020-03-24 02:28:52 1123

原创 理解java容器底层原理--手动实现HashMap

理解java容器底层原理--手动实现HashMapHashMap结构HashMap的底层是数组+链表,百度百科找了张图:先写个链表节点的类package com.xzlf.collection2;public class Node { int hash; Object key; Object value; Node next;}自定义一个HashMap,实现了put方法增加键值对,并解决了键重复的时候覆盖相应的节点p...

2020-03-23 02:30:28 1264

原创 理解java容器底层原理--手动实现LinkedList

理解java容器底层原理--手动实现LinkedListNodejava 中的 LIinkedList 的数据结构是链表,而链表中每一个元素是节点。我们先定义一下节点:package com.xzlf.collection;public class Node { Node previous; // 上一个节点 Node next; // 下一个节点 Object element; // 元素数据 public Node(Objec...

2020-03-22 23:58:13 1161

原创 理解java容器底层原理--手动实现ArrayList

理解java容器底层原理--手动实现ArrayList版本一:基础版本实现对象创建、元素添加、重新toString() 方法package com.xzlf.collection;/** * 自定义一个ArrayList,体会底层实现原理 * 初始版本 * @author xzlf * * @param <E> */public class MyArrayList<E> { private Ob...

2020-03-22 18:20:14 1205

原创 Java 集合框架总结--导图

Java 集合框架总结--导图

2020-03-22 16:42:09 1252

原创 java 容器(collection)--ArrayList 常用方法分析 源码分析

java 容器(collection)--ArrayList 常用方法分析 源码分析

2020-03-21 18:13:50 1250

原创 java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列

java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列什么是递归我先看下百度百科的解释:一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的。用递归过程定义的函数,称为递归函数,例如连加、连乘及阶乘等。凡是递归的函数,都是可计算的,即能行的 。古典递归函数,是一种定义在自然数集合上的函数,它的未知值往往要通过有限次运算回归到已知值来求出,故称为“递归”。它是古典递归函数论的研究对象 。简单的说,递归一定要有递归体头和递归体。...

2020-03-21 04:30:04 1384

原创 java中String StringBuilder StringBuffer比较和效率(性能)测试

java中String StringBuilder StringBuffer比较和效率(性能)测试string stringbuilder stringbuffer三者的区别从JDK源码看,String、StringBuilder、StringBuffer都是存放在char[] 数组字符串。简单看下三者的部分源码:String定义属性和构造方法:public final class String implements java.io.Serializable, Compara...

2020-03-19 03:25:09 2196

原创 Java 自动拆箱 装箱 包装类的缓存问题--结合源码分析

Java 自动拆箱 装箱 包装类的缓存问题--结合源码分析都0202 了 java 1.8 已经是主流自动装箱 、拆箱已经很普遍使用了,那么有时候是不是会遇到坑呢?我们先来看一段代码:public class TestWraperClass { public static void main(String[] args) { Integer a = 200; Integer b = 200; Integer c = 123; ...

2020-03-18 02:37:14 1525

原创 java算法-二分法查找实现

java算法-二分法查找实现什么是二分法查找首先,使用二分法查找的前提是:被查找的数组已排好序具体实现:假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为a[mid]>x,故应在前半段中查找。...

2020-03-16 03:39:49 5468

原创 Java 排序算法-冒泡排序及其优化

Java 排序算法-冒泡排序及其优化Java 排序算法-冒泡排序及其优化什么是冒泡排序基本写法优化后写法终极版本源码及测试什么是冒泡排序这里引用一下百度百科上的定义:冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经...

2020-03-15 01:11:06 1725

空空如也

空空如也

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

TA关注的人

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