java 基础知识点

1.缓存使用了哪些?
Ehcache,redis等


2.java里面,线程和多线程是怎么理解的?
单线程是一个一个线程顺序执行,一个线程只有当前一个线程执行完之后才能执行。这种方法可以会导致当某个线程等待响应的时间特别长时,下一个线程需要一直等待,而这时CPU处于空闲。
多线程是一个时间段一个时间段的执行各个线程,每个线程之间切换执行,这就不存在上面说的某个线程处于等待时CPU却是空闲的情况,但多线程也会多出线程切换产生的性能开销。
所以当比较单线程和多线程哪个更快时,就是对上面两者之间开销的比较。一般来说多核时多线程的性能更好,单核时单线程更强。

通俗来说,单线程就是一个人做一件事,多线程是多个人做同一件事。

对于多个单线程的进程来说,它们之间的内存块是相互独立的,这样进程之间的通信很不方便;但是对于一个多线程的进程来说,新开辟的线程并不分配新的内存空间,而是与原来的线程共享内存空间,这样,线程之间的通信很方便,程序执行速度更快。


3.线程池的创建方式?

Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

 

4.线程池的维护有什么重要的指标?

  • corePoolSize线程池中的核心线程数
  • maximumPoolSize线程池中的最大线程数
  • keepAliveTime线程池中的线程存活时间(准确来说应该是没有任务执行时的回收时间,后面会分析)
  • unit时间单位
  • workQueue来不及执行的任务存放的阻塞队列
  • threadFactory新建woker线程(注意不是我们提交的任务)是进行一些属性设置,比如线程名,优先级等等,有默认实现。
  • handler 任务拒绝策略,当运行线程数已达到maximumPoolSize,队列也已经装满时会调用该参数拒绝任务,有默认实现。

1如果运行的线程少于corePoolSize,则Executor始终首选添加新的线程,而不进行排队.
2如果运行的线程等于或多于corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程.
3如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝.

 

5.线程池的策略和阻塞队列

Java-五种线程池,四种拒绝策略,三种阻塞队列(常用)

三种阻塞队列:
    BlockingQueue<Runnable> workQueue = null;
    workQueue = new ArrayBlockingQueue<>(5);//基于数组的先进先出队列,有界
    workQueue = new LinkedBlockingQueue<>();//基于链表的先进先出队列,无界
    workQueue = new SynchronousQueue<>();//无缓冲的等待队列,无界
四种拒绝策略:
    RejectedExecutionHandler rejected = null;
    rejected = new ThreadPoolExecutor.AbortPolicy();//默认,队列满了丢任务抛出异常
    rejected = new ThreadPoolExecutor.DiscardPolicy();//队列满了丢任务不异常
    rejected = new ThreadPoolExecutor.DiscardOldestPolicy();//将最早进入队列的任务删,之后再尝试加入队列
    rejected = new ThreadPoolExecutor.CallerRunsPolicy();//如果添加到线程池失败,那么主线程会自己去执行该任务
五种线程池:
    ExecutorService threadPool = null;
    threadPool = Executors.newCachedThreadPool();//有缓冲的线程池,线程数 JVM 控制阻塞队列使用的是SynchronousQueue
    threadPool = Executors.newFixedThreadPool(3);//固定大小的线程池,阻塞队列使用的是LinkedBlockingQueue
    threadPool = Executors.newScheduledThreadPool(2);//定时任务功能的线程池
    threadPool = Executors.newSingleThreadExecutor();//单线程的线程池,只有一个线程在工作,阻塞队列使用的是LinkedBlockingQueue
    threadPool = new ThreadPoolExecutor();//默认线程池,可控制参数比较多   


6.哈希map的实现结构是怎么样的?

https://blog.csdn.net/samniwu/article/details/90550196

https://blog.csdn.net/xunwei0303/article/details/80318485

https://www.cnblogs.com/chengxiao/p/6059914.html

HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。

//HashMap的主干数组,可以看到就是一个Entry数组,初始值为空数组{},主干数组的长度一定是2的次幂,至于为什么这么做,后面会有详细分析。
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

 Entry是HashMap中的一个静态内部类

 简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。


7.java里面,反射的概念?

反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有属性和方法。

  • 可以在运行时判断任意一个对象所属的类。
  • 可以在运行时判断任意一个类所具有的成员变量和方法。
  • 可以在运行时任意调用一个对象的方法
  • 可以在运行时构造任意一个类的对象

Java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息

Java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类(包括类和接口)的信息。当一个类或接口被装入的JVM时便会产生一个与之关联的java.lang.Class对象,可以通过这个Class对象对被装入类的详细信息进行访问。

虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。

 为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,  

       静态编译:在编译时确定类型,绑定对象,即通过。  

       动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。  

       一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发。

它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。

 

8.mysql表字段的索引类型?

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

建立索引会占用磁盘空间的索引文件。

Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。

1. FULLTEXT

即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。

全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。

2. HASH

由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。

HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。

3. BTREE

BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。

4. RTREE

RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。

相对于BTREE,RTREE的优势在于范围查找。

索引种类

  • 普通索引:仅加速查询

  • 唯一索引:加速查询 + 列值唯一(可以有null),MySQL数据库索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一

  • 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个,它是一种特殊的唯一索引,不允许有空值

  • 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并

  • 全文索引:对文本的内容进行分词,进行搜索

 

9.索引的底层实现?

https://www.cnblogs.com/tilamisu007/p/9293713.html

https://blog.csdn.net/qq_40241957/article/details/86426027


10.怎么样去分析一个慢查询?

https://blog.csdn.net/zheng0518/article/details/51675274

https://www.cnblogs.com/xk920/p/11132038.html

explain + 查询SQL - 用于显示SQL执行信息参数,根据参考信息可以进行SQL优化

11.oracle按F5,分析出来的结果,哪些结果是比较看重的?
12.mysql的事务特性,特点?

事务操作具有严格的定义,它必须满足ACID:

ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

(1)原子性: 原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

(2)一致性:一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

(3)隔离性:隔离性是指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被企图进行修改的事务看到 。

(4)持久性:持久性是指在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。 即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中

 

13.事务的隔离级别?

第一种隔离级别:Read uncommitted(读未提交)
如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据

解决了更新丢失,但还是可能会出现脏读

第二种隔离级别:Read committed(读提交)
如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

解决了更新丢失和脏读问题

第三种隔离级别:Repeatable read(可重复读取)
可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。

解决了更新丢失、脏读、不可重复读、但是还会出现幻读

第四种隔离级别:Serializable(可序化)
提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读

解决了更新丢失、脏读、不可重复读、幻读(虚读)

以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低,像Serializeble这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况来,在MYSQL数据库中默认的隔离级别是Repeatable read(可重复读)。

在MYSQL数据库中,支持上面四种隔离级别,默认的为Repeatable read(可重复读);而在Oracle数据库中,只支持Serializeble(串行化)级别和Read committed(读已提交)这两种级别,其中默认的为Read committed级别

在MYSQL数据库中查看当前事务的隔离级别

SELECT @@tx_isolation;

在MYSQL数据库中设置事务的隔离级别:

set tx_isolation='隔离级别名称'
设置数据库的隔离级别一定要是在开启事务之前

 

14.redis的常用数据结构?

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

而且Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。

在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

  • string 数据类型

string 是Redis的最基本的数据类型,可以理解为与 Memcached 一模一样的类型,一个key 对应一个 value。string 类型是二进制安全的,意思是 Redis 的 string 可以包含任何数据,比如图片或者序列化的对象,一个 redis 中字符串 value 最多可以是 512M。

  • hash 数据类型

hash 是一个键值对集合,是一个 string 类型的 key和 value 的映射表,key 还是key,但是value是一个键值对(key-value)。类比于 Java里面的 Map<String,Map<String,Object>> 集合。

  • list 数据类型

list 列表,它是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边),它的底层实际上是个链表。

  • set 数据类型

Redis 的 set 是 string 类型的无序集合。

  • zset 数据类型

zset(sorted set 有序集合),和上面的set 数据类型一样,也是 string 类型元素的集合,但是它是有序的。

 

15.redis架构层别的话非常高效的内存数据,哪些操作使的它非常的高效?

为什么高效:

    1、完全基于内存,大多数请求都是内存操作,非常快速;

    2、数据结构简单,操作简单;

    3、采用单线程,避免了不必要的上下文切换和竞争条件,不存在多进程或者多线程的切换,不用考虑锁带来的性能消耗; 

    4、使用多路 I/O复用模型,非阻塞 IO

应用场景:   

     缓存(数据查询、热点数据、商品数据、短连接、新闻内容等。(最多使用)

     单点登录SSO,session共享

     任务队列(秒杀、抢购、12306等等)

     数据过期处理(可以精确到毫秒)

     网站访问排名…应用排行榜

     网站访问统计

     聊天在线好友列表

性能瓶颈

    1、机器内存大小

          内存大小关系到Redis存储的数据量

     2、网络带宽

          Redis客户端执行一条命令分为四个过程:发送命令、命令排队、命令执行、返回结果。

         其中发送命令+返回结果这一过程被称为Round Trip Time(RTT 往返时间)

          Redis的客户端和服务端可能部署在不同的机器上: 例如客户端在北京,Redis服务端在上海,两地直线距离约为1300公里,那么1次RTT时间=1300×2/(300000×2/3)=13毫秒(光在真空中传输速度为每秒30万公里,这里假设光纤为光速的2/3),那么客户端在1秒内大约只能执行80次左右的命令,这就和Redis的高并发高吞吐特性背道而驰啦。

         所以一般情况下,都是就近部署

 

16.redis是单线程执行还是多线程执行?

redis是单线程,线程安全

redis可以能够快速执行的原因:

(1) 绝大部分请求是纯粹的内存操作(非常快速)
(2) 采用单线程,避免了不必要的上下文切换和竞争条件
(3) 非阻塞IO - IO多路复用(IO 多路复用是什么意思?

IO多路复用中有三种方式:select,poll,epoll。需要注意的是,select,poll是线程不安全的,epoll是线程安全的

redis内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间 这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能可想而知了。应该说redis为特殊的场景选择了合适的技术方案。

https://www.cnblogs.com/caohongchang/p/13285948.html

 

17.使用redis构建一个简单的消息队列,会使用哪种数据类型?

使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。


18.消息队列


19.网络协议,TCP/IP属于哪个层级


20.客户端和服务端进行连接,是怎么进行通信的?

三次握手,四次挥手

三次握手:A发生消息给B,请求连接;B接收到A的请求,允许A过来连接;A收到B的允许连接指令,进行连接;

四次挥手:A发送消息给B,取消连接;B接收到A的请求,允许取消连接,并开始准备取消连接;B发消息给A,已经准备好取消连接;A收到B准备好取消连接的指令,取消连接;


21.http协议和https协议有什么区别?

http协议bai和https协议的区别:传输信du息安全性不同、连接方式zhi不同dao、端口不同、证书内申请方式不同

一、传输信息容安全性不同

1、http协议:是超文本传输协议,信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。

2、https协议:是具有安全性的ssl加密传输协议,为浏览器和服务器之间的通信加密,确保数据传输的安全。

二、连接方式不同

1、http协议:http的连接很简单,是无状态的。

2、https协议:是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。

三、端口不同

1、http协议:使用的端口是80。

2、https协议:使用的端口是443.

四、证书申请方式不同

1、http协议:免费申请。

2、https协议:需要到ca申请证书,一般免费证书很少,需要交费。

 

22.证书在哪个端口上的?

一般是443端口


23.常见的排序算法有哪些?

https://www.cnblogs.com/hokky/p/8529042.html

冒泡算法、选择排序、插入排序、希尔排序、归并排序、快速排序

冒泡排序: 从第一个数开始,相邻元素两两对比,小的数放前面。(每循环一次,最后一个数都会被确定下来,为每轮的最大数)

选择排序:从第一个数开始,循环一圈找最小的数交换位置。(每循环一圈,第一个数都会被确定下来,为每轮最小的值)

插入排序:从第二个数开始,跟前一个数比较,若比前一个数小,则交换位置,接着跟前一个数比较,直到比前一个数大为止。(从第一张开始整理扑克牌,小的往前插)(可能会出现一个数从最后比较到最前面,比较费时)

希尔排序:希尔排序属于插入类排序,是将整个有序序列分割成若干个小的子序列分别进行插入排序。
    排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序,然后取d2<d1,重复上述分组和排序操作,直至d1=1,即所有记录放进一个组中排序为止。(将每间隔一定步距的数取出来进行比较,比如gap=5,就是把第1个、第6个、第11个...数取出来进行插入排序)
    优点:当n值很大时,数据项每一趟排序需要移动的个数很少,但数据项的距离很长;当n值减小时,每一趟需要移动的数据增多,此时已经接近于它们排序后的最终位置。
    希尔分析:
        希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。

归并排序: 归并排序有两种实现方法:自上而下的递归;自下而上的迭代。下面讲递归法:
    将原数组用二分法一直分到两个数为一组,然后通过比较将较小的数放到前面(通过一个中间数组排序);然后一层层向上排序。
    (就是两个数比较进行排序,然后两组(四个数)进行比较排序,然后两组(八个数)进行比较排序…)

快速排序:快速排序思想:先找到一个基准点(一般指数组的中部),然后数组被该基准点分为两部分,依次与该基准点数据比较,如果比它小,放左边;反之,放右边。 左右分别用一个空数组去存储比较后的数据。最后递归执行上述操作,直到数组长度<=1。
    特点:快速,常用。缺点是需要另外声明两个数组,浪费了内存空间资源。


24.快速排序是怎样实现的?

该方法的基本思想是:

1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。

 

25.字符串查找算法有哪些?在一个母串里面查找到其中的字串

https://blog.csdn.net/weixin_34185364/article/details/88765776


26.线程的算法?

 

了解多线程
熟悉分布式、高并发、高可用
缓存
消息队列
JVM
内存模型
类加载机制
性能优化
OOD
AOP
设计模式

TCP/HTTP/SOCKET等通讯协议
并发/安全/IO/集合/泛型/反射/代理/
框架的使用和基础的原理,实现机制
设计模式,2-3种深刻理解
优化索引
restful架构设计

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值