- 正数的原码、反码、补码相同,符号位为0,负数的符号位为1,反码符号位不变,其他位取反,补码在反码基础上加1。二进制整数最终都是以补码形式出现的。
- 二进制位运算:
1. 按位取反 :~
2. 与:&
3. 或:|
4. 异或:^ ,相同为0,不同为1 - cpu:运算器、存储器、控制器、输入设备、输出设备
- TCP/IP(OSI已被淘汰):应用层(http/ftp)-> 传输层(端口tcp/udp)-> 网络层(ip)-> 链路层(MAC地址)-> 物理层
程序在发送消息时,应用层按既定的协议打包数据,随后由传输层加上端口,由网络层加上ip地址,由链路层加上mac地址后进行数据传输。 - 三次握手主要是用ack确认机制(四次挥手断开连接)
- sql注入
使用了字符串拼接的方式,这样可能导致一些请求里面含有恶意的sql语句
解决办法,mybatis使用#{},占位符的方式 - xss(cross-site scripting)跨站脚本攻击
用户执行了恶意的脚本
解决办法:
1. 使用spring的HtmlUtils对用户输入的字符串做html转义
2. 使用innerText(它会去除html标签),而不是使用innerHTML - csrf (cross-site request forgery)跨站请求伪造
黑客盗用了用户的登录信息,冒充用户进行操作
解决办法:
1. 鉴权,验证页面中或者cookie中的token
2. 人机交互,用手机验证码校验 - xss是用户执行了恶意的代码,csrf是用户的信息被盗用,黑客借此执行恶意操作。
-
内部类
- 静态内部类
- 成员内部类
- 局部内部类
- 匿名内部类
内部类引用:外部类$内部类
protected:包外子类
嵌套循环退出外层循环使用标记位: c: break/continue c
-
重写:一大两小两同
子类的访问权限控制符只能相同或更大,子类抛出的异常或者返回类型只能更小,且要有继承关系,方法名和形参相同 -
成员变量有默认值,局部变量没有默认值且必须在声明的时候就初始化
-
int 默认值是0,Integer默认值是null
-
byte,short,int,long可以缓存 -128 ~ 127; char缓存0 ~ 127; boolean、float、double无缓存(包装类一样)
-
且Integer是唯一可以调整缓存范围的包装类,在vm options中加入参数
-
pojo以及返回类型和形参都使用包装类,局部变量使用基本类型
-
String是不可以修改的,每当改变时,若改变后的值在常量池中没有,都会创建一个新的String对象,然后引用重新指向新的对象,
并会将新的String对象缓存进常量池中,StringBuffer和StringBuilder则是在原来的对象上进行修改,StringBuilder线程不安全,效率高。
嵌套循环不要超过三层
第四章 走进jvm- 字节码
- javac将源文件编译成.class字节码文件,然后用java解释运行在jvm上,字节码是二进制形式的,但是还不可以直接在cpu上运行,要经过
- java所有的指令有200个左右,一个字节8位可以表示为256种不同的指令信息,这样一个字节称为字节码,就是一个字节可以表示一个指令信息,正好可以把所有的java指令表示完全。
- 类加载过程:双亲委派模型
1. 从上到下:根类加载器–扩展类加载器–应用程序类加载器(classpath下的)–用户自定义加载器
2. 低层次的当前类加载器不能覆盖高层次类加载器已经加载的类
3. 加载过程是低层次的类加载器逐级向上询问,上级的类加载器没有加载过此类并且也不能加载此类才由当前这个低级别的类加载器加载此类,假如曾经加载过或者可以加载,则继续向更高层次的类加载器询问,直到更高层次的类加载器没加载过且这次也不能加载,则由下级别的类加载器加载,如果一直到最上面,根类加载器可以加载,就由跟类加载器进行加载。简而言之就是上面的类加载器加载不了才会由下面的类加载器加载,这是为了防止一些java自带的类被覆盖失去作用。
4. 根类加载器是由c/c++实现,其他类加载器是由java实现 - 一个类所有父类的静态代码块和静态赋值语句都会执行
- JVM内存布局
OutOfMemoryError



