java基础
文章平均质量分 86
帅帅-yss
这个作者很懒,什么都没留下…
展开
-
HTTP、时间戳和重定向理解
时间戳在很多互联网公司,都会在URL后加一个时间戳,这是为了防止缓存,正常来说,加上时间戳后,这个请求会往服务器上发送一次请求。当http协议为304的时候,代表是从本地缓存中读取的数据。所以,在正常的互联网公司,发布版本的时候,js、css后都会加上一个时间戳。重定向实现原理在我们重定向的时候,当我们访问OtherServlet这个请求,请求到服务器,服务器返回,响应头状态码为302,...原创 2019-12-29 15:42:45 · 2131 阅读 · 0 评论 -
使用Fileter防止XSS攻击
什么是XSS攻击:XSS攻击使用Javascript脚本注入进行攻击例如在表单中注入: fromToXss.jsp:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4...原创 2019-12-08 15:18:47 · 276 阅读 · 0 评论 -
表单重复提交解决方案
什么是tokentoken其实就是一个令牌,具有随机性,类似于sessionId。在对接一些第三方平台的时候,为了能够保证数据安全性,通常会使用一些令牌进行交互。from.jsp:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE...原创 2019-11-02 10:40:53 · 323 阅读 · 0 评论 -
cookie和session-自定义缓存类
缓存实体类:public class Cache {public Cache(String key, Object value, Long timeOut) { super(); this.key = key; this.value = value; this.timeOut = timeOut; }public Cache() {} /** * key */...原创 2019-11-02 10:22:17 · 104 阅读 · 0 评论 -
cookie和session
cookie和session都是用来跟踪浏览器用户身份的会话方式。区别:1、保持状态:cookie保存在浏览器端,session保存在服务器端。2、使用方式:(1)cookie机制:如果不在浏览器中设置过期时间,cookie被保存在内存中,生命周期随浏览器的关闭而结束,这种cookie简称会话cookie。如果在浏览器中设置了cookie的过期时间,cookie被保存在硬盘中,关闭浏览器后...原创 2019-10-20 09:50:08 · 190 阅读 · 0 评论 -
多线程基础—2—多线程之间实现同步
为什么有线程安全问题?当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。线程安全解决办法问:如何解决多线程之间线程安全问题?答:使用多线程之间同步synchronized或使用锁(lock)。问:为什么使用线程同步或使用锁能解决线程安全问题呢?答:将可能会发生数据冲突问题(线程不安全问题),只能让...原创 2019-02-26 13:03:34 · 309 阅读 · 0 评论 -
同步容器类——2——HashTable和HashMap
HashMap和HashTable都是基于哈希表来实现键值映射的工具类。讨论他们的不同,我们首先来看一下他们暴露在外的API有什么不同。下面两张图,我画出了HashMap和HashTable的类继承体系,并列出了这两个类的可供外部调用的公开方法。从图中可以看出,两个类的继承体系有些不同。虽然都实现了Map、Cloneable、Serializable三个接口。但是HashMap继承自抽象类...原创 2019-03-01 21:08:17 · 123 阅读 · 0 评论 -
多线程基础—1
线程与进程区别每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。总结:进程是所有线程的集合,每一个线程是进程中的一条执行路径。多线程创建方式第一种:继承Thread类 重写run...原创 2019-02-26 09:17:22 · 110 阅读 · 0 评论 -
同步容器类——1——ArrayList和vector
区别与联系1.Vector是线程安全的集合类,ArrayList并不是线程安全的类。Vector类对集合的元素操作时都加了synchronized,保证线程安全。2.Vector与ArrayList本质上都是一个Object[] 数组,ArrayList提供了size属性,Vector提供了elementCount属性,他们的作用是记录集合内有效元素的个数。与我们平常调用的arrayList....原创 2019-03-01 20:08:57 · 349 阅读 · 0 评论 -
深入剖析ThreadLocal
对ThreadLocal的理解ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。这句话从字面上看起来很容易理解,但是真正理解并不是那么容易。我们还是先来看一个例子:class ConnectionManager { ...原创 2019-02-26 13:29:50 · 138 阅读 · 0 评论 -
深入解析volatile
一、Java内存模型想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的。Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来)。线程对变量的所有操作(读取,赋值)都必须在工作内存中进行。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通...原创 2019-02-26 15:08:22 · 149 阅读 · 0 评论 -
多线程之间通讯
多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。需求:第一个线程写入(input)用户,另一个线程取读取(out)用户.实现读一个,写一个操作。共享资源源实体类class Res { public String userSex; public String userName;}输入线程资源class IntThrad extends Thread { pr...原创 2019-02-26 21:19:46 · 124 阅读 · 0 评论 -
hashTabele、hashMap和conCurrentHashMap
1.HashMapHashMap 是最简单的,一来我们非常熟悉,二来就是它不支持并发操作,所以源码也非常简单。首先,我们用下面这张图来介绍 HashMap 的结构。大方向上,HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。上图中,每个绿色的实体是嵌套类 Entry 的实例,Entry 包含四个属性:key, value, hash 值和用于单向链表的 next。cap...原创 2019-03-03 08:52:15 · 154 阅读 · 0 评论 -
并发容器—3
synchronizedMapCollections.synchronized*(m) 将线程不安全额集合变为线程安全集合CountDownLatchCountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。publi...原创 2019-03-03 09:15:19 · 120 阅读 · 0 评论 -
线程池和锁的深度化
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定...原创 2019-03-03 10:20:57 · 226 阅读 · 0 评论 -
spring单例和多例——如何在单例中调用多例对象
spring生成对象默认是单例的。通过scope属性可以更改为多例。<bean id="user" class="modle.User" scope="prototype"> </bean>现在有这么一种情况.User类调用一个service, 这个service又调用一个tool。有时我们希望User是多例的,service是单例的,而tool又是多例的。...原创 2019-03-11 15:27:38 · 2361 阅读 · 0 评论 -
Java中wait和sleep方法的区别
1、两者的区别1.这两个方法来自不同的类分别是Thread和Object2.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)4.sleep必须捕获异常,而wait,notify和notifyA...原创 2019-03-01 10:48:13 · 4566 阅读 · 1 评论 -
synchronized和lock
一.synchronized的缺陷如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况:1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有;2)线程执行发生异常,此时JVM会让线程自动释放锁。那么如果这个获取锁的线程由于要等待IO或者其他原因(比如调用slee...原创 2019-03-01 10:34:21 · 127 阅读 · 0 评论 -
java基础——2——集合概述
Java的集合类主要由两个接口派生而来:Collection和Map。Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。 Set集合 Set集合是Collection集合的子类,与Collection基本上完全一样,它没有提供额外的方法,只是在行为上略有不同。 Set集合不允许包含相同的元素,如果把两个相同的元素加入到同一个Set集合中...原创 2018-08-29 13:31:40 · 118 阅读 · 0 评论 -
java基础——3——泛型+异常+IO
在Java发布的JDK1.5版本中增加了泛型支持,所谓的泛型就是为了让集合在很大程度上记住元素的数据类型。在没有使用泛型之前,一旦把对象存放进Java集合中,集合只会将元素作为Object对象进行处理。当从集合中取出对象时就需要进行强制类型转换。如果转换错误,则将会引起ClassCastException异常(类型转换异常)。 增加泛型支持后的集合,则可以让集合记住元素的类型,并在编译时...原创 2018-08-29 14:36:45 · 125 阅读 · 0 评论 -
java常见的面试笔试题目(集合——1)
1.为何Map接口不继承Collection接口? 尽管Map接口和它的实现也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map继承Collection毫无意义,反之亦然。 如果Map继承Collection接口,那么元素去哪儿?Map包含key-value对,它提供抽取key或value列表集合的方法,但是它不适合“一组对象”规范。 2.什么是迭代器(Iterator)...原创 2018-09-11 11:30:03 · 169 阅读 · 0 评论 -
ArrayList的实现原理
1. ArrayList概述: ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自...原创 2018-09-11 12:32:30 · 315 阅读 · 0 评论 -
HashMap的实现原理
1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 2. HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,Hash...原创 2018-09-11 13:50:01 · 91 阅读 · 0 评论 -
HashSet的实现原理
HashSet概述:HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。HashSet的实现: 对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调...原创 2018-09-11 14:10:51 · 87 阅读 · 0 评论 -
LinkedHashMap的实现原理
1. LinkedHashMap概述: LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序...原创 2018-09-11 14:26:47 · 332 阅读 · 0 评论 -
java内存模型(JMM)
我们知道,Java 程序是需要运行在 Java 虚拟机上面的,Java 内存模型(Java Memory Model,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了 Java 程序在各种平台下对内存的访问都能保证效果一致的机制及规范。Java 内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存。线程的工作内存中保存了该线程中用到的变量的主内存...原创 2019-02-23 14:18:53 · 84 阅读 · 0 评论 -
JVM-类加载机制
看到这个题目,很多人会觉得我写我的java代码,至于类,JVM爱怎么加载就怎么加载,博主有很长一段时间也是这么认为的。随着编程经验的日积月累,越来越感觉到了解虚拟机相关要领的重要性。闲话不多说,老规矩,先来一段代码吊吊胃口。public class SSClass{ static { System.out.println("SSClass"); }} ...原创 2019-02-23 15:23:17 · 72 阅读 · 0 评论 -
JVM中对象的探秘
下面我们来详细的了解一下 HotSpot 虚拟机在 Java 堆中对象分配、布局和访问的全过程。对象的创建下图便是 Java 对象的创建过程,我建议最好是能默写出来,并且要掌握每一步在做什么类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的...原创 2019-02-23 16:44:53 · 125 阅读 · 0 评论 -
触发JVM进行Full GC的情况及应对策略
参考 https://blog.csdn.net/chenleixing/article/details/46706039/堆内存划分为 Eden、Survivor 和 Tenured/Old 空间,如下图所示从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为Major GC,而Full GC是对整个堆来说的,在最近几个版本的JDK里...原创 2019-02-23 18:29:41 · 99 阅读 · 0 评论 -
JVM的类加载器
参考: https://blog.csdn.net/javazejian/article/details/73413292/类加载器的任务是根据一个类的全限定名来读取此类的二进制字节流到JVM中,然后转换为一个与目标类对应的java.lang.Class对象实例,在虚拟机提供了3种类加载器,引导(Bootstrap)类加载器、扩展(Extension)类加载器、系统(System)类加载器(也称...转载 2019-02-23 22:02:18 · 163 阅读 · 0 评论 -
JVM内存分配策略
Java技术体系中所提倡的自动内存管理可以归结于两个部分:给对象分配内存以及回收分配给对象的内存。我们都知道,Java对象分配,都是在Java堆上进行分配的,虽然存在JIT编译后被拆分为标量类型并简介地在栈上进行分配。如果采用分代算法,那么新生的对象是分配在新生代的Eden区上的。如果启动了本地线程分配缓冲,将按线程优先在TLAB上进行分配。事实上,Java的分配规则不是百分百固定的,其取决于...原创 2019-02-24 10:55:03 · 91 阅读 · 0 评论 -
JVM垃圾回收策略和算法
哪些内存需要回收?猿们都知道JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭,因此这几个区域的内存分配和回收都具备确定性,就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而Java堆区和方法区则不一样。这部分内存的分配和回收是动态的,正是垃圾收集器所需关注的部分。垃圾...原创 2019-02-24 14:41:25 · 193 阅读 · 0 评论 -
JDK 源码阅读 Reference
Java最初只有普通的强引用,只有对象存在引用,则对象就不会被回收,即使内存不足,也是如此,JVM会爆出OOME,也不会去回收存在引用的对象。如果只提供强引用,我们就很难写出“这个对象不是很重要,如果内存不足GC回收掉也是可以的”这种语义的代码。Java在1.2版本中完善了引用体系,提供了4中引用类型:强引用,软引用,弱引用,虚引用。使用这些引用类型,我们不但可以控制垃圾回收器对对象的回收策略,...原创 2019-02-24 18:59:45 · 124 阅读 · 0 评论 -
java基础——1——数据类型
Java语言支持的数据类型分为两类:基本数据类型和引用类型 1、基本数据类型共8种,分为布尔类型(boolean)和数值类型,数值类型又分为整数类型和浮点类型。整数类型包括byte、short、int、long、char,浮点类型包括float(单精度浮点)和double(双精度浮点)。 2、引用类型包括类、接口和数组类型,还有一种特殊null类型。引用数据类型就是对一个对象的...原创 2018-08-27 19:38:27 · 159 阅读 · 0 评论