好久没有做知识总结了,以前也喜欢写博客 ,也该拾起来了,不断学习,终身学习,才能走的更远,加油
1、volatile关键字的理解(理解记忆)
:
被volatile修饰的共享变量,就具有了以下两点特性:
1.保证了不同线程对该变量操作的内存可见性
2.禁止指令重排序
2、Java创建对象的几种方式(记忆):
(1) 用new语句创建对象,这是最常见的创建对象的方法。
(2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
(3) 调用对象的clone()方法。
3、线性链表描述正确的是(记忆):
在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间
的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。
4、mysql的使用操作说法是->相当于mysql的优化(记忆)
(1)第一想到的就是建立索引 用索引来查数据的话效率会高一些;
(2)少用SELECT*:因为当我们select时,会增加web服务器的负担,增加网络传输的负载,查询速度自然就下降 ;
(3)使用NOT NULL
(4)避免在 where 子句中使用 or 来连接
(5)避免大数据量返回 :这里要考虑使用limit,来限制返回的数据量,如果每次返回大量自己不需要的数据,也会降低查询速度。
(6)where子句优化
5、mysql的代码模块的执行顺序(理解)
from->on->join->where->group by->having->count(聚合函数)->select->distinct->order by ->limit
6、hashmap的底层原理(记忆)
HashMap 的底层结构在 jdk1.7 中由数组+链表实现,在 jdk1.8 中由数组+链表+红黑树实现
Hashtable 扩容时,将容量变为原来的 2 倍加 1,而 HashMap 扩容时,将容量变为原来的 2 倍。
HashMap初始容量为16,加载因子0.75,当容量达到12的时候进行扩容
7、MySQL中可以查看和分析语句的执行情况的关键字(理解):
explain:用法 explain模拟Mysql优化器是如何执行SQL查询语句的,从而知道Mysql是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。
语法:Explain + SQL 语句;
如:Explain select * from user; 会生成如下 SQL 分析结果
8、Hash索引和B+tree索引的区别(记忆):
1、在查询速度上,如果是等值查询,那么Hash索引明显有绝对优势,因为只需要经过一次 Hash 算法即可找到相应的键值,复杂度为O(1);当然了,这个前提是键值都是唯一的。如果键值不是唯一(或存在Hash冲突),就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据,这时候复杂度会变成O(n),降低了Hash索引的查找效率。所以,Hash 索引通常不会用到重复值多的列上,比如列为性别、年龄的情况等(当然B+tree索引也不适合这种离散型低的字段上);
2、Hash 索引是无序的,如果是范围查询检索,这时候 Hash 索引就无法起到作用,即使原先是有序的键值,经过 Hash 算法后,也会变成不连续的了。因此
①、Hash 索引只支持等值比较查询、无法索成范围查询检索,B+tree索引的叶子节点形成有序链表,便于范围查询。
②、Hash 索引无法做 like ‘xxx%’ 这样的部分模糊查询,因为需要对 完整 key 做 Hash 计算,定位bucket。而 B+tree 索引具有最左前缀匹配,可以进行部分模糊查询。
③、Hash索引中存放的是经过Hash计算之后的Hash值,而且Hash值的大小关系并不一定和Hash运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算。B+tree 索引的叶子节点形成有序链表,可用于排序。
3、Hash 索引不支持多列联合索引,对于联合索引来说,Hash 索引在计算 Hash 值的时候是将索引键合并后再一起计算 Hash 值,不会针对每个索引单独计算 Hash 值。因此如果用到联合索引的一个或者几个索引时,联合索引无法被利用;
4、因为存在哈希碰撞问题,在有大量重复键值情况下,哈希索引的效率极低。B+tree 所有查询都要找到叶子节点,性能稳定;
9、进程和线程以及协程的定义描述(理解记忆):
协程不是被操作系统内核所管理的,而是完全由程序所控制,也就是在用户态执行,所以A正确。这样带来的好处是性能大幅度的提升,因为不会像线程切换那样消耗资源。
操作系统进行资源管理的最小单位是进程,操作系统的最小调度单位是线程,进程给线程提供执行环境。
协程不是进程也不是线程,而是一个特殊的函数,这个函数可以在某个地方挂起,并且可以重新在挂起处外继续运行。所以说,协程与进程、线程相比并不是一个维度的概念。
一个进程中可以有多个线程,而线程独有的资源有栈和寄存器和线程局部存储,简称TLS,其实就是个线程私有的全局变量。
10、Linux的命令记忆(记忆):
ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令,英文全称是network interfaces configuring。
iostat,用于报告中央处理器(CPU)统计信息和整个系统、适配器、tty 设备、磁盘和 CD-ROM 的输入/输出统计信息。
netstat是在内核中访问网络连接状态及其相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。
top 监视进程和Linux整体性能。
11、md5加密算法(记忆):
MD5 是摘要算法不是加密算法,两者的本质区别是:摘要算法是单向的,即明文可以通过摘要算法生成摘要结果,
但反之则不能通过摘要结果还原成明文。而加密算法是双向的,即可以从明文通过加密算法生成密文,
反之也可以通过解密算法将密文还原成明文。
所以,摘要算法主要用来检查明文是否发生过变动,而加密算法则用来传递不能让第三方知晓的内容。
12、多线程相关知识(记忆):
synchronized 协调多个线程对共享数据的存取
notify唤醒线程
sleep 让出cpu资源,不释放锁资源
wait 让出cpu,锁资源
yield:让出cpu调度,不能指定用户暂停多久,且只让给同优先级的线程
13、new String()在内存中是怎么分配的(理解)
“abc”保存在常量池,str引用的对象保存在堆里,而java7中又把常量池移到了堆中。
应该是AC,即是堆和字符串常量池中,当你new String(“abc”)时,其实会先在字符串常量区生成一个abc的对象,
然后new String()时会在堆中分配空间,然后此时会把字符串常量区中abc复制一个给堆中的String,
故abc应该在堆中和字符串常量区