==与equals有什么区别
- ==:对于基础类型,比较的是值的大小,对于对象,比较的是内存引用地址的值
- equals:对象的基础方法,只能比较对象,比较值是否相等
对象equals比较,为啥要重写hascode,string却不用
- 对象类型复杂,不像基础类型,需要用户重写equals判断是否相等,否则会使用父类的方法比较之后比较对象地址
public boolean equals(Object obj) {//object默认的方法
return (this == obj);
}
- hascode存在的意义:hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。最简陋的理解,当equals相等时,我们认为对象值相等,可以当成是一个东西,但是hascode可能是不同的,导致集合可能会存在多个。
- string已经默认重写的equals方法,只会比较值
static关键字是干什么用的
被static关键字修饰的内容都是静态的。
Java程序在JVM上运行时,JVM会根据程序的需要动态创建对象并存储对象(分配内存),对象使命结束后,对象会被垃圾回收器销毁;静态是指Java程序还没有运行时,JVM就会为加载的类分配空间存储被static关键字修饰的内容;如静态成员变量,Java类加载到JVM中,JVM会把类以及类的静态成员变量存储在方法区,方法区是线程共享且很少发生GC的区域,所以被static关键字修饰的内容都是全局共享的,且只会为其分配一次存储空间
可以用于单例模式、频繁创建与使用的方法
final关键字是干什么用的
- 修饰引用:引用为基本数据类型,则该引用为常量,该值无法修改。引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改
- 修饰方法:方法将成为最终方法,无法被子类重写
- 修饰类:该类成为最终类,无法被继承
- 变量的值一旦不可变,在多线程编程的环境下能保证线程安全,因为变量值不可变,也就不存在多个线程同时竞争资源的问题,代码自然是线程安全的
重写与重载的区别
- 重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。最常用的地方就是构造器的重载
- 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。
java的byte取值范围
- -128->127
- 计算方式:byte占一个字节 2^8,总共256个数。在计算机系统中,数值一律用补码来表示和存储。最高位是符号位,最大的正数是01111111,就是127,最大的负数是10000000,就是-128
为什么使用补码,因为使用原码时,要设计硬件区分符号位,比较绝对值大小。使用反码时,无需设计硬件比较大小,但零存在两种表示方法。使用补码,可以将符号位和数值域统一处理,很好的解决了原码和反码的问题。
hashMap与hashTable的区别
- 继承的父类不同,Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口
- Hashtable是线程安全的,HashMap是线程不安全的, Hashtable 中的方法是Synchronize的
- Hashtable中,key和value都不允许出现null值,hashMap允许
- 内部实现使用的数组初始化和扩容方式不同:HashTable在不指定容量的情况下的默认容量为11,而HashMap为16。Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
hashMap与hashSet的区别
都是线程不安全的,hashSet不允许出现重复值
hashMap线程安全代替
ConcurrentHashMap、HashTable
hashMap底层实现方式与原理
数组+链表or红黑树
ASCII、GBK、UFT-8、Unicaode的关系
- ASCII:英语字符与二进制位之间的关系,就是256个符号,从0000000到11111111
- Unicode:一种所有符号的编码。需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储
- Utf-8: UTF-8是Unicode的实现方式之一。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
- GBK:GBK编码专门bai用来解决中文编码,是双字节的。不论中英文都是双字节的。而UTF-8编码的中文使用了三个字节。可见如果是兼容性更高,可以直接使用uft-8更好些。
String、StringBuilder、StringBuffer区别
- String 是指字符串
- StringBuilder非线程安全字符串容器,效率比String+拼接方式高
- StringBuffer线程安全字符串容器
静态代理与动态代理
- 静态代理:程序运行前就已经编译好,程序知道谁来执行
- 动态代理:在程序运行期间才能确定,是基于反射实现的
int与Integer的区别
- int是基础数据类型,一个int4个字节,默认初始化为0
- Integer是基础数据类型包装类,是对象,有方法调用,初始化默认是null。int–>Integer叫装箱,反过来叫拆箱
设计模式
- 构造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
- 适配器模式:将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作
- 装饰者模式:动态地给一个对象添加一些额外的职责或功能,装饰者提供了比继承更有弹性
- 代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通称中介。
- 桥接模式:将抽象部分与它实现部分分离,使它们都可以独立地变化。(如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式,适合于多个维度)
- 组合模式:形成树形结构以表示“整体-部分”的结构层次
- 模板方法模式:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤
- 策略模式:定义了一组算法,将每个算法都封装起来,并且使它们之间可以切换
- 观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新
- 中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散。控制器就是这样的
- 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
- 责任链模式:发送请求时,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象能够处理它。
- 命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志。以及支持可撤销的操作
排序算法
- 冒泡排序
- 快速排序
- 插入排序
- 希尔排序
- 并归排序
- 堆排序
- 选择排序
- 基数排序
- 技术排序
- 桶排序
查找算法
- 顺序查找
- 二分法查找
- 裴波那契查找
常见的数据结构
- 数组
- 栈
- 队列
- 链表
- 树
- 散列表
- 堆
- 图
Object类一般有哪些方法
创建实例的方式
软引用、弱引用、虚引用-他们的特点及应用场景
参考
出现的初衷: 希望能描述这样一类对象:当内存空间还足够时,则能保留在内存之中;如果内存空间在进行垃圾收集后还是非常紧张,则可以抛弃这些对象。
http与https的区别
- http:超文本传输协议,计算机用于两点传输文字、图片、音频、视频等超文本数据的约定与规范。默认端口是80
- https:本质就是 http+TLS/SSL组合,通过秘钥交换算法-签名算法-对称加密算法-摘要算法,保证传输过程中不被监听与篡改。默认端口是443
get与post的区别
- get一般用于获取数据请求,post一般用于提交数据请求
- get会把请求参数放地址url上,post放请求body,post更安全些
- get请求url有长度限制,post请求body没有长度限制
- get在浏览器中会被浏览器主动缓存,post不会
- get请求是直接发送一个tcp数据包,浏览器直接把http header和data一起发送出去,服务器响应200返回数据;post会发送两个tcp数据包,览器先发送header,服务器响应100continue,浏览器再发送data,服务器再响应200返回数据
cookie与session区别与理解
- 理解:由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session。cookie 是一个实际存在的东西,http 协议中定义在 header 中的字段。可以认为是 session 的一种后端的状态实现
- Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
- Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
tcp与udp的区别
TCP的三次握手与四次挥手
浏览器地址栏输入URL发生了什么
- 浏览器的地址栏输入URL并按下回车。
- 浏览器查找当前URL是否存在缓存,并比较缓存是否过期,缓存没有过期直接使用缓存。
- DNS解析URL对应的IP。
首先浏览器先检查本地hosts文件是否有这个网址映射关系,如果有就调用这个IP地址映射,完成域名解析。 如果没找到则会查找本地DNS解析器缓存,如果查找到则返回。 如果还是没有找到则会查找本地DNS服务器,如果查找到则返回。 最后迭代查询,按根域服务器 ->顶级域,.com->第二层域,baidu.com ->子域,www.baidu.com的顺序找到IP地址
- 根据IP建立TCP连接(三次握手)。
- HTTP发起请求。
- 服务器处理请求,浏览器接收HTTP响应。
- 渲染页面,构建DOM树。
- 关闭TCP连接(四次挥手)。
参考更多
HTTPS中的工作流程
RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密
既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证