Java
文章平均质量分 64
发光吖
善始者实繁 克终者盖寡.
展开
-
今夜我们一起学习Java手写Web服务器
我们一般都会使用Tomcat服务器作为我们项目部署的容器,甚至SpringBoot项目的web-stater内嵌了tomcat服务器来方便我们项目的部署。这一次我们就用使用Java从零开始编写一个类似tomcat的服务器吧。首先,它基于Http协议,一个请求—响应模型。浏览器从地址栏输入协议名、IP、端口号、请求的URI,然后该IP上对应端口号的那台服务器就会接收到请求,拿到请求信息,实际上就是一个字符串,类似于:GET /login?name=tom HTTP/1.1Host: localhos原创 2021-08-01 20:01:25 · 480 阅读 · 0 评论 -
Java对象 转 JSON 字符串
本案例所有代码均为原创,使用Java手写,没有借鉴其他类似工具库和网上论坛博客,也许没有经过充分测试,可能出现未知bug,因此不建议拿到正式的项目里使用。Java对象就像一个文件夹一样,没有办法知道其深度,所以采用了递归。性能方面没有测试,个人认为没有特别耗费性能的地方,除非你的对象包含很多层级。它可以支持null,字符串,数字、日期、集合等多种类型,包括以上类型的多层嵌套,都没有问题。源码不多,如下:import java.lang.reflect.Field;import java.lang原创 2021-07-29 18:32:45 · 5846 阅读 · 0 评论 -
SpringMVC框架复习总结
在整个web应用的MVC分层开发中,SpringMVC是对于控制层Controller的优化。控制器的作用在于数据录入,接收数据,调用业务逻辑层,把数据传到业务逻辑层,业务逻辑层再根据当前的请求,到数据库中操作相应数据,再依次回到业务逻辑层,控制层,完成最终结果的渲染。它并不参与具体业务的处理,它是控制别人干活的。控制层的功能:1. 接收并封装数据,把数据交给业务逻辑层2. 调用业务逻辑层实现功能,结果又返回控制器3. 根据结果跳转(请求转发、重定向)sp原创 2020-05-04 16:30:37 · 773 阅读 · 0 评论 -
彻底解决Idea中使用tomcat出现的各种中文乱码问题
网上有很多解决方案,诸如:https://blog.csdn.net/nan_cheung/article/details/79337273https://blog.csdn.net/lk1822791193/article/details/88317140但是亲测不是很有效。要么控制台乱码解决了,但是普通的日志,抛出异常的信息,或者calalina日志等等,都会乱码!!一招解决:首先保证你的Idea中整体环境是UTF-8的,我们平常做项目一般都是UTF-8的大环境Idea中开发环境原创 2020-10-27 15:44:24 · 1002 阅读 · 2 评论 -
将一个数组用单向链表进行穿链
单向链表-循环穿链链表的是这样的一种简单实现:class ListNode { int val; ListNode next; ListNode() { } ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; }}题目要求原创 2020-10-29 13:14:21 · 245 阅读 · 0 评论 -
优化并抽取Servlet
优化并抽取Servlet如果每实现一个功能就写一个Servlet,代码难免会显得有些冗余,如果可以稍加封装,代码的优雅性会大大提高。用模块化的思想,用户模块写一个Servlet,商品模块写一个Servlet,管理员模块写一个Servlet,这样一个项目中Servlet的个数会大大减少,同时也利于项目的维护。首先写一个BaseServlet,它继承HttpServlet,重写它的service(HttpServletRequest req, HttpServletResponse resp)方法,获取每原创 2020-10-06 19:21:29 · 201 阅读 · 0 评论 -
Java实现简单聊天室的小Demo
Java实现简单聊天室的小DemoServer端:import java.io.*;import java.net.ServerSocket;import java.net.Socket;public class TcpServer { public static void main(String[] args) { ServerSocket server = null; ThreadGroup myGroup = new ThreadGroup("讨论组原创 2020-09-17 19:18:20 · 396 阅读 · 0 评论 -
简单封装一个JDBCUtil小工具
简单封装一个JDBCUtil小工具实现原理:开发环境:实现的功能:使用方法:方法概览:实现原理:获取数据库连接,使用的是阿里巴巴的的druid数据库连接池(druid-1.1.10),因此个人使用的时候需要一个配置文件。本工具默认自动扫描classpath路径下的src文件夹中的db.properties文件。另外使用到了反射来把查询到的结果集数据注入Java对象中。但仅仅支持全字段查询的结果集封装。开发环境:JDK1.8、ojdbc8.jar、druid-1.1.10.jar实现的功能:获取原创 2020-09-11 19:02:06 · 401 阅读 · 0 评论 -
JDBC中关于Statement的Sql注入问题
sql注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些输入大都是sql语法里的一些组合,通过执行sql语句进而执行攻击者所要做的操作,其产生的主要原因在于应用程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。我们通过一个用户登录的小案例来大致了解sql注入的情况:(Oracle数据库环境)首先准备一张表t_user:create table t_user( name varchar2(10) primary key, password varchar2(10) not n原创 2020-09-11 18:40:43 · 1090 阅读 · 0 评论 -
深入学习Java中的注解(Annotation)
Java中的注解(Annotation)注解和注释有啥区别呢?初学注解1.注解的写法2.注解放置在哪里3.注解的作用4.Java中有一些人家写好的注解供我们使用5.注解中可以携带信息,也可以不携带自定义一个注解类型元注解自己使用自己描述的注解:单词Annotation可翻译为:注释、注解。单词Comment可翻译为:评论、议论、解释。在Java当中,Comment充当注释的含义,Annotation充当注解的含义。注解和注释有啥区别呢?Java中有单行注释、多行注释、文档注释。注释Commen原创 2020-08-20 14:55:41 · 757 阅读 · 0 评论 -
假设有3个车位可以停车,写一个程序模拟多个用户开车离开、停车入库的效果
利用到Java多线程的知识,下面是我们实现代码:import java.util.ArrayList;import java.util.Iterator;import java.util.List;/** * 假设有3个车位可以停车,写一个程序模拟多个用户开车离开、停车入库的效果。 * * @author qiaoao */public class Demo { public static void main(String[] args) { Garage cheku = new原创 2020-08-19 19:18:36 · 822 阅读 · 1 评论 -
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
这相当于一个词频统计问题,操作的肯定是纯文本文件,那么我们肯定是首选字符文件输入流(FileReader)来读取了。思路也很简单,假设文件中有这样一串文本内容:```ahello world 中国 java hel lo 中国 hello```我们查找单词`hello`在其中出现的次数,按照我的逻辑,我认为hello出现了2次的,ahello也算。利用程序如何做呢?首先,要查找的字符串是'hello',它的长度为5,那么我们就创建一个长度为5的字符数组,每次读取5个字符,把读取出来的原创 2020-08-19 19:06:25 · 2670 阅读 · 0 评论 -
Java反射基础(reflect)
Java中的反射,它算是Java当中非常底层的一个技术。平时我们我们用得不多,实际上它也的确非常复杂同时也难以理解,但是涉及到底层的东西Java都给我们封装好了,我们直接拿来调用即可,所以我们操作起来就很简单,这也是Java封装性的一个体现。反射是java中提供的一种机制,它允许我们在程序运行的时候,动态获取一个类中的基本信息,并且可以调用类中的属性、方法、构造器。我们以往遵循的都是面向对象的编程思想,现实生活中,先存在了很多对象,它们有相同的特征,相同的行为,我们就把它们归为一类,原创 2020-08-12 19:58:36 · 463 阅读 · 0 评论 -
Java细枝末节:运算符优先级表
Document 优先级 运算符 结合性 1 ()、[]、{} ...原创 2020-08-11 17:11:24 · 348 阅读 · 0 评论 -
Java细枝末节:方法重写与方法重载区别对照表
Document 方法重写(Override) 方法重载(Overload) 1.类 产生两个继承关系的类,子类重写父类的方法 同一个类中的一组方法 2.权限 子类权限修饰符可...原创 2020-08-11 16:27:32 · 122 阅读 · 0 评论 -
简单实现LinkedList
package com.briup.day15.mylist;public class MyLinkedList { private class Node { // 存放元素的值 private Object data; // 存放上一个节点 private Node prev; // 存放下一个节点 private Node next; public Node(Node prev,Object data, Node next) { this.prev = prev;原创 2020-08-08 12:01:23 · 148 阅读 · 0 评论 -
简单实现ArrayList
package com.briup.day14.mylist;public interface MyList { //在指定位置添加对象 public void add(int index,Object obj); //在数据结构最后位置添加对象 public void add(Object obj); //删除指定位置上的对象 public Object remove(int index); //修改指定位置上的数据 public void set(int index,Object o原创 2020-08-08 12:00:04 · 195 阅读 · 0 评论 -
利用链表简单实现队列(Queue)
package com.briup.day13.que5;public class Queue { private Node first;//头节点 private Node last;//尾节点 private int size = 0;//有效元素的个数 //将指定元素插入到此队列中 public void add(int element) { //获取尾节点对象,保存原来的尾节点到一个变量中,待会得用 Node lNode = last; //把当前数据包装成一个新的node原创 2020-08-08 11:55:59 · 399 阅读 · 0 评论 -
利用数组简单模拟栈(Stack)
package com.briup.day13.que4;public class Stack { private int[] elementData; private int size = 0;//可用元素的数量 public Stack() { this(10); } public Stack(int capacity) { elementData = new int[capacity]; } //弹栈 取数据 public int pop() { if(size<原创 2020-08-08 11:54:41 · 240 阅读 · 0 评论 -
经典Java算法题:原数组 与 稀疏数组相互转化
经典Java算法题:原数组 与 稀疏数组相互转化题目:实现测试题目:例如:稀疏数组的第一行,表示原数组有11行,11列,共有3个有效元素。稀疏数组的其他行,第一个数字表示有效元素的行号(从0开始),第二个数字表示有效元素的列号(从0开始),第三个数组表示有效元素的值。实现package com.briup.day10;import java.util.ArrayList;import javax.swing.plaf.basic.BasicInternalFrameTitlePane.原创 2020-08-02 11:29:19 · 248 阅读 · 0 评论 -
Java利用多线程复制文件
Java利用多线程复制文件前言RandomAccessFile代码测试前言复制一个文件,是学习IO流时最基本的操作。你可以使用字节型文件流,也可以使用高级缓冲流。但是,它们都是单线程的。如果需要复制一个大型文件,单线程的复制一般而言是不能够充分发挥CPU以及内存的性能。这时候就需要利用多线程来复制文件。多线程的读:我们很自然地想到,利用FileInputStream类的skip()方法,可以跳着读,这就对多线程比较友好,启动多个线程,第一个线程读一部分,第二个线程跳过一部分字节再读,这没有问题。原创 2020-08-02 10:57:53 · 1946 阅读 · 0 评论 -
Java多线程案例:模拟12306火车站售票系统
Java多线程案例:模拟12306火车站售票系统该系统一共涉及到3个类:车票(Ticket)12306系统(System12306)售票窗口(Window)车票类,涉及三个属性:起始站终点站票价public class Ticket { //起始站 private String startStation; //终点站 private String destination; /**POJO对象,它里面的基本类型最好使用包装类 * 因为原创 2020-08-01 19:44:18 · 4731 阅读 · 0 评论 -
理解Java多线程
理解Java多线程什么是线程?什么是进程?什么又是程序呢?程序可以理解为是一组静态的代码进程正在进行的程序 静态的代码 运行起来线程正在执行程序中的小单元Java当中我们主要研究的是线程,因为进程是线程组合起来的,而进程就那么一个,那么在这一个进程中,有很多小的线程在并发地执行,这些并发执行的线程是我们研究的重点。我们可以这样理解:现在班级需要进行一次大扫除活动扫除需要分配任务,任务写在纸上,列一张清单 —>程序一声令下(start),开始扫除(run)每个同学都各原创 2020-08-01 19:28:43 · 155 阅读 · 0 评论 -
经典算法题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号。
写在前面题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号。例如;如果10个人 留下的是4号这里我们使用数组来实现它。数组初始化值从1开始,如果有10个人,那么数组中存储的值就是[1-10]每次删除一个元素,我们就把该元素的值标记为-1(这里我们统一约定,值不为-1的元素就是可用元素)10个人的话,删除到最后,就只剩下一个可用元素,它的值为4实现的思路:写代码前我们都要先做一番思考,搞清楚实现它的流程,如果在没有任何原创 2020-07-31 23:13:27 · 21327 阅读 · 3 评论 -
经典Java题目:输入一个数字,输出它的大写汉字(阿拉伯数字转汉字)
写在前面无意间看到一个Java题目,觉得挺有意思,就拿出来和大家分享:输入一个数字,输出它的大写汉字。就像这样:这算是一个有趣的题目了。但是早前我Java基础特别差就没能实现它。当然,这次我也是在以前写的垃圾代码上做出的修改。代码整体看起来会很乱。甚至有一些bug。而且仅仅只能够转化整数,不能操作小数。不过它也算是能够适应大多数情况的数字大小写转换了。代码如下:package demo;import java.util.Scanner;/** * 计数单位应包含整数部分原创 2020-07-31 22:29:28 · 4050 阅读 · 0 评论 -
经典排序算法:冒泡排序、选择排序、插入排序
经典排序冒泡排序选择排序插入排序冒泡排序它的基本思路是:每一次遍历数组中两两相邻的元素,把最大的那个元素“沉底”,下一次遍历的时候,只遍历第一个元素到倒数第二个元素,依次类推。经过多次轮询,最终使得数组有序。待排序的数据:{8,5,2,7,4,9,1,6,3}每一次轮询的结果:[5, 2, 7, 4, 8, 1, 6, 3, 9][2, 5, 4, 7, 1, 6, 3, 8, 9][2, 4, 5, 1, 6, 3, 7, 8, 9][2, 4, 1, 5, 3, 6, 7, 8, 9]原创 2020-07-31 22:05:38 · 204 阅读 · 0 评论 -
Java使用mail.jar发送邮件
Java实现邮件发送首先需要下载一个mail.jar包(Oracle官网、百度搜索mail.jar、官网下载)https://www.oracle.com/technetwork/java/index-138643.html对我们用户而言,发送邮件需要3步:登录写邮件发邮件然而对于程序来说,它不需要登录的。登录就要自己控制网页,就像selenium那种自动化测试工具一样,模拟用户的一系列点击操作。那就把程序搞复杂了。在代码执行层面考虑,当然是越简单越高效最好。程序想要发送邮件,不需要原创 2020-07-24 22:42:05 · 2480 阅读 · 3 评论 -
Lambda表达式(为简化代码而生)
什么是Lambda表达式呢?有人把它称之为“闭包的替代品”,也有人把它称之为**匿名函数**,它究竟是何方神圣,它在Java中到底充当了什么样的角色?一起关注今晚8点“程序员有话说”,我们不见不散!哈哈,开个玩笑。它本质上就是一个代码块。那这个Lambda表达式它具体表现为什么样的结构呢?它的基础语法其实就是引入了一个操作符:(->),因此也有人把它称之为箭头函数。这个箭头把一个代码分为左侧和右侧两部分,它的左侧就代表这个表达式的参数列表,而右侧就代表这个表达式的功能,也叫Lambda体原创 2020-07-24 16:36:19 · 831 阅读 · 1 评论 -
Java实现简单的类似QQ聊天工具
Java实现简单的类似QQ聊天工具所使用到的知识点:java socket编程之TCP协议java Swing简单的java多线程服务器端实现:package tcp_server;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.Iterator;import原创 2020-07-20 20:10:05 · 1625 阅读 · 2 评论 -
关于一些Java的正则表达式
正则表达式(规则表达式)英文:Regular Expression简写:reg ex / reg exp正则表达式的由来:regex的鼻祖:人类神经系统工程研究他用很小的单元来描述神经网络。1951年:Stephen Kleene数学科学家,在最早的神经学系统研究的基础上,研究出了一个数学模型。它被慢慢称之为正则集代数。后来正则集代数就慢慢应用到了计算机领域,称之为正则表达式。正则表达式是一种带有规律/格式的表达式。与语言无关。正则表达式通常的作用:匹配格式,格式校验拆分、替换原创 2020-07-20 19:35:29 · 147 阅读 · 0 评论 -
Java实现“飞机大战”小游戏
实现的功能:3种类型的敌机,分别对应不同的生命值战机生命值在右上角显示随着分数的增加,3种敌机依次出现运行效果:结语虽然看起来功能好简单呀,但是实现起来还是比较麻烦的。第一次完完整整地写飞机大战,里面许多东西可能写的不好,但都是自己逐步摸索出来的。设计模式只用到了单例。总共用了25张图片,图片网上找的,少部分图片使用Axure、word、Photoshop加工的。为了把图片打入jar包做exe文件也耗费了许多时间。图片打入jar包需要给每一个图片的路径前加上:getClass(原创 2020-06-26 22:21:17 · 1650 阅读 · 2 评论 -
Java文件/文件夹 加密解密工具(Swing版)
前言这是一款自设计的文件加密工具,没有用到多线程和高级流,性能上还是和市面上的软件有很大差异。基本原理:Java利用字节型文件流进行文件的复制粘贴,文件加密与解密Java使用字节型文件流完成文件夹的复制(递归)并且增加了输入密码对文件进行加密的功能,如果密码输入不正确,解密后的文件是无法查看的。加密时对所有字节做了处理,因此它适用于普通文本文件的加密。使用到了递归,因此它也适用于文件夹的加密。样例代码 funBtn.addMouseListener(new MouseAdap原创 2020-05-31 13:12:26 · 2316 阅读 · 2 评论 -
使用 Java8 自带的javapackager 打包应用程序
以前使用过 exe4j 打包应用程序,打包成一个exe文件。文件很小,但要求必须在装有jre的电脑上运行。如果一个电脑上没有安装 jre,就必须在打包时附带一个jre。这样一来,不管你写的程序多么小,用户都不得不下载一个200MB左右的 jre。而且 jre还必须放置在exe文件的同级目录下。如果再多写一个程序,代码50KB,但用户还得下载200MB的文件。相当麻烦,特别冗余。这是通病,我找了很多教程,对于这部分只能这么干。如果客户希望只下载一个jre,不论jre放在哪,都可以运行你给他打包exe原创 2020-05-30 15:34:43 · 5090 阅读 · 1 评论 -
Java-Swing实现520表白神器
我们首先看一下实现的效果:这是打包后的exe文件执行的效果,但是在编辑器中运行的效果和exe文件运行的效果还是有点出入的。比如打包以后窗口生成的位置有所变化,字体有些许模糊了,视觉上来看按钮变大了,颜色也不鲜艳了。案例源码:package frame;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.FileInputStream;public class MyFrame ext原创 2020-05-23 21:59:34 · 2116 阅读 · 2 评论 -
Java实现装饰者模式(逐层刨析,详尽版)
java装饰者模式(Decorator)不用设计模式实现装饰模式逐步演变+思路我们先来看一个小案例:实现一个发放工资的财务系统。要求按照每个员工不同的级别和绩效来发放工资。模拟销售部发放工资的场景:每个销售人员,按照销售额、绩效来发放工资,销售额不超过5000,提成3%;销售额超过5000,在刚才基础上,增加1%,相当于4%;销售经理,基础提成+(如果超过5000后超额奖金)+团队销售总额的1%。不用设计模式实现public class User { private String n原创 2020-05-13 12:56:45 · 662 阅读 · 0 评论 -
有一只麻雀两棵树,每棵树每天长两片叶子
一个Java题目是这样的:有一只麻雀两棵树,每棵树每天长两片叶子麻雀前三天在孵化,不吃树叶第4,5,6天每天吃一片树叶第7,8,9,10天每天吃两片树叶第11,12,13,14天每天吃三片树叶之后每天吃五片树叶麻雀吃不够树叶会饿死,树被吃光叶子也会死要求写出让麻雀存活最久的程序我写的程序仅仅让麻雀存活了47天,当然这不是最好的设计,我觉得麻雀应该可以活的更久。这个题目思路还是很简单的:设想一种情景,假设麻雀要吃8片树叶,第一颗树有4片,第二棵树有5片,首先麻雀肯定不会饿死。为了让麻雀原创 2020-05-11 13:50:23 · 375 阅读 · 0 评论 -
Java打印万年历 两种实现方法
先看实现效果:其实最难的就是如何确定这个月份的第一天是星期几(即最开始打印的空白)。那么如何确定当前月份的第一天是星期几呢?首先,我们需要知道,1900年的1月1号是星期一。然后就好办了,比如我们要打印2020年5月的日历,先算出1900-01-01到2020-05-01的前一天一共有几天,然后让它模7,得出的余数是几,刚好就是星期几。普通实现如果是普通实现,不使用提供好的日期类,就...原创 2020-05-07 18:35:26 · 1415 阅读 · 0 评论 -
Mybatis框架复习总结
Mybatis框架复习总结基本操作小优化:#{}和${}的区别parameterType和resultType插入后返回主键idMysql使用uuid()函数实现主键总结:Mapper接口开发需要遵循以下规范:mybatis支持别名关于resultMap基本操作框架搭建步骤:导入jar包拷贝配置文件,根据所需修改根据对应数据库表写pojo类定义mapper接口中的方法实现mappe...原创 2020-04-28 16:45:23 · 402 阅读 · 0 评论 -
使用Java多线程简单模拟抢红包(单例、观察者)
使用到了单例模式和观察者模式,但是对于细节的处理没有做好,还是有许多bug需要处理,不能通过特别小的红包金额的拆分测试。最难的还是拆分红包的算法的设计吧。public class RedPacketSystem { private RedPacketSystem(){} ArrayList<User> users = new ArrayList<>();...原创 2020-04-25 15:12:09 · 742 阅读 · 0 评论 -
Java中float和double的精度损失
Java当中的float和double类型的主要设计目标是为了简单的科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。正式场合应该使用BigDecimal。我们来看看这个例子: float base = 0.0F; for (int i = 0;i<100...原创 2020-04-25 13:27:51 · 991 阅读 · 0 评论