需要时常回顾
追光的人(陈聪)
这个作者很懒,什么都没留下…
展开
-
手动打印日志及日志等级相关-1
1:这里用log4j来打印日志,所以得导入log4j的依赖<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <scope> provided</scope> </dependency>没有版本是因为在父依赖中做了版本管理。2:原创 2021-06-17 22:23:48 · 169 阅读 · 0 评论 -
初识跨域问题-1
1:跨域的产生协议,域名,端口,只要有一个以上不同就表示不同的网站,但利用ajax请求时,会出现跨域问题(只在ajax请求中会出现,同步请求,比如a标签或者表单则不会出现错误)、2:解决方法前端解决:略后台解决:nginx:这种方式解决跨域问题用的人很少了jsonp:核心原理是使用回调函数,用的人也少了Cors:一般都是使用这个3:具体操作局部解决:写一个controller配置一次在controller层添加@CrossOrigin 添加之后表示这个类中的所有的方法原创 2021-06-16 21:46:24 · 159 阅读 · 0 评论 -
mybatis的缓存基础
所有缓存的基础:1.什么是缓存缓存是一个容器,用来存放我们想要的数据2.缓存的思想但用户第一次查询的时候,缓存这个容器中还没有数据,此时去查询数据库查询数据库得到的结果,一方面返回给应用程序,另一方面放到缓存中(容器中)但用户第二次访问的时候,此时容器中已经有了数据此时直接从容器中获取数据即可,不需要查询数据库了。3.缓存的开发步骤if(查看缓存中有没有){直接从缓存中取出}else{//查询数据库,返回数据,把数据存放到缓存中}4.缓存的好处:①快速原创 2021-05-26 23:05:22 · 86 阅读 · 0 评论 -
mybatis--关于接口参数注解的几个小问题
接口中参数有多个的情况下,一般有两种方法进行配置。第一种是封装到一个类中,第二种是直接在接口形式参数前面写注解。这里说下第二种容易出错的地方。拼接字符串的时候常常需要用到where,foreach等语句然而:①接口中有方法:List<User> selectByIdAndUsername(@Param("id1") int id,@Param("username1") String username);<select id="selectByIdAndUsern原创 2021-05-25 23:30:22 · 162 阅读 · 0 评论 -
关于常量池的一些整理
含义:常量池是介于栈和堆外的另一种独立的内存管理空间,相同内容常量池中永远只有一份,基本数据类型、对象的引用都存在栈中,执行速度快,包装类型,对象存储,new出来的对象都是存储在堆中,Byte,Short,Integer,Long,Character这5种整型的包装类只是在对应值小于等于127(其实是-128到127)时才可使用对象池。超过了就会自动申请空间创建对象,所有才会出现上述情况,而String是个较为特殊的包装类型,直接用=“”创建的数据是存放在常量池,且无论数据大小都不会申请空间创建,除非使用n原创 2021-04-08 21:10:14 · 137 阅读 · 0 评论 -
字节流自带缓存,而字节流不带
前几天被一个东西弄得有点懵圈,才发现,其实字节流底层也是字节,不过它是一个带有编码和解码的字节,所以它可能自带一些缓存,你如果不把流关闭,最新的数据就传不进去。举例:比如说我要用字符流输出流把字符串”aaa“存到某个文件中public class SeriaTest2 { public static void main(String[] args) { try(FileWriter fileWriter = new FileWriter("./resources/aa.tx原创 2021-04-06 23:00:22 · 201 阅读 · 0 评论 -
泛型擦除注意点
代码如下: ArrayList<Dog> dogs = new ArrayList<>(); dogs.add(new Dog()); ArrayList list=dogs; System.out.println(list==dogs); //泛型擦出 list.add(new Cat()); System.out.println("dog size"+dogs.size());原创 2021-04-06 20:25:16 · 77 阅读 · 0 评论 -
hashmap浅析-扩容
补充部分:扩容涉及到扩容之后元素的整理问题,jdk8为了减少hashmpa冲突,使用了hash值和n进行&的操作,这么一来,同一个链表上的所有数据其实可以被划分为2类,一类是&操作之后为0的数据,保留在原位置,一类是&操作之后为1的数据,串起来放到新数组新位置上。步骤1:首先判断是否为初次扩容,如果是,退出。如果不是,进入循环,循环遍历次数为数组中元素的个数步骤2:(先把该节点赋值给e)判断数组中的当前节点是否为空,为空则进行下一轮循环步骤3:如果不为空,则赋值为空,等待原创 2021-04-05 17:56:50 · 147 阅读 · 0 评论 -
hashmap浅析-get方法
步骤1:首先对传入值keya进行hash运算,依然是高位和地位进行^运算,得到的hash值和n-1进行&运算,最终得到索引值步骤2:首先判断该数组是否为空,是否长度为0,当前索引位置的第一个元素是否为null,满足任意一个条件返回null,结束步骤3:将传入值keya的hash值与当前索引位第一个元素的hash值进行比较,一样则继续比较是否为相同引用,或者equals是否相等,若相等,返回其value,结束。步骤4:不相等的话,会出现两种可能性,如果当前索引位置后面还有元素,则可能在后面原创 2021-04-05 15:28:01 · 1688 阅读 · 2 评论 -
hashmap7源码浅析及与hashmap8的比较
一:首先分析jdk7的源码实现1.构造方法:①有参构造,会去寻找最近的2的次幂 ②无参构造,会直接生成一个长度为16的数组2.put方法:步骤1:调用hash算法(hashcode经过多次位运算)得到hash值并与n-1进行&,得到索引位置步骤2:如果索引位置上的元素为空,添加成功,如果索引位置上的值不为空,比较key1和当前位置上存在的一个或多个元素的hash值是否一致:①如果都不相同,进行头插法,直接插在数组中,也就是插在其他对象前面。...原创 2021-04-05 11:58:41 · 264 阅读 · 0 评论 -
hashmap8底层源码剖析1--构造以及put
以下内容第一遍全按照记忆来,会有一些不太全的地方。1.首先构造有两种:①带参数构造,如hashmap(10),此时底层会将输入的参数进行多次位运算(转换成后几位全是1的,比如111,1111),扩容的时候就在二进制转化为10进制的时候再加上1即可。也就是说,会就近返回一个2的次幂,这个才是数组的大小。比如说传入10,会返回16,传入15也是16,传入17会返回32。以此类推。 ②无参构造,内部什么也不做,仅仅只是定义一个负载因子,这个因子等...原创 2021-04-04 23:44:19 · 212 阅读 · 0 评论 -
获取文本上每个字符出现的次数并保留在map中,再将map中的数据写入文件
具体实现如下:public class Test02 { public static void main(String[] args) { LinkedList<Character> strings = new LinkedList<>(); TreeMap<Character, Long> characterIntegerTreeMap = new TreeMap<>(); try(Buffere原创 2021-04-03 22:40:13 · 264 阅读 · 0 评论 -
synchronize原理以及和CAS的浅层比较
1.为什么需要synchronize我自己的理解(问题):当多个线程对同一个对象M进行操作的时候,如果是非原子性对象(比如a++这样的,要分好几个指令来走),A线程处理该对象M的时候,很可能会出现在执行完某个指令之后,因为被分配到cpu时间片段用完了,只能等待再次被分配时间片段,而这时,其他线程(线程B)对该对象进行了操作,导致对象M的值不一样了,之后由于A线程被分配到了时间片段,所以可以继续执行未处理完的指令,但是它很傻,不会在处理前看看对象M是否已经变了,而是继续按照之前拿到值进行操作。我自己的原创 2021-04-03 17:40:42 · 215 阅读 · 2 评论 -
使用反射创建实例/对象的两种方法
1.但该类有无参构造,并且不用进行初始化赋值的情况下:Class<?> aClass = Class.forName("com.javasm.practise.Student");Object o1 = aClass.newInstance();*感觉用的不是很多啊,一般情况下都要从外部传过来一个类的地址,咱或许看不到是否有无参构造,并且很多时候还要立马初始化的吧?2.没有无参构造,或者想直接用有参构造初始化一下//步骤1 取得.class文件Class<?>原创 2021-04-01 23:05:10 · 389 阅读 · 0 评论 -
线程创建的三种方式
1.new 一个类,但是这个类需要继承Thread,并且重写thread里面的run方法。public class CustomThread extends Thread { //run是线程真正执行的任务 @Override public void run() { for (int i = 0; i <10 ; i++) { System.out.println(i); } }}缺点:因为每个类都只原创 2021-04-01 19:27:03 · 292 阅读 · 0 评论 -
关于List和Set的遍历
1.List有四种遍历方式:普通for循环,增强for循环,迭代器,foreach.其中需要注意的是,Linkedlist虽然没有明着的索引位,但是它本身有first和last,所以可以通过从头或者从尾部开始循环找到索引位置2.Set有三种遍历方式:增强for循环,迭代器,foreach.需要注意的是,Set由于底层是Map,所以完全没有索引位...原创 2021-03-29 23:05:24 · 391 阅读 · 0 评论 -
ArrayList的初始化常用方式,扩容,和应用(去重)
下面介绍ArrayList的三种初始化1.无参构造如果调用的是无参构造 数组其实是空数组 在第一次add的时候开始进行扩容 生成一个默认长度为10的数组。2.有参构造(int)直接用传进来的参数当作数组的长度。3.有参构造(collection)直接传进来一个collection类型的对象时,会调用toArray()方法,比如:ArrayList list1 = new ArrayList(1);list1.add(1);list1.add(2);list1.add(3)原创 2021-03-29 22:51:31 · 1010 阅读 · 0 评论 -
数组排序-冒泡排序和选择排序
面试有可能会被问到一:冒泡排序相邻两个数据进行比较需要注意的点:内部循环的话,只能比较到未确定的最后一个数据为止(arr.length-1-i)for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ temp=arr[j]; arr[j]=arr[j+1];原创 2021-03-13 20:10:12 · 116 阅读 · 0 评论