1.==比较的是两个对象,包括对象的地址位,如果比较的两个对象地址位不同,值相同也会返回false
2.equals比较的是两个字符串的值,只要值相同,就会返回true
不属于,是final修饰的Java类。
java中的基本数据类型:byte、char、short、int、long、float、double、boolean
String、StringBuffer、StringBuilder
String类型的字符串是不可变的,StringBuffer和StringBuilder是可以对同一个对象做更新操作的
StringBuffer是线程安全的,StringBuilder不是线程安全的
不一样。
String str="i"如果定义多个变量都为相同值的话,会共用同一个地址,创建的对象应该放在了常量池中;
String str=new String("i")是创建了一个新的对象,放在的是堆内存中
使用StringBuffer 或 StringBuilder 的 reverse 成员方法。
toCharArray("");charAt();split();ndexOf();equals();contains();length();subString("");replace("","");
接口:不能实例化,用interface修饰,可以实现多个接口;
抽象类:只能单继承,使用abstract修饰,不能实例化;
file.getName();file.getPath();file.delete();file.exits();file.createDirectory();file.copy();file.move();file.size();file.read();file.write();
重写:发生在子类与父类之间,重写的方法必须与被重写的方法具有相同的名称、参数列表和返回类型。
重载:发生在同一个类中,方法名相同,参数个数或者参数类型不同
Collection是集合的接口,其实现类有List和Set;
Collections是工具类,包含许多有关集合操作的静态多态方法,可以直接使用。
List:有序,可重复
Set:无序,不可重复,HashSet无序,linkedHashSet按照插入排序,SortedSet可排序
Map:无序,key唯一,value可重复,key和值都可为null,但只能有一个
HashMap:允许Null Key和Null Value,线程不安全
HashTable:不允许Null Key和Null Value,线程安全
如果需要得到一个有序的结果应该使用TreeMap
如果不需要排序最好选用HashMap,性能更优
- TCP:TCP是一种面向连接的协议。在数据传输之前,需要通过三次握手建立连接,并在数据传输结束后通过四次挥手关闭连接。这种连接机制确保了数据传输的可靠性和顺序性。
- UDP:UDP是一种无连接的协议。发送和接收数据报文时不需要预先建立或关闭连接,因此具有较低的延迟和较高的传输效率。
HashMap基于Hash算法实现,通过put(key,value)存储,get(key)来获取value
当传入key时,HashMap会根据key,调用Hash(Object key)方法,计算出Hash值,根据Hash值将Value保存在Node对象里,Node对象保存在数组里。
当计算出的Hash值相同时,称为Hash冲突,HashMap的做法是用链表和红黑树存储相同Hash值的value;当Hash冲突的个数:小于等于8使用链表,大于8使用红黑树解决链表查询慢的问题。
HashSet是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet的操作相对比较简单,相关HashSet的操作,基本上都是直接调用底层的HashMap的相关方法来完成,HashSet不允许有重复的值,并且元素是无序的。
ArrayList:数据结构是动态数组,查询快,增删慢,
linkedList:数据结构是双向链表,查询慢,增删快
List转数组:String[] list = List.toArray(array);
数组转List:List list = java.util.Arrays.asList(array);
ArrayList:有序,线程不安全,元素超过初始大小值时会扩容50%
Vector:有序,线程安全,元素超过初始大小时会翻倍扩容
Array:变量在声明时必须实例化,大小是固定,可以包含基本类型和对象类型
ArrayList:变量可以只是先声明,大小是动态变化的,只能包含对象类型
迭代器是一种设计模式,它是一个对象,可以遍历并选择序列中的对象。
使用方法:next();hashNext();remove();
特点:Iterator接口被Collection接口继承,Collection接口的iterator()方法返回一个iterator对象。
可以使用Collections.unmodifiableCollection(Collection c) 方法创建一个只读集合,操作集合时会抛出Java. lang. UnsupportedOperationException异常。
并行:两个或多个事件在同一时刻发生,是在不同实体上的多个事件;
并发:两个或多个事件在同一时间间隔发生,是在同一个实体上的多个事件。
新建、就绪、运行、阻塞、死亡
sleep:后程序不会释放同步锁,可以指定睡眠时间,自动唤醒,类是Thread
wait:后程序会释放同步锁,可以直接用notify唤醒,类是Object
乐观锁:认为每次去拿数据的时候别人不会修改,所以不会上锁,但是每次要拿数据的时候都会先判断数据是否被别人修改。
悲观锁:认为每次去拿数据的时候别人都会修改,所以每次都会上锁。
使用场景:乐观锁使用于多读少写的应用类型,这样可以提高吞吐量;相反的情况则使用悲观锁。
序列化:对象转化为字节流的过程
反序列化:字节流转对象的过程
场景:java对象需要在网络上传输或者持久化存储到文件中时,就需要对Java对象进行序列化处理
使用:类实现Serializable接口
1.校验参数的数据格式是否合法
2.对进入数据库的特殊字符进行转义处理,或编码转换
3.预编译SQL,参数化查询方式,避免SQL拼接
4.发布前利用工具进行SQL注入检测
NullPointerException、SQLException、IndexOutOfBoundException、NumberFormatException、FileNotFoundException、IOException、IllegalArgumentException、NoSuchMethodException
两次握手只能保证单向连接时是畅通的,只有经过第三次握手,才能确保双向都可以收到对方发送的数据。
get:从服务器拿数据,就是查询;请求通过URL直接请求数据,数据信息可以在URL中看到;传送的数据量小,有限制,不能大于2kb;安全性低。
post:向服务器提交数据;请求是放在请求头中的,用户看不到;传送的数据可以没有限制;相对较安全。
#{}是预编译处理,${}是字符串替换
使用#{}可以预防SQL注入
1.数组分页
2.SQL分页
3.拦截器分页
4.RowBounds分页
设置lazyLoadingEnable=true
延迟加载的原理是调用的时候触发加载,而不是在初始化的时候就加载信息。
1.跨系统的异步通信,所有需要异步交互的地方都可以使消息队列
2.多个应用之间的耦合
3.应用内的同步变异步
4.消息驱动的架构
5.跨局域网,甚至跨城市的通讯
表类型如果是MyISAM,那ID就是8
表类型如果是InnoDB,那ID就是6
float:最多可以存储8位的十进制数,在内存中占 4 字节
double:最多可以存储10的十进制数,在内存中占8字节
使用 explain 查看 SQL 是如何执行查询语句的,从而分析索引是否满足需求
缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决方案:最简单粗暴的方法如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
String、List、Hash、Set、ZSet
合理设置缓存的过期时间。
新增、更改、删除数据库操作时同步更新 Redis,可以使用事物机制来保证数据的一致性。
- jconsole:用于对 JVM 中的内存、线程和类等进行监控;
- jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等。
-Xms2g:初始化堆大小为 2g;
-Xmx2g:堆最大内存为 2g;
-XX:NewRatio=4:设置年轻代和老年代的内存比例为 1:4;
-XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;
–XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;
-XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;
-XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
-XX:+PrintGC:开启打印 gc 信息;
-XX:+PrintGCDetails:打印 gc 详细信息。