- 博客(45)
- 收藏
- 关注
原创 关于Jedis和lettuce以及springDataRedis的一些区别
1:三者其实都是用来操作redis的2:springDataRedis是对Jedis和lettuce的一系列封装,简化了很多方法3:公司里面之所以不怎么用Jedis也是因为其指令比较繁琐难以记忆,不如就用简化了的springDataRedis4:使用springDataRedis 时,首先要导入springDataRedis的依赖,然后导入Jedis或者lettuce,如果是Jedis,需要再导入slf4j-simple5:springDataRedis操作Redis提供了2个模板,只需要将
2021-06-18 23:07:51
740
原创 手动打印日志及日志等级相关-1
1:这里用log4j来打印日志,所以得导入log4j的依赖<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <scope> provided</scope> </dependency>没有版本是因为在父依赖中做了版本管理。2:
2021-06-17 22:23:48
243
原创 初识跨域问题-1
1:跨域的产生协议,域名,端口,只要有一个以上不同就表示不同的网站,但利用ajax请求时,会出现跨域问题(只在ajax请求中会出现,同步请求,比如a标签或者表单则不会出现错误)、2:解决方法前端解决:略后台解决:nginx:这种方式解决跨域问题用的人很少了jsonp:核心原理是使用回调函数,用的人也少了Cors:一般都是使用这个3:具体操作局部解决:写一个controller配置一次在controller层添加@CrossOrigin 添加之后表示这个类中的所有的方法
2021-06-16 21:46:24
229
原创 springmvc中常见的简单的文件上传和下载
一.文件上传:这里只使用不用导包的part方法1:上传单个文件@PostMapping("uploadByPart2") public String uploadByPart2(HttpServletRequest request) throws IOException, ServletException { //找到要存放文件的绝对路径 String realPath = request.getServletContext().getRealPath(
2021-06-01 23:59:00
175
原创 springmvc中关于post请求会出现乱码的整理
1:使用@getMapping注解的时候,只要tomcat的配置是在8以上就没有问题。2:但请求过来的值是key=value的时候,如果包含在请求头,即便里面有中文也不出现乱码。但是如果数据在请求体中,则会出现乱码,此时可以在web.xml中配置filter,具体如下:<filter> <filter-name>encoding</filter-name> <filter-class>org.springframewo
2021-05-31 23:02:42
272
原创 关于配置文件的几点常识
1.properties:专门配置一些等级不高,等级不深,等级不复杂的配置2.xml:一般作为框架的配置文件,对于深等级支持良好,查看方面容易看懂首行是固定写法,有且仅有一个跟标签,格式和html5的格式基本一样,但是xml中的标签全部都是自定义的,3.yml(yaml)->springboot...
2021-05-28 09:31:33
157
原创 mybatis的缓存基础
所有缓存的基础:1.什么是缓存缓存是一个容器,用来存放我们想要的数据2.缓存的思想但用户第一次查询的时候,缓存这个容器中还没有数据,此时去查询数据库查询数据库得到的结果,一方面返回给应用程序,另一方面放到缓存中(容器中)但用户第二次访问的时候,此时容器中已经有了数据此时直接从容器中获取数据即可,不需要查询数据库了。3.缓存的开发步骤if(查看缓存中有没有){直接从缓存中取出}else{//查询数据库,返回数据,把数据存放到缓存中}4.缓存的好处:①快速
2021-05-26 23:05:22
128
原创 mybatis--关于接口参数注解的几个小问题
接口中参数有多个的情况下,一般有两种方法进行配置。第一种是封装到一个类中,第二种是直接在接口形式参数前面写注解。这里说下第二种容易出错的地方。拼接字符串的时候常常需要用到where,foreach等语句然而:①接口中有方法:List<User> selectByIdAndUsername(@Param("id1") int id,@Param("username1") String username);<select id="selectByIdAndUsern
2021-05-25 23:30:22
218
原创 Mybatis--关于插入数据后返回id的操作
如果xml仅仅只是这样写的话:<insert id="insertUser" > insert into user(username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address}) </insert>并且执行以下代码的话static void function2() throws IOException { String path
2021-05-25 22:15:14
999
1
原创 复习-arrary和arraylist的对比以及arraylist的遍历中删除的原理
1.空间大小array是不可变的,必须事先控制其大小。arraylist是可扩容数组,每次扩大容量的0.5倍。2.存放内容array只能存放相同类型的元素,但存放对象可以是基本类型或者对象类型arraylist可以存放不同类型的元素(object),但存放对象只能是对象类型,而且如果加上<>的话,就是指定类型了。3.使用方法arraylist在array的基础上增加了例如addall(),removeall(),iterator()等常用方法。注意:我们经常需要在遍历元素
2021-04-28 14:39:18
297
原创 复习-jvm内存分配(1)
1.首先,jvm内存大致有三块,分别是栈(stack),堆和方法区。2..class文件在运行期间被类加载器加载到jvm的时候,是被加载到了方法区里,此时是一个一个的代码片段。3.jvm访问方法区的代码片段,就是去进入到一个又一个的方法里面去(从上到下)。4.每进入到一个方法里,都会给该方法在stack里分配对应的空间,空间里面存放局部变量和要用到数据。5.stack是先进后出的,进栈也叫做压栈(push),出栈也叫做pop,栈帧永远指向最顶部的方法栈,并且最顶部的方法栈拥有优先活跃权。.
2021-04-27 23:13:03
128
原创 复习-java运行的整个流程
1.编写--首先咱们要编写自己的源代码,这个可以在任意文档编辑器内完成,以.java为文件名 -----无需jdk2.编译--这个时候就要用到javac这个.exe程序了,它存在于jdk的bin目录下,并且能把.java文件编译成以.class结尾的字节码文件,此时的.class文件不同于咱们自己在源码中定义的class,它已经与源文件无关了。另外:字节码文件不是二进制文件,它是一种jvm能读懂的东西,并且这个字节码文件,在所有种类的jvm上都能运行。(小结就是:能接受相同的输入,但是输出不一样) -.
2021-04-26 23:01:59
147
原创 初始jquery事件-动态添加的新元素没有绑定上旧元素的事件
初学jquery的时候真的感觉很疑惑,明明增加的新元素的各方面都和旧元素是一样的,偏偏没有绑定上旧元素的事件。启示:绑定事件是静态的,只能给当前的文档页面增加上事件,可以相当于说旧版本有,新版本的新元素没有(增加东西之后是新版本),需要自己去手动加上,但是手动给新版本的新元素加上事件之后,你会突然发现旧版本的旧元素绑定上了两个事件。解决方式:每次生成新版本的时候,初始化一下,也就是将原有的旧版本绑定的事件给解绑一下,再一次全部性的给新版本的所有元素...
2021-04-24 15:45:03
209
原创 关于常量池的一些整理
含义:常量池是介于栈和堆外的另一种独立的内存管理空间,相同内容常量池中永远只有一份,基本数据类型、对象的引用都存在栈中,执行速度快,包装类型,对象存储,new出来的对象都是存储在堆中,Byte,Short,Integer,Long,Character这5种整型的包装类只是在对应值小于等于127(其实是-128到127)时才可使用对象池。超过了就会自动申请空间创建对象,所有才会出现上述情况,而String是个较为特殊的包装类型,直接用=“”创建的数据是存放在常量池,且无论数据大小都不会申请空间创建,除非使用n
2021-04-08 21:10:14
190
原创 字节流自带缓存,而字节流不带
前几天被一个东西弄得有点懵圈,才发现,其实字节流底层也是字节,不过它是一个带有编码和解码的字节,所以它可能自带一些缓存,你如果不把流关闭,最新的数据就传不进去。举例:比如说我要用字符流输出流把字符串”aaa“存到某个文件中public class SeriaTest2 { public static void main(String[] args) { try(FileWriter fileWriter = new FileWriter("./resources/aa.tx
2021-04-06 23:00:22
254
原创 关于序列化的几个注意点
1.如果要序列化的对象是普通类,需要此类实现Serializablepublic class NumB implements Serializable { private static NumB instance=new NumB(); private NumB(){} public static NumB getInstance(){ return instance; }}但是如果是enum枚举类的话,则不需要public enum Num
2021-04-06 22:51:16
228
原创 泛型擦除注意点
代码如下: 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
122
原创 hashmap浅析-扩容
补充部分:扩容涉及到扩容之后元素的整理问题,jdk8为了减少hashmpa冲突,使用了hash值和n进行&的操作,这么一来,同一个链表上的所有数据其实可以被划分为2类,一类是&操作之后为0的数据,保留在原位置,一类是&操作之后为1的数据,串起来放到新数组新位置上。步骤1:首先判断是否为初次扩容,如果是,退出。如果不是,进入循环,循环遍历次数为数组中元素的个数步骤2:(先把该节点赋值给e)判断数组中的当前节点是否为空,为空则进行下一轮循环步骤3:如果不为空,则赋值为空,等待
2021-04-05 17:56:50
191
原创 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
1842
2
原创 hashmap7源码浅析及与hashmap8的比较
一:首先分析jdk7的源码实现1.构造方法:①有参构造,会去寻找最近的2的次幂 ②无参构造,会直接生成一个长度为16的数组2.put方法:步骤1:调用hash算法(hashcode经过多次位运算)得到hash值并与n-1进行&,得到索引位置步骤2:如果索引位置上的元素为空,添加成功,如果索引位置上的值不为空,比较key1和当前位置上存在的一个或多个元素的hash值是否一致:①如果都不相同,进行头插法,直接插在数组中,也就是插在其他对象前面。...
2021-04-05 11:58:41
331
原创 hashmap8底层源码剖析1--构造以及put
以下内容第一遍全按照记忆来,会有一些不太全的地方。1.首先构造有两种:①带参数构造,如hashmap(10),此时底层会将输入的参数进行多次位运算(转换成后几位全是1的,比如111,1111),扩容的时候就在二进制转化为10进制的时候再加上1即可。也就是说,会就近返回一个2的次幂,这个才是数组的大小。比如说传入10,会返回16,传入15也是16,传入17会返回32。以此类推。 ②无参构造,内部什么也不做,仅仅只是定义一个负载因子,这个因子等...
2021-04-04 23:44:19
262
原创 获取文本上每个字符出现的次数并保留在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
342
原创 synchronize原理以及和CAS的浅层比较
1.为什么需要synchronize我自己的理解(问题):当多个线程对同一个对象M进行操作的时候,如果是非原子性对象(比如a++这样的,要分好几个指令来走),A线程处理该对象M的时候,很可能会出现在执行完某个指令之后,因为被分配到cpu时间片段用完了,只能等待再次被分配时间片段,而这时,其他线程(线程B)对该对象进行了操作,导致对象M的值不一样了,之后由于A线程被分配到了时间片段,所以可以继续执行未处理完的指令,但是它很傻,不会在处理前看看对象M是否已经变了,而是继续按照之前拿到值进行操作。我自己的
2021-04-03 17:40:42
322
2
原创 使用反射创建实例/对象的两种方法
1.但该类有无参构造,并且不用进行初始化赋值的情况下:Class<?> aClass = Class.forName("com.javasm.practise.Student");Object o1 = aClass.newInstance();*感觉用的不是很多啊,一般情况下都要从外部传过来一个类的地址,咱或许看不到是否有无参构造,并且很多时候还要立马初始化的吧?2.没有无参构造,或者想直接用有参构造初始化一下//步骤1 取得.class文件Class<?>
2021-04-01 23:05:10
440
原创 关于账号密码校验的两种IO流操作
需求:从控制台出入账号密码并和某个文件中保存的账号密码匹配,一致则登陆成功分析:目前来说,要从文档中找到指定的数据,①可以用数据流进行写入并读取(劣势1),此时需要注意到底是哪个字符串写在前面,毕竟写入和读取要保持一致的(劣势2) ②可以用数据库流来进行键值对的匹配,无需用代码写入,直接去文件里自己写就行(优点1),通过key值可以得到对应的value...
2021-04-01 21:28:07
548
原创 线程创建的三种方式
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
404
原创 关于List和Set的遍历
1.List有四种遍历方式:普通for循环,增强for循环,迭代器,foreach.其中需要注意的是,Linkedlist虽然没有明着的索引位,但是它本身有first和last,所以可以通过从头或者从尾部开始循环找到索引位置2.Set有三种遍历方式:增强for循环,迭代器,foreach.需要注意的是,Set由于底层是Map,所以完全没有索引位...
2021-03-29 23:05:24
454
原创 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
1152
转载 String.valueOf()方法的使用总结
以下内容转自链接:https://www.jianshu.com/p/6f6932717a27String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下列几种 String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串 String.valueOf(char c) : 将 char 变量 c 转换成字符串 String.valueOf(char[] dat
2021-03-28 23:36:50
1182
原创 关于Stringbuffer的需要注意的几点
1.StringBuffer或者StringBuilder 创建的时候,如果是无参构造(),会直接在底层创建一个长度为16的char类型数组;如果是有参构造(string),会在参数的基础上加上16。推荐使用(int)构造,会直接生成一个确定容量的数组,避免多次扩容。2.利用length()方法得到的是count值,也就是数组中保存的元素的值。3.如果扩容的话,StringBuffer是在原有的基础上*2+2,全部都通过copyof拷贝到新数组中。以下是B站 上硅谷视频截图,我就不打字了。.
2021-03-28 23:12:35
492
原创 数组排序-冒泡排序和选择排序
面试有可能会被问到一:冒泡排序相邻两个数据进行比较需要注意的点:内部循环的话,只能比较到未确定的最后一个数据为止(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
158
原创 java面试题
1.重载与重写的区别重载:同一个类中,方法的名字相同,但是参数列表不同①参数个数不同②参数类型不同③参数类型顺序不同使用重载的好处:方便使用者使用,功能相同而名字特别多的话,过于难记。重写:待补充...
2021-03-13 19:47:31
130
原创 数组中常用几种的Arrays方法
1.判断两个数组元素是否一一对应Arrays.equalsint[] arr1={1,2,3};int[] arr2={1,2,3};Arrays.equals(arr1,arr2);2.对数组进行值得复制 Arrays.copyOfint[] arr3=Arrays.copyOf(arr1,arr1.length);//扩容两倍int[] arr4=Arrays.copyOf(arr1,arr1.length*2);//也可以进行缩减int[] arr5=Arrys.c
2021-03-12 22:04:25
228
原创 浅析引用类型和基本类型的内存比较
1.引用类型至少占两块内存,如下图所示是一个局部变量的二维数组内存图数组名:因为是局部变量,所以数组名在栈内存中一维数组:在一块连续的堆空间中一维数组的值:在另外的堆空间中...
2021-03-12 21:54:27
192
原创 遍历数组的两种for循环方式以及一种Arrays方式
1.普通for循环,利用下标for(int i =0;i<arr.length;i++)2.增强for循环,不用下标,依次输出for(int a:arr){System.out.println(a);}3.Arrays.toString(arr);代码如下:public class Practise01 { public static void main(String[] args) { int[] arr={1,2}; Sys
2021-03-12 21:47:47
700
原创 关于random的多种用法
1.math.random()会产生一个0到1(坐开又闭)的随机小数。所以:(int)(math.random()*10)会得到一个随机的0到9的整数2.new 一个Random rand=new Random();int num=rand.nextInt(10);
2021-03-12 21:20:14
903
原创 关于equals和==的几个注意点
1.引用类型作比较的时候需要用到equals ,比较的是其在堆里的值,而==比较的是地址值2.equals不能用来比较两个基本类型
2021-03-12 21:11:28
215
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人