
java
文章平均质量分 63
IABQL
记录自己学习的笔记,欢迎指正
展开
-
SimpleDateFormat线程不安全(再分享一篇代码优化的文章)
换句话说,可能会出现多个线程调用同一个Controller类的同一个方法,也就是会出现多个线程会同时调用time方法。但Serivce类的方法,往往是被Controller类调用的,而Controller类的接口方法,则会被tomcat。这样就可能会出现多个线程,同时修改同一个对象即:dateFormat,它的同一个成员变量即:Calendar值的情况。这样可能会出现,某个线程设置好了时间,又被其他的线程修改了,从而出现时间错误的情况。在java8之前,我们对时间的格式化处理,一般都是用的。...转载 2022-08-05 13:06:31 · 188 阅读 · 0 评论 -
设计模式之静态代理、动态代理
静态代理静态代理的好处:可以使目标对象的业务更加纯粹,不用去关注公共的业务。 在后续需要增加公共业务时,可以在代理对象中增加,而不对目标类进行修改。在项目中要尽量避免对原代码的修改,以免修改原代码后产生严重bug。缺点:一个目标类就会产生一个代理类,代码量会提高。下面直接看代码,房客租房需要找中介,中介再找房东的例子。租房行为接口://租房public interface Rent { void rent();}房东实现类 ://房东public原创 2022-03-17 12:05:26 · 227 阅读 · 0 评论 -
Cookie和Session的用法、区别
Cookie存放位置:Cookie是将数据存放在浏览器的缓存或硬盘上(如果不给cookie设置存活时间,那么cookie就被存放在缓存中,一旦浏览器关闭,cookie数据也将被清除;如果给cookie设置存活时间,那么cookie就被存放在硬盘中,当存活时间一到,数据就会被删除)。存储类型:只能存放String类型。存放数量:一个cookie对象只能存一个数据。工作过程:浏览器首次访问服务器,服务器将数据存放在cookie中发送给浏览器,存放在浏览器。下一次浏览器再次访问时会原创 2022-02-24 21:38:06 · 244 阅读 · 0 评论 -
使用DOM对XML文件进行修改操作(添加标签、删除标签、修改标签Text内容、保存XML)
目录1.整体代码2.添加标签方法3.删除标签方法对以下这个xml文件进行修改操作<?xml version="1.0" encoding="UTF-8" standalone="no"?><address> <person> <name>张三</name> <email>aaaaaa@163.com</email> </person>...原创 2021-11-24 01:18:49 · 1767 阅读 · 0 评论 -
如何使用DOM解析XML文件?
DOM模式解析XML,是把整个XML文档当成一个对象来处理,会先把整个文档读入到内存里。是基于树的结构,通常需要加载整文档和构造DOM树,然后才能开始工作。优点:允许应用程序对数据和结构做出更改。 访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。 整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能缺点:因为需要加载整个XML文档来构造层次结构,所以如果xml文件过大会消耗大量资源。 将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解原创 2021-11-23 21:49:58 · 2243 阅读 · 0 评论 -
CAS机制是什么?
首先我们需要了解为什么有CAS机制的存在?那我们就不得不先知道互斥同步和非阻塞同步。互斥同步互斥同步面临的主要问题是进行线程阻塞和唤醒带来的性能开销,因此这种同步也叫阻塞同步。互斥同步属于悲观的并发策略,其总是认为只要不做同步措施(加锁),就肯定会出现问题,无论共享数据是否真的会出现竞争,它都会加锁,将会导致用户态到内核态转换、维护锁计时器和检查是否有被阻塞的线程需要被唤醒等开销。非阻塞同步基于冲突检测的乐观并发策略,通俗的说就是不管风险,先进行操作。如果没有线程争用共享资源,那就直接操作成原创 2021-11-22 19:51:56 · 5397 阅读 · 2 评论 -
Volatile是什么?有什么用途?
概念volatile是Java中的关键字,用来修饰会被不同线程访问和修改的变量。volatile可以说是java虚拟机提供的最轻量级的同步机制。当一个变量被定义成volatile之后,它具备2个特性第一项是保证此变量对所有线程的可见性这里的可见性是指当一个线程修改了这个变量的值,新值对于其它线程来说是可以立即得知的,二普通变量并不能做到这一点,普通变量的值在线程间传递是均需要通过主内存来完成。比如,线程A修改一个普通变量的值,然后向主内存进行回写,另外一条线程B在线程A回写完成了之后再对主内原创 2021-11-19 20:54:45 · 1669 阅读 · 0 评论 -
HashMap底层存储原理、哈希冲突的产生
HashMap存储本质上是数组+链表+红黑树实现。数组的特点:查询快,插入删除慢链表的特点:查询慢,插入删除快哈希算法(也叫散列):就是把任意长度值(key)通过散列算法变换成固定长度的key(地址),通过这个地址进行访问的数据结构。看一个具体的实例:有以上这样一个长度为8的数组,现在我们要存储key=“张三”这样一个数据,假设key的hash值为423。用数组的长度对hash值进行取模运算,即423%8=7。得到7就是数组的索引,我们就将key存放在索引为7的位置。哈希..原创 2021-11-18 20:02:24 · 918 阅读 · 0 评论 -
Error(错误)、Exception(异常)之间区别
Error(错误): 是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。 例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时, Java虚拟机(JVM)一般会选择线程终止Exception(异常)分两大类:运行时异常和非运行时异常(编译异常)。程序中应当...原创 2021-11-15 12:53:17 · 6533 阅读 · 0 评论 -
二叉树遍历:先序、中序、后序
先序(根左右):ABCDEF中序(左根右):CBDAEF后序(左右根):CDBFEA先序先输出节点的值;再看是否有左节点,有则将左节点值输出(直到没有左节点为止);再看是否有右节点,有则将右节点值输出(直到没有右节点为止)用递归实现先序public class MyTree { private Node first;//头(根)节点 public void sort(){ first.xianxu(); }}class Node {...原创 2021-11-14 15:21:09 · 1276 阅读 · 0 评论 -
String作为参数传递到底是值传递还是引用传递?
我们首先看一下下面这样一段代码,它的输出结果是什么?public static void main(String[] args) { String s=new String("张三"); change(s); System.out.println(s); }public static void change(String s){ s="李四"; }我一开始一看,String是引用类型,引用类型是引用传递。那么结果应.原创 2021-11-06 22:18:08 · 3188 阅读 · 3 评论 -
StringTable字符串的拼接,intern()工作原理
1.编译期的优化public class Test { public static void main(String[] args){ String s1="a"; String s2="b"; String s3="ab"; String s4="a"+"b";//在编译时就能确认为"ab" String s5=s1+s2;//new StringBuffer().append("a").append("b").原创 2021-11-03 12:47:45 · 154 阅读 · 0 评论 -
java的类加载顺序
在创建子类对象时,类的加载顺序1.父类静态变量显式赋值、父类静态代码块。(静态之间按定义先后顺序)2.子类静态变量显式赋值、子类静态代码块。(按定义顺序)3.父类构造函数。4.父类非静态变量显式赋值(父类成员变量)、父类非静态代码块。(非静态之间按定义顺序)5.子类构造函数。6.子类非静态变量(子类成员变量)、子类非静态代码块。(按定义顺序)。总结:1.静态总是优先于非静态被加载,所以静态方法无法访问非静态变量、方法。非静态可以访问静态。2.在创建子类对象时,会先调用父类构造方法,在调.原创 2021-10-29 15:13:43 · 489 阅读 · 1 评论 -
Math类的常用方法
Math类是final类型,因此不可以被继承。 Math类的构造方法是private的,所以也不能被实例化。Math类中的方法都是static的,所以可以直接用类调用方法,如Math.abs();Math类中还有2个常用静态常量E(自然对数),PI(圆周率)Math类中定义的部分方法:public final class Math { public static final double PI = 3.14159265358979323846; private Math()原创 2021-10-20 17:49:46 · 410 阅读 · 1 评论 -
java中8种基本数据类型
类型 位数(bit) 范围 默认取值 byte 8 -2^7~2^7-1 0 short 16 2^15~2^15-1 0 int 32 2^31~2^31-1 0 long 64 2^63~2^63-1 0 float 32 约-3.4E+38~3.4E+38 0.0 double 64 约-1.7E+308~1.7E+308 0.0 char 1原创 2021-10-19 20:23:15 · 106 阅读 · 0 评论 -
float为什么要比Long的取值范围大
要知道为什么占32bit的float类型却比占64bit的Long类型的取值范围还要大,就要先了解float的存储结构。float的存储结构符号位(1bit) 指数(8bit) 尾数(23bit) 0为正 1为负 指数也有正负 浮点数在计算机中是以科学记数法存储的。1.符号位:浮点数的正负2.指数位就代表了小数点移动的位数,决定了其范围3.指数的正负代表了小数点左右移动方向,正:向右移动;负:向左移动。4.尾数:浮点数的精度.原创 2021-10-18 20:07:23 · 1694 阅读 · 0 评论