1.数据结构:
数组、链表、栈、队列、数
2.jmm内存模型:
jmm java memory model java内存模型
volatile具备两种特性,第一就是保证共享变量对所有线程的可见性。将一个共享变量声明为volatile后,会有以下效应:
1.当写一个volatile变量时,JMM会把该线程对应的本地内存中的变量强制刷新到主内存中去;
2.这个写操作会导致其他线程中的缓存无效。
3.jvm内存模型:
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
4.java垃圾回收机制
答:java垃圾回收机不是一直运行,只有达到了触发条件才会启动。
通常两种情况下,会自动触发java垃圾回收机。
(1)cpu空闲
gc线程(垃圾回收器线程)执行的优先级最低。当cpu空闲时,才会轮到gc线程执行。
(2)java堆内存不足
当jvm堆内存不足时,gc会自动执行,清理过期对象和垃圾,释放内存空间。当一次清理之后,内存仍然不足时,gc会重复执行。
需要指出的是,当堆内存超出堆内存上限时,会发生内存泄漏(out of memory),抛出异常,程序执行结束。
5.hashmap和hashtable区别,hashtable为什么是线程安全的
hashmap:底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低
hashmap:底层数组+链表实现,可以存储null键和null值,线程不安全
6.arraylist和linkedlist区别
底层数据节后,arraylist是数组,linkedlist是链表,物理上有序 和逻辑上有序
7.redis数据库有哪几种数据类型
String list set sortedset hash
8.数据库优化
答:索引的作用是避免全表扫描,提高查询效率。
索引的原理:二分查找,折半查询。
索引的应用场景:
(1)经常查询的列,才需要建索引。
(2)大文本的列不要建索引,因为索引会额外占用内存空间;
(3)值不唯一的列,不要建索引。索引要排序,值不唯一的情况下,数据库需要额外建一个序列,去维护这个排序。
联合索引是同时对两个或多个列建立索引。
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。(了解即可)