1.http和https
什么是http:
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法
什么是https:
HTTPS是身披SSL外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
两者最大的区别就是,https具有更好的安全性
2. == 和equals的区别
Object的==和equals比较的都是地址,作用相同
== | equals |
---|---|
a) 基本类型,比较的是值 b) 引用类型,比较的是地址 不能比较不同的两个对象 | a) 系统类一般已经覆盖了equals(),比较的是内容。 b) 用户自定义类如果没有覆盖equals(),将调用父类的equals (比如是Object),而Object的equals的比较是地址(return (this == obj);) c) 用户自定义类需要覆盖父类的equals() |
基本类型有:byte、short、int、long、float、double、boolean、char
引用类型:将基本类型进行了封装,有Byte、Short、Integer、Long、Float、Double、Character、Boolean。引用类型是一种对象类型,它的值是指向内存空间的引用,就是地址。
示例:
// 基础数据类型用 == 比较
int a = 2;
int b = 2;
System.out.println(a == b);
// 运行结果是 true
// 引用类型用 == 比较
Integer a = 2;
Integer b = 2;
System.out.println(a == b); //true
Integer a = new Integer(2);
Integer b = new Integer(2);
System.out.println(a == b); //false
Integer a = 2;
Integer b = new Integer(2);
System.out.println(a == b); //false
Integer a = new Integer(2);
int b = 2;
System.out.println(a == b); //true
Integer a = 2;
int b = 2;
System.out.println(a == b); //true
// 为什么会有这样的结果呢.因为基础数据类型和引用类型之间会通过自动装箱和自动拆箱进行相互转换。Integer a = 2 会进行自动装箱,调用了Integer.valueOf(2)。将值放入缓存,第一种两个值都在缓存中,可进行比较,所以返回true。第三种情况,由于new了对象新对象,存储地址不同了。
// Integer.valueOf()的定义
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
3. HashMap实现原理
hashmap是基于哈希表的Map接口非同步实现的。实际上是一个“链表散列”的数据结构,也就是数组和链表的结合。
hashmap底层就是一个数组,数组的每个元素又是一个链表。
存 — put(k, v):
当程序试图将一个key-value对放入HashMap中时,程序首先根据该 key的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry的 value,但key不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部
取— get(k):
get元素时,首先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。
4.&和&&的区别
①&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
②&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“ ”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x == 33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长
③&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。
5. .super.getClass()方法调用
得到的是父类对象