java 对象拷贝clone

总体描述

  1. clone()方法是Java Object对象的protected方法,可供子类调用以实现子类的克隆逻辑,但不能直接调用;
  2. clone()方法是jdk的native实现,实现了对象的按位拷贝,Object对象只能实现对象的浅层复制,即克隆出的对象中若存在引用对象,则原对象和克隆对象中的引用对象指向同一块存储地址,若改变应用对象内的属性(注意不是改变应用对象的引用本身),则克隆对象和被克隆对象会被同时修改;若要实现对象的深层复制,则在调用Object的clone()完成浅层复制后,还需要依次处理克隆对象的所有引用属性,完成引用属性的依次clone(),才能实现深层复制;
  3. 如果一个类要实现clone(),那么需要继承public clone()方法(作用域要变为public的);clone方法要调用super.clone()先完成对象的按位复制(Object.clone()会检查原先的对象有多大,再为新对象腾出足够多的内存,将所有二进制位从原来的对象复制到新对象。);并且要实现Cloneable接口,Object.clone()方法会检查克隆对象是否实现了Cloneable接口;Object.clone()方法最终返回的是一个指向Object类型地句柄(引用、指针),必须强转成我们需要的类型。

参考文章


线程安全问题

SimpleDateFormat线程安全问题

SimpleDateFormat持有Canlender对象,如果SimpleDateFormat对象多线程共享,并发情况一下,一个线程传入的日期可能并另一个线程读到,存在线程安全问题;建议把SimpleDateFormat作为单个线程使用的对象,如使用ThreadLocal。

hashMap线程安全问题

hashMap的数据结构hashmap线程不安全

  • 存储结构:jdk8以前:数组+链表;jdk8以后:数组+链表 ->数组+红黑树(链表长度大于阈值且数组长度大于64)
  • 插值过程:1. key值做hash运算、高位运算、取模运算后(运算采用的是位运算,移位,性高,但要求数组的大小是2的整数倍),得到index值(数组下标);2. 可能产生碰撞(不同key运算的结果一样),以链表的方式存储,拉链法;如果key的hashcode相同,则是相同值,进行value的覆盖;3. 链表长度大于阈值8并且数组长度大于64则进行将链表变为红黑树,数组长度小于64,进行数组扩容
  • 线程不安全:jdk8及以上,put不是同步操作,时间片完会存在值的相互覆盖;jdk8以前,扩容引起的死循环,值丢失。

Java正则表达式

java正则表达式参考文章

  1. 核心类:
  • java.util.regex.Pattern;
  • java.util.regex.Matcher;
    部分字符串方法也支持正则表达式
  1. 正则表达式主要语法:
  • 开始 ^ 结束 $
  • 字符: 普通字符、特殊字符转义(\)、多种字符中的一个(用** [] **,或者-表示范围,|表示选择);
    常用特殊转义字符:. 任意换行符以外的字符;\b字边界;\B非字边界;\d数字字符;\D非数字字符;\w单词字符;\W非单词字符;\s空白字符;\S非空白字符;\f换页符;\n换行符;\t制表符;\p{P}一个标点字符( !"#$%&‘()*+,-./:;<=>?@[]^_’{|}~)
  • 字符出现次数:指定一定的次数或者范围(用** {} *,如{n}n次,{n,}大于等于n次,{n,m}n-m次)
    其他方式:
    任意次含0次,+大于等于一次,?0次或1次
  • 模式分组:使用** () **进行分组,作为整体进行匹配,并且可以基于分组找到字符串,如(ab){3},匹配ababab

clone对象 jquery clone在java的用法_正则表达式



  • matcher的find()方法会找到下一个满足正则表达式要求的子串信息,find(int n) 找到第n个匹配正则表达式的子串
    mathcer的gounp()获取匹配的子串的字符串,group(0) 代表整个表达式匹配的子串(和group()的结果一样),gounp(1)代表子串中匹配的第一个分组,如上例中group(1)为最外层的分组,group(2)为123,group(3)为12
  1. java中的常见用法
  • 判断字符串中是否包含匹配某字符串的子串
  • 以指定正则表达式分割
  • 找出匹配的所有子串,find(),group()
  • 满足条件的替换为另一个字符串