面试常考知识点整理_2

1、http与https的区别?

(1) HTTP 明文传输,数据都是未加密的,安全性较差;HTTPS(HTTP+SSL) 数据传输过程是加密的,安全性较好。
(2) HTTP 页面响应速度比 HTTPS 快。主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包;而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
(3) http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
(4) HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以 HTTPS 比 HTTP 要更耗费服务器资源。
(5) 使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。

2、一个线程可以有几个Looper?几个Handler?

一个线程只能有一个Looper,可以创建无数个handler,但是他们使用的消息队列都是同一个,也就是同一个Looper。

3、currentHashMap和hashTable区别

(1) hashTable底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低。
(2) currentHashMap底层采用分段的数组+链表实现,线程安全,ConcurrentHashMap提供了与Hashtable和SynchronizedMap不同的锁机制。Hashtable中采用的锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap中则是一次锁住一个桶。ConcurrentHashMap默认将hash表分为16个桶,诸如get、put、remove等常用操作只锁住当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。
锁分段技术:首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

4、volatile如何保证线程可见性的?

对声明为volatile的变量进行写操作,JVM会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写会主存。其它处理器通过嗅探在总线上传播的数据来检查自己的缓存值是否过期了,当处理器发现自己缓存行对应的内存地址被修改时,就会设置当前缓存行为无效,需要对数据进行修改的时候会重新从主存中加载。
可见性:
当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
被volatile修饰的含义:
(1) 保证变量的可见性
(2) 禁止指令重排序

缓存一致性协议(MESI):
每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。

5、单例模式

保证一个类只有一个实例,并提供访问该实例的方法。

public class Singleton {
    private volatile static Singleton instance;
    private Singleton(){}
    public Singleton getInstance(){
        if(instance==null){
            synchronized (Singleton.class){
                if(instance==null)
                    instance=new Singleton();
            }
        }
        return instance;
    }
}

为什么需要双重验证?
第一次验证:当该实例已经创建则直接返回,若没有创建则进行创建。
第二次验证:比如当两个线程都执行完了第一个验证,此时有一个线程先进入了代码块进行创建,如果另一个线程不进行再一次验证则会进行第二次创建,从而不满足单例的要求。

6、java垃圾回收机制

https://www.cnblogs.com/kelelipeng/p/12613085.html

7、并行和并发

并行是指同时执行;并发是指交替执行。

8、常用的数据库引擎

InnoDB: InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),其它存储引擎都是非事务安全表,支持行锁定和外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
MyISAM: 拥有较高的插入、查询速度,但不支持事务,不支持外键,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。
MEMORY: 所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

9、 OSI七层模型,http协议在哪一层,http协议的端口,http协议的方法(post和get)

  • OSI七层模型:
    物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
    image.png
  • http协议在哪一层:
    http在应用层,tcp/udp在传输层
  • http协议的端口:
    http协议的端口为80
  • HTTP GET和POST请求的区别?
    相同点:
    GET和POST请求都是HTTP的请求方式,用户通过不同的http请求方式完成对资源(URL)的操作。GET、POST、PUT、DELETE对应着对这个资源的查、改、增、删四个操作,具体来讲GET一般用于获取、查询资源信息,而POST一般用于更新资源信息。
    区别:
    (1)GET请求提交的数据会在地址栏显示出来,而POST请求不会在地址栏中显示出来。GET请求提交的数据会附在URL之后,而POST请求提交的数据会放置在HTTP包的包体中。
    (2)GET请求由于浏览器对地址长度的限制而导致传输的数据有限制,而POST请求不会因为地址长度限制而导致传输数据限制。
    (3)POST的安全性比GET安全性高。
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容