计算机基础
源码,反码,补码,移码:
原码 :二进制(开头第一个表示符号0正1负)
反码 :在原码的基础上,符号位不动,其他位取反 —注意,任何正数的源码=反码=补码,而负数都是通过补码表示的。
补码 :在反码的基础上,运算+1 —注意,任何正数的源码=反码=补码,而负数都是通过补码表示的。
公式:两数补码的和==两数和的补码。
移码 :在补码的基础上,符号位取反
101011(二进制)–> 原码 00101011 --> 反码 01010100 --> 补码 01010101–> 移码 11010101
sql注入 禁止使用通过字符串拼接的sql语句,严格使用参数绑定的sql语句,如mybatis的#{},不能使用 , 因 为 {},因为 ,因为{}是字符串拼接的形式
xss问题出在用户数据没有过滤、转义;csrf问题出在http接口没有处理未受信任的调用。
代码风格
类名一般是名词 方法名一般是动词
jvm
new 和 newInstance 区别:
new 可以调用类的各个构造方法 而newInstance 只能调用无参数的构造方法。
1.heap(堆区)
堆区由各子线程共享使用 在线上环境中,JVM的Xms和Xmx设置成一样大 避免在GC后调整堆大小时带来的额外压力
2.元空间
JDK8中使用元空间代替永久代
3.虚拟机栈
JVM是基于栈结构的运行环境。JVM中的虚拟机是描述Java方法执行的内存区域,他是线程私有的。包括如下4个组成部分:
局部变量表:没有准备阶段,必须显示初始化
操作栈
动态连接
方法返回地址:方法退出的过程相当于弹出当前栈帧。
4.本地方法栈也是线程对象私有的
5.程序计数寄存器:程序计数器在各个线程之间互不影响。
GC:垃圾回收,如果一个对象和GC Roots之间没有直接或者间接的引用关系是可以被回收的
“标记-清楚算法”
“标记-整理算法”
"mark-copy"作为主流的YGC算法进行新生代的垃圾回收。
回收器:
Serial:串行单线程,垃圾回收的某个阶段会暂停整个程序的运行(stop the word)。
CMS回收器:
数据结构与集合
集合转数组的时候 定义数组的长度和集合长度一样时 时间和空间最节省
如果自定义对象作为map的键 那么必须覆写hashcode和equals。
使用iterator机制进行遍历时的删除 如果是多并发 需要在iterator遍历时加锁
任何map中 尽量避免KV设为null hashmap kv不能为null concurrenthashmap不能为null
异常与日志
throw 是方法内部抛出具体异常对象的关键字 throws则用在方法signature上表示方法调用者可以通过此方法声明向上抛出异常对象
严禁捕获异常后什么都不做 或者仅仅打印异常日志
finaly块中不要对变量进行赋值操作和return操作 他的作用是清理资源 释放连接 关闭管道(lock,ThreadLocal,InputStream)
面向对象
慎用Object的clone()方法来拷贝对象,因为对象的clone()方发默认是浅拷贝,若想实现深拷贝,需要覆写clone()方法实现引用对象的深度遍历式拷贝。
当纠结是定义接口还是抽象类的时候 优先推荐定义为接口
内部类不能使用public 修饰
this和super都是关键字,起指代作用,在构造方法中必须出现在第一行,就是只能出现一个。
this:访问本类实例属性和方法;先找本类,没有则找父类;单独使用时,表示当前对象
super:由子类访问父类中的实例属性和方法;直接查找父类;在子类覆写父类方法时,访问父类同名方法
对序列化要有安全防范意识,对传入的数据内容进行校验或者权限控制
内存中的数据对象只有转化为二进制流才可以进行数据持久化和网络传输。
尽量不要使用可变参数,使用规则:相同参数类型,相同业务含义的参数,并且一个方法中只能有一个可变参数,并且一定要放到该方法的最后一个参数。建议不要使用Object作为可变参数。
构造方法被定义为private时,外部就没法通过私有构造方法来创建对象
接口中不能一定构造方法,抽象类中可以。枚举类中默认是private,是单例
静态代码块是先于构造方法执行的特殊代码
存储空间分配必须是8B的倍数
对象分为3块存储区域:
对象头 占用12B;实例数据;对齐填充;
8个包装类,除了Float和Double,其他包装数据类型都会缓存,6个包装类直接赋值时,就是调用对应包装类的静态工厂方法valueOf().在缓存内的比较可以使用== 但是缓存之外的不能使用==,所以推荐所有包装类对象之间值的比较全部使用equals()方法
包装类还是基本数据类型的选择:
POJO类的属性必须使用包装类;RPC方法的返回值和参数必须使用包装类数据类型;所以的局部变量推荐使用基本数据类型
stringbuffer是线程安全的 stringbuilder是非线程安全的。在循环体内,不推荐使用string直接相加。
通过string 相加 底层是new stringbuffer 所以在for循环中使用string相加 就是new N个多stringbuffer对象