京东一面 2021-3-17(电话面试题)

1Java基础

1你了解过的List?ArrayList && LinkedList区别?线程安全性?如何保证线程安全性?底层数据结构?

1 ArrayList:必须开辟连续的空间,查询快,增删慢。
2 LinkedList:无需开辟连续的空间,查询慢,增删快。
3 List是不安全的
4 解决方案1:CopyOnWriteArrayList:写入时赋值!多个调用者同时要求相同资源,他们会共同获取相同指针指向的相同资源,直到某个调用者试图修改资源时,系统才会真正复制一份专用副本给调用者,而其他调用者所见到的最初资源仍然保持不变。此做法的优点就是 如果调用者没有修改资源,就不会有副本的产生,所以进行读操作的时候 多个调用者可以共享同一份资源。
5 解决方案2:vector,vector底层使用synchronized 关键字来实现的,效率特别低下。CopyOnwriteArrayList底层使用的是lock锁,所以更加高效。
6 源码分析: ArrayList :默认容量大小==如果没有向集合中添加任何元素时,容量是0;添加一个元素之后容量为10;每次扩容为原来的1.5倍 LinkedList:链表实现

2你了解过的HashMap?线程安全性?如何保证线程安全性?底层数据结构?HashTable?

1 HashMap线程不安全
2 解决方案:concurrentHashMap,利用了锁分段的思想,jdk1.6:segment继承了ReentrantLock锁 jdk1.8:采用了CAS+Synchronized来保证并发的安全性。
3 底层数据结构: 数组+链表+红黑树;源码分析:默认的初始量为16;默认的加载因子是0.75 ;链表调整为红黑树的链表的长度阈值=8;红黑树调整为链表的长度阈值=6;链表调整为红黑树的数组长度=64;创建的HashMap对象没有分配容量,并不拥有默认的16个空间大小,这样做的目的是为了节约空间;
4 HashTable: 通过synchronized来实现线程安全,也是采用数组+链表的结构实现。不同于HashMap的是,初始化容量大小=11 ;

3HashMap允许用null作为key或是value,为什么会这样?HashTable不允许key值为null,也不允许value为null;那么HashMap的null是如何存储区的呢?

  public V put(K key, V value) {
    
    
        return putVal(hash(key), key, value, false, true);
    }
static final int hash(Object key) {
    
    
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

2MySQL索引机制

1索引的类型

1 普通索引:加快寻找,没有唯一性的限制,允许为null
2 唯一索引:{1主键索引:不可以为null 不能重复?
2唯一索引:不可以重复(行记录)
}
3联合索引
4前缀索引

2主键索引为什么只有一个?

因为主键从实现角度来看是一个 唯一 非空 聚类索引聚类索引在一个表中只有一个,所以主键只有一个至于为什么聚类索引在一个表中只有一个?是因为聚类索引表数据的物理顺序索引排序方式一致,而物理存储方式只有一种,所以聚类索引在一个表中只有一种

3索引为什么能过加快查询?

索引是用来查询那些具有特定值的记录。索引就是通过事先排好序,从而在查找时可以应用二分查找等高效率的算法。**索引的原理:**就是把无序的数据变成有序的查询;1把创建索引列的内容进行排序(索引列的排序);2对排序表生成倒排表;3在倒排表的内容上拼上数据地址链;4在插叙的时候,先拿到倒排表中的内容,再取出数据地址链,从而拿到具体数据。

4可以添加索引的列有哪些?

1查询较为频繁的列;2区分度较高的列;3定义有外键的列一定要建立索引;4尽量的扩展索引,不要新建索引;5更新频繁的列不可以;6查询很少涉及的列不可以;7定义为text image bit 数据类型的列不要建立索引;8重复值多的不可以;

5谈谈索引失效的情况?

1like 开头查询“%”开头的字段;2or前后没有同时使用索引;3组合索引,不使用第一列索引;4数据类型出现隐式转化,例如varchar;5索引字段使用范围查询如!= > <等;6对索引字段进行函授操作;7进行全表扫描速度大于索引速度时;

6对复合索引的了解情况?

我们在 (a,b,c)字段上建了一个联合索引,所以这个索引是先按a 再按b 再按c进行排列的
如果查询语句是:select * from table where a=1 and c=3;只会用到a索引
如果查询语句是:select * from table where b=2 and c=3; 最左前缀a,所以这个查询是没有用到索引的。
如果用到了最左前缀,但是顺序颠倒会用到索引码?select * from table where b=2 and a=1;select * from table where b=2 and a=1 and c=3; mysql查询优化器会判断纠正这条sql语句该以什么样的顺序执行效率最高,最后才生成真正的执行计划

7谈谈聚簇索引的了解?

聚簇索引:将数据跟索引放到一块,找到索引也就找到了数据;非聚簇索引:将数据跟索引分开的结构

8索引使用到的数据结构?

B树 Hash;InnoDB存储引擎的默认索引实现为:B+树索引;哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;

9B+与B的区别?

1 在B树中,你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值;2 B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。

2使用B树的好处
B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率。这种特性使得B树在特定数据重复多次查询的场景中更加高效。

3使用B+树的好处
由于B+树的内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更多的键,有利于更快地缩小查找范围B+树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历,这会需要更多的内存置换次数,因此也就需要花费更多的时间

3MySQL的引擎机制?

Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统;MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。

4请你谈谈MySQL的事务?

原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
一致性(Consistency)
事务前后数据的完整性必须保持一致
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
隔离性(Isolation)
事务的隔离性是并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

5请你谈谈线程创建的方式?

1 继承 Thread 类;2 实现 Runnable 接口;3 实现 Callable 接口;4 使用 Executors 工具类创建线程池**【ThreadPool来创建】**

6 redis的基本数据类型?

字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)

7redis持久化方式?

1两种?

RDB(Redis DataBase);AOF(Append Only File)

2分别介绍一下这两种?

RDB:在一定的时间间隔内将内存中的数据集体快照写入磁盘,也就是行话讲的SnapShot,它恢复时候是将快照文件直接读到内存中。
过程:reids还会单独的fork一个子进程来进行持久化,会先将数据写入一个持久化的临时文件,待持久化过程结束了,再用这个临时文件代替上次持久化好的文件。整个过程主进程是不进行IO的,这就确保了极高的性能,进行大规模的数据恢复,且对数据的完整性要求不是很敏感,RDB是比AOF要高效的,RDB的缺点就是最后一次持久化数据可能会丢失。redis默认的就是RDB。RDB的保存文件是dump.rdb,这个名字是可以通过filename来重新设置的。

优点:
1 适合大规模的数据恢复!2 对数据的完整性要不高! 3 只有一个文件 dump.rdb,方便持久化。 4 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能 5 相对于数据集大时,比 AOF 的启动效率更高

缺点:
1 需要一定的时间间隔进行操作!如果redis意外宕机了,这个最后一次修改数据就没有的了! 2 fork进程的时候,会占用一定的内存空间!!

AOF:将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。 当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。 AOF保存的是 appendonly.aof 文件;默认是不开启的,我们需要手动进行配置!

猜你喜欢

转载自blog.csdn.net/zs18753479279/article/details/114964590