java的深拷贝和浅拷贝
java的深拷贝和浅拷贝我们知道拷贝就是生成一个新对象和原对象一模一样,但是拷贝也是分方式和程度的,我们来看一下什么是浅拷贝什么是深拷贝
浅拷贝在Java中,java.lang.Object类的clone()方法用于克隆(浅拷贝,属性的指向是相同的)。该方法创建一个对象的副本,并通过逐字段分配在其上对其进行调用并返回该对象的引用。要实现浅拷贝需要实现Cloneable接口,该接口里面没有任何方法,它指向的是java.lang.Object类的clone()
1protected native Object clone() throws CloneNotSupportedException;
它是一个native方法,由C/C++实现我们看看例子,理解下它为啥叫浅拷贝首先有一个字典对象类,它实现了序列化()和克隆的接口
123456789101112131415161718@Dataclass Dictionary implements Serializable { private String name; private List<String> ...
tomcat中post请求限制长度
问题分析和解决:有天测试的时候有一个接口,是同一份代码在预发环境上跑的很正常,但是在测试环境传入了两个参数(参数数据很长)后就返回了500错误.试了好几次发现传一个参数时正常,两个参数就报错,感觉很懵逼.(这里我还以为是代码问题,没有往环境问题上想),抓包后发现一个参数的时候发送信息是1024之内,2个参数就超过了1024就报错了.我想难道是服务器限制了请求长度,然后去看了下测试服务器的配置,发下果然有人设置的tomcat接受的请求长度为1024.(真的蛋疼)
1<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxPostSize="1024"/>
引用一下tomcat8的官方文档上说的:The maximum size in bytes of the POST ...
怎么重复使用inputStream
引语: 之前做项目的时候遇到一个问题,就是从网络中读取的图片要上传到oss,而且要对图片进行裁剪和压缩,其中上传和裁剪都要使用到图片的inputStream,又因为inputstream不能重复读,导致裁剪是成功的,而上传是失败的.我们今天就提供两种方法来解决,inputStream不能重复读的问题.
问题分析:inputStream的内部有个pos指针,当读取的时候指针会不断的移动,当移动到末尾的时候,就无法再次读取了.我们写个简单的例子来看下:
123456789101112131415String text = "测试inputStream内容";InputStream inputStream = new ByteArrayInputStream(text.getBytes());byte[] readArray = new byte[inputStream.available()];int readCount1 = inputStream.read(readArray);System.out.println(&q ...
普通对象使用spring容器中的对象
引语: 工作中有时候需要在普通的对象中去调用spring管理的对象,但是在普通的java对象直接使用@Autowired或者@Resource的时候会发现被注入的对象是null,会报空指针。我们可以简单的理解为spring是一个公司,它管理的对象就是它的员工,而普通的java对象是其他公司的员工,如果其他公司要找spring公司的员工一起共事没有经过spring公司的同意肯定是不行的。
解决方式:方法一:如果这个普通对象可以被spring管理的话,最好是直接交给spring管理,这样spring管理的bean中注入其他的bean是没有问题的。
方法二:当我们的普通对象没有办法交给spring管理的时候,我们可以创建一个公共的springBeanUtil专门为普通对象提供spring的员工(有点像spring公司的外包部门,把对象外包给其他公司使用,哈哈)。
123456789101112131415@Servicepublic class SpringBeanUtil implements ApplicationContextAware & ...
并发编程笔记1_并发bug的成因
前言: 最近在学习并发编程的知识,打算好好学习下并发这块,之前有处理过并发的问题,但是学的不够体系,知识比较零散.所以买了极客时间的并发课程(java并发编程实战)和《并发编程实战》从头系统化的学一遍。这里记录一下自己的学习过程和心得之类的。
首先咱们得知道为啥会产生并发编程的bug,究其根本原因是因为cpu处理速度>>内存>>I/O,这里用了”>>”,是远远大于的意思,极客时间里面的例子更形象说是天上一天,人间一年。天上指的是cpu对于内存,内存对于I/O.用来凸显其处理速度的差距。因为有了这三者的差距,cpu的利用率就比较低,一直得等待内存,I/O处理完。所以为了减少这三者的差距,做出了三种优化:1.CPU 增加了缓存,以均衡与内存的速度差异;2.操作系统增加了进程、线程,以分时复用 CPU,进而均衡 CPU 与 I/O 设备的速度差异;3.编译程序优化指令执行次序,使得缓存能够得到更加合理地利用。
这三类优化 ...
并发编程笔记2_synchronized使用和注意事项
并发编程笔记2_synchronized使用和注意事项前言:上一篇学习了并发bug的成因,我们知道当一个线程的时间片使用完的时候,操作系统就会切换到另外一个线程,如果这两个线程访问了相同的资源,可能就会导致并发问题。我们可以想到如果这个共享的资源一次只能一个线程访问,其他线程不能访问的话,就不会因为切换线程而产生的问题了。java并发编程中就提供了这样的机制,互斥锁来保证一次只有一个线程能访问共享的资源。java中有synchroized和lock,今天我们先来看下synchroized关键字。
使用方法:synchroized分为修饰方法和代码块:修饰方法:
123456789// 修饰方法 锁为对象public synchronized void method1() { // 处理过程 }// 修饰静态方法 锁是类public synchronized static void method2() { // 处理过程 }
修饰代码块:
12345678910111213// 修饰代码块 锁为对象public ...
并发编程笔记3_lock和condition
并发编程笔记3_lock和condition前言: 在jdk1.5出现了lock,性能比synchroized好很多,但在jdk1.6版本之后,synchroized经过了很多优化,性能已经提升了很多,那为什么还会有显示锁lock呢?直接用synchroized不就可以了吗,还不需要自己手动去释放锁,避免了程序员忘记释放锁的问题。其实synchroized还是存在一些问题的,有一些synchroized无法处理的问题,比如被synchroized修饰的代码部分一直处于处理中,这样线程会一直阻塞住,其他线程也没法再去获取这个资源。有时候我们可能希望有这么一个超时时间之类的东西,获取不到资源超过了某个时间,就不去获取了。或者A,B两个线程因为竞态条件构成了死锁,那么我们能不能直接中断其中一个线程,让资源能够释放出来。这时候lock孕育而生。
lock的使用:我们先看下lock显示锁是怎么使用的,下面是lock的标准使用形式:
1234567Lock lock = new ReentrantLock();lock.lock();try{ ...
IDEA解决maven包冲突的一些小技巧
在平常工作中我们经常会遇到maven引用的jar包冲突的事情,这时候我们就需要找出冲突的包,并将低版本或者缺少某些方法的jar给剔除掉。这个时候使用idea自带的maven依赖树就很好解决这样的问题。
步骤:1.在IDEA中右键项项目的pom文件,选择Maven->Show Dependencies,会打开一个maven的依赖树窗口,如下:2.打开窗口我们可以看到完整的依赖树,小技巧:左上角有几个小工具,比较常用的1显示冲突项,2显示从root到被选择的jar包路径,3显示实际大小。要选择冲突项的话可以直接点击1,然后在点击3,显示的会更清楚一些,因为jar包比较多,jar依赖比较复杂会让图变得很小。之后如果你需要看这个jar的引用路径可以点击这个jar包再点击2,就回显示从pom文件的根路径的包到被选择的包的单条路线,很方便;3.找到冲突的包后,选择需要的那个jar包,右键要去除的那个jar包,点击exclude,就会在pom文件中被剔除(其实就是对应的pom中的exclusion)
其他小技巧:1.在依赖树使用ctrl/ ...
maven实战学习笔记一
导语:上周犯了一个maven的错误,发现自己对maven也只是平时用用没有系统的学习过,所以找了本maven的书系统的看一看。找了《maven实战》学习一下,总共18章目前看完1-6章,因为maven本来就比较熟悉了,所以笔记只摘录了一些之前没有注意的点。
一.编写pom1.1maven2,maven3的modelversion只能是4.0.01.2 maven使用groupId artifactId version 三者构成了maven世界的坐标系 能唯一定位一个jar pom war 而且这三个元素是必须要填写的groupId 公司idartifaceId 项目idversion 版本id:snapshot:快照版本 不稳定的 可以随时修改的releast:发布版本 稳定的 不可修改的name:可选参数 用来定义项目的名称
二.编写主代码1.src/main/java目录用来放Java代码 如果选择了groupId artifactId 包名就是用两者给定义出来的2.使用mvn clean compile会将编译好的代码放入到当前目录下的target ...
maven导入snapshot依赖找不到对应类
maven导入snapshot依赖找不到对应类
导语:最近在做项目的时候,引入公司编写的二方库的包,maven仓库也deploy上去了。然后编译代码的时候发现一直找不到一个类,就编译不通过。一开始以为是本地idea或者maven的缓存导致没有拉取到最新的包。后来经过一系列的无用操作,发现了问题的所在是二方库的snapshot生成有个时间戳导致找不到。下面来看一下解决的过程:
解决步骤:1.首先确认了二方库的版本和项目引入的二方库的版本是不是一致的,结果发现版本是没有问题的2.确认二方库的包是不是真的传到maven仓库了,直接从maven的私服去搜索这个jar包发现这个包是存在的,而且有很多版本,找到了最新版本的那个jar下载下来,使用jd-gui反编译之后发现类也是存在的3.确认是不是idea或者maven的缓存导致使用的一直是原来的二方库jar包?清理了所有缓存之后,依然编译的时候找不到对应的类4.经过以上的三个步骤依然没有解决当前的问题,但是想到引用的第三方的jar并没有出现这样的问题,那会不会是二方库的问题。在把项目打包之后,把打包完成的jar用反编译工具解开。里面大概会有这么几 ...