
简介
该用户还未填写简介
擅长的技术栈
可提供的服务
暂无可提供的服务
从Servlet3.0开始就可以不需要web.xml了,而Spring MVC中也很好的支持了这一个特性。简单使用gradle配置description = "Spring MVC Demo"apply plugin: "groovy"apply plugin: "kotlin"dependencies {compile(project(":spring-webmvc"))compileOnly
布隆过滤器如果要经常判断某个元素是否存在,你会怎么做?很容易想到使用哈希表(HashSet、HashMap),将元素作为key去查找。时间复杂度为O(1),但是空间利用率不高,需要占用比较多的内存资源。如果需要编写一个网络爬虫去爬10亿个网站数据,为了避免爬到重复的网站,如何判断某个网站是否爬过?很显然,HashSet、HashMap并不是非常好的选择。是否存在时间复杂度低、占用内存较少的方案?就
选择排序选择排序是一种简单直观的排序算法,无论什么数据都是O(n^2)的时间复杂度。所以用到它的时候,数据规模越小越好。算法步骤从数组中找出最小的那个元素,然后与最开始的元素交换位置忽略第一步中找到的最小元素,重复执行步骤1动图演示算法实现for (int i = 0; i < array.length - 1; i++) {int minIndex = i; // 保存最小元素索引for
多级代理中获取客户端真实IP日志的格式nginx中常用日志格式配置如下:log_formatmain'$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_
linux线程同步的方法下面是一个线程不安全的例子:#include<stdio.h>#include<pthread.h>int ticket_num=10000000;void *sell_ticket(void *arg) {while(ticket_num>0) {ticket_num--;}}int main() {pthread_t t1,t2,t3;pt
socket通信之listen函数listen函数原型如下:#include <sys/types.h>#include <sys/socket.h>int listen(int sockfd, int backlog);第一个参数sockfd为创建socket返回的文件描述符。第二个参数backlog为建立好连接处于ESTABLISHED状态的队列的长度。backlog的
思考假如需要设计一种数据结构,用来存放整数,要求提供3个接口:添加元素获取最大值删除最大值如果使用动态数组、双向链表和二叉树实现这个数据结构对应的时间复杂度如下表所示:添加元素获取最大值删除最大值说明动态数组\双向链表O(1)O(n)O(n)有序动态数组\双向链表O(n)O(1)O(1)全排序有点浪费平衡二叉搜索树O(logn)O(logn)O(logn)杀鸡焉用牛刀有没有更优的数据结构?使用堆,
ThreadLocal的内存泄漏内存泄漏:是指本应该被GC回收的无用对象没有被回收,导致内存空间的浪费,当内存泄露严重时会导致内存溢出。Java内存泄露的根本原因是:长生命周期的对象持有短生命周期对象的引用,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被GC回收。内存溢出:就是我们常说的OOM(OutOfMemoryError)异常,简单理解就是内存不够了,通常发生
linux下的socket通信在linux下,无论多么复杂的服务器或客户端程序,无论什么编程语言实现的,其底层都离不开linux内核提供的系统调用(也就十多个函数),其网络通信的基本流程一定如下所述:对于服务器,其通信流程一般有如下步骤:调用socket函数创建socket,这一步会创建一个文件描述符FD。调用bind函数将socket(也就是FD)绑定到某个ip和端口的二元组上。调用listen
内存分配与回收策略在jvm中,垃圾回收的主要区域为堆,一般情况下,对象是分配在堆中,那么对象在堆上是怎样分配的呢,对象又是怎样被回收的?分代模型现在的垃圾回收器都会在物理上或者逻辑上把对象进行划分为两个区域,一类死的快的对象所占的区域,叫作年轻代(Young generation)。把其他活的长的对象所占的区域,叫作老年代(Old generation)。年轻代由于对象的生命周期比较短,所以采用复