总结一下面试中经常被问到的面试题,希望对各位初中级同胞有用。
总结一下面试中经常被问到的面试题,希望对各位初中级同胞有用。
我会时常更新!!!!
- Java的基本数据类型
- byte 1;
- char 2;
- short 2;
- int 4;
- float 4 ;
- double 8;
- long 8;
- boolean 1,;
- String 是引用类型,底层用 char 数组实现的。
- HashMap、LinkedHashMap、TreeMap的区别
- HashMap、LinkedHashMap、TreeMap都属于Map;
- Map是键值对的形式,允许值重复,不允许键重复;
- HashMap是一个最常用的Map,根据键的Hash Code值存储数据,根据键可以直接获取他的值,具有最快的访问速度;
- LInkedHashMap也是一个HashMap,但是内部是一个双向链表,可以保证顺序;
- TreeMap不仅可以保持顺序,还可以用于排序:
- HashMap可实现快速存储和检索,但其缺点是其包含的元素是无序的,这导致它在存在大量迭代的情况下表现不佳;
- LinkedHashMap保留了HashMap的优势,且其包含的元素是有序的。它在有大量迭代的情况下表现更好;
- TreeMap能便捷的实现对其内部元素的各种排序,但其一般性能比前两种map差。
- 对象创建的过程
- new 类名
- 根据new的参数在常量池中定位一个类的符号
- 如果没有找到这个符号的引用,说明这个类没有被加载,则进行类的加载、解析、初始化
- 虚拟机将为对象分配内存
- 将分配的内存初始化为零值(不包含对象头)
- 调用对象的 init 方法
- 红黑树
- 特殊的二叉查找树
- 红黑树特性:
- 每个节点必须是黑色或者是红色;
- 根节点必须是黑色;
- 叶子节点必须是黑色;
- 如果一个节点是红色,那么他的子节点或则父节点一定是黑色;
- 每一个节点到它的所有的叶子节点所包含的黑色节点数目是相同的;
- 变换规则:所有插入的点默认为红色
- 变色:本节点和父节点为红色,并且叔节点也为红色,即将父节点和叔节点变为黑色,祖父节点变为红色;
- 左旋:本节点和父节点都为红色,叔节点为黑色,并且本节点位于父节点的右子节点,即左旋;
- 右旋:本节点的父节点是红色,叔节点是黑色,且本节点位于父节点的左子节点 ,即进行右旋;
- 右旋规则:
- 把父节点变成黑色;
- 把祖父节点变成红色;
- 以祖父节点进行旋转;
- HashMap和Hash Table的区别
- 主要区别:线程安全性、同步、速度
- HashMap时非同步的(使用 Collection.synchronzeMap(hashMap)实现同步),而HashTable是同步的,意味着HashTable是线程安全的;HashMap不能保证随着时间的推移,Map的中的元素顺序不变(保持顺序不变,使用LinkedHashMap);
- HashMap可以接收null的键值对,HashTable不行;
- HashMap的迭代器是fail-fast迭代器(集合中的一种错误机制,当多个线程对同一个集合进行操作的时候,就会产生fiil-fast事件),当有其他线程改变Hash Map的结构(例如增加或者移除数据),就会抛出异常
- HashTable是线程安全的,同时也是同步的,所以在单线程的情况下比Hash Map要慢。
- HashMap扩容
- map填满75%的bucket的是时候,就会创建原来两倍大小的Bucket数组,将原来的对象放入新的Bucket数组,这个过程叫做rehashing,因为调用了hash的方法找到新的Bucket的位置,多线程的情况下会产生条件竞争。
- HashSet
- HashSet实现了Set接口,不允许集合中有重复的值。
- 当我们将对象存储在HashSet之前,要先确定对象重写了equals()和hashcode()方法,这样我们才能比较对象的值是否相等,以确保set中没有存储相等的对象。
- HashMap和HashSet的区别
- HashMap 实现Map接口,HashSet实现Set接口;
- HashMap储存键值对,HashSet仅存储对象;
- 使用put()方法将元素放入map中,HashSet使用add()将元素放入set中;
- HashMap通过键对象来计算hashcode值,HashSet使用成员对象来计算hashcode的值。
- 抽象类和接口的区别
- 成员区别:抽象类成员可以是局部变量或者常量,拥有构造方法,可以抽象方法和非抽象方法,接口的成员变量只能是常量,没有构造方法,都是抽象方法;
- 关系区别:抽象类--extends,只能单继承或者多继承。接口--implements,可以多实现。
- 接口只能public。抽象类体现共性功能,接口体现在拓展功能。
- final、finally、finalize的区别
- final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,修饰的类不能继承;
- finally:用于异常处理语句,表示总执行;
- finalize:Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供的垃圾收集时的其他资源回收,例如关闭文件等。
- 使交替执行的线程按顺序执行
- Thread.join,把指定的线程加入到当前线程,可以将交替执行的线程按顺序执行;
- t.join();//调用join方法,等待线程t执行完毕;
- t.join(1000);//等待t线程,等待时间时1000毫秒;
- 多线程创建的方式
- 继承Thread类; 启动线程唯一方法是通过Thread类的start() 方法;
- 实现Runnable接口;调用run()方法;
- 实现Callable接口;可返回的值的任务必须实现Callable接口。
- Java中wait()和sleep()的区别
- 等待的时候wait()会释放锁,而sleep()一直持有锁。wait通常用于线程间的交互,sleep通常用于暂停执行;
- Java 的多线程锁是挂在对象上的,并不是在方法上的。
- synchronized 和 volatile 关键字的作用。
- 共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就会具备两种语义:
- 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这个新值对其他线程时立即可见的;
- 禁止进行指令重排序;
- volatile仅能对变量;
- volatile实现变量的修改性和可见性,不能保证原子性;
- volatile不会造成线程的阻塞;
- volatile标记的变量不会被编译器优化;
- synchronized 时锁定当前变量,只有当前线程可以访问该变量,其他线程会被阻塞;
- synchronized 可以使用在变量、方法、类;
- synchronized可以保证变量的修改性和原子性;
- synchronized可能会造成线程的阻塞;
- synchronized 标记的变量可以被编译器优化;
- 线程池的作用
- 降低资源消耗:通过重复利用已创建的线程降低创建和销毁造成的消耗;
- 提高相应速度:当有任务的时候,任务可以不需要等待线程创建就能立即执行;
- 提高线程的可管理性:线程时稀缺资源,无限制的创建,会造成资源浪费和降低系统的稳定性,使用线程池可以进行统一分配,调优可监控;
- 常见的线程池有哪些,特点以及方法
- newSingleThreadExecutor:创建一个单线程的线程池,此线程池可以保证所有的任务的执行顺序按照任务的提交顺序执行;
- newFixedThreadPool:创建固定大小的线程池,每次提交一个任务就创建一个线程,直到达到线程池的最大范围;
- newCachedThreadPool:创建一个可缓存的线程池,此线程池不会对线程池的大小作限制,依赖于操作系统的属性;
- newScheduledThreadPool:创建一个无限大小的线程池,支持定时以及周期性的执行。
- 线程的可用状态及生命周期
- 就绪:线程准备运行;
- 运行中:进程正在执行线程的代码;
- 等待中:线程处于阻塞的状态,等待外部的处理结束;
- 休眠中:线程被强制睡眠;
- 死亡:线程完成了执行。
- 锁 以及锁的作用
- 锁就是对象;
- 锁的作用的保证线程同步,解决线程安全的问题;
- 什么情况下会导致线程死锁,遇到线程死锁该怎么解决
- 指多个线程因竞争资源而造成的一种僵局(互相等待),若没有外力,这些进程都无法继续推进
- 产生条件:
- 互斥条件:线程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个资源所占有;
- 不剥夺条件:线程所获得的资源在未使用完毕之前,不能被其他线程夺走,只能由该线程主动释放;
- 请求和保持条件:线程已经保持了至少一个资源,但又提出可新的资源请求,而该资源又被其他线程占有,此时请求进程被阻塞,但是对自己获得的资源保持不放;
- 循环等待条件:存在一种线程等待链,链中的每一个线程以获得的资源同时被链中的下一个线程所请求。
- 如何避免:
- 加锁顺序:线程按照一定的顺序加锁;
- 加锁时限:线程获取锁的时候加上时限,超时就放弃对锁的请求,并释放自己占有的锁;
- Java反射机制
- Java 反射机制是运行状态中,对于任意一个类,能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法, 这种动态获取的信息以及动态调用对象方法的功能称为反射。
- 获取字节码有三种方法:
- 根据类名:类名.class
- 根据对象:对象.getClass()
- 根据全限定类名:Class.forName(全限 定类名)
- 垃圾回收机制算法
- 标记/清除算法:内存中的对象构成一棵树,当有效的内存被耗尽的时候,程序就会停止。
- 标记:标记从树根可达的对象;
- 清除:清除不可达的对象;
- 复制算法:把内存分成两个区域,空闲区域和活动区域 (速度快但是耗费空间)
- 标记可达的对象,然后将可达的对象复制到空闲区,空闲区变成活动区;
- 同时将以前的 活动区里面剩余的对象清除掉,将活动区变成空闲区;
- 标记整理算法:标记谁是活跃对象,然后进行整理,会把内存对象整理城一个连续的空间。
- ArrayList和LinkedList的区别
- ArrayList是实现了基于动态数组的数组结构,LinkedList是基于链表的数组结构;
- 对于随机访问的get和set,ArrayList性能优于LinkedLIst,因为Linked需要移动指针;
- 对于新增和删除操作,LinkedList性能优于ArrayList,因为ArrayList要移动数据。
- jdk 1.8 十大特性
- 允许给接口添加一个非抽象的方法实现,只需要添加一个default 关键字,这个方法又叫拓展方法;
- lambda 表达式;
- 函数式接口:指仅仅只有一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到抽象方法;
- 方法和构造函数引用:允许使用 :: 关键字来传递方法或者构造函数引用;
- Lambda 作用域:可以直接访问标记了 final的外层局部变量,或者实例的字段和静态变量;
- 访问局部变量:访问对象字段和静态方法;
- 访问接口的默认方法: 如 Stream 接口表示能应用在一组元素上一次执行的操作序列;
- Date API: Clock 类提供了访问当前日期和时间的方法,Clock 是时区敏感的,可以用来取代 System.currentTimeMillis() 来获取 当前的微秒数。
- Annotation 注解: 支持多重注解, 只需要给该注解标注一下@Repeatable 即可;
- Java 8引入了一个新的Optional类: 这是一个可以为 null 的容器对象。如果值存在则 isPresent() 方法会返回 true ,调用 get() 方法会返回该对象。
- JVM的内存结构
- java虚拟机栈
- 线程私有;
- 每个方法在执行的时候都会创建一个栈帧,存储局部变量,操作数栈,动态连接,方法返回地址等;每个方法从调用到执行完毕,对应一个栈帧在虚拟机栈中的入栈和出栈;
- 堆
- 线程共享;
- 被所有线程共享的一块区域,在虚拟机启动的时候创建,用于存放对象实例;
- 方法区
- 线程共享;
- 被所有线程共享的一块内存区域,用于存储已经被虚拟机加载的信息、常量、静态变量等;
- 程序计数器
- 线程私有;
- 是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存;
- 本地方法栈
- 线程私有;
- 主要为虚拟机使用到的Native方法服务;
- 强引用、软引用、弱引用
- 强引用
- 只有这个引用被释放之后,对象才会被释放掉,只要引用存在,垃圾回收器就永远不会回收。最常见的就是new出来的对象;
- 软引用
- 内存溢出之前通过代码回收的引用;
- 类似于缓存的功能,在内存足够的情况下,通过软引用取值,无需从繁忙的真实数据查询数据,提升速度;
- 当内存不足的时候,自动删除这部分缓存,从真实的来源查数据。
- 弱引用
- 第二次垃圾回收时回收的引用,短时间内通过弱引用取对应的数据,可以取到,当执行第二次垃圾回收的时候,将返回null;
- 主要用于监控对象是否时被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回是否被垃圾回收器标记;
- 数组在内存中的分配
- 简单的值类型的数组
- 每个数组成员都是一个引用(指针),引用到栈的空间上(值类型变量的内存分配在栈上);
- 引用类数组
- 每个数组成员仍是一个引用(指针),引用到堆上的空间(类的实例的内存分配到堆上);
- http和https协议
- http:
- 是互联网应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(tcp),用于从www服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加搞笑,使网络传输减少;
- https:
- 以安全为目标的Http通道,简单讲就是Http的安全版,HTTP中加入了ssl层,https的安全基础就是ssl,因此加密的详细内容就需要SSL;
- tcp/ip 协议簇
- 数据链路层负责帧数据的传递;
- 网络层负责数据怎么传递;
- 传输层负责传输数据的控制(准确性、安全性);
- 应用层负责数据的展示和获取;
- osi五层协议
- 物理层
- 为数据端设备提供传送数据的通路,数据通路可以是一个物理载体,也可以是多个物理载体连接而成;
- 数据链路层
- 为网络层提供数据传送服务;
- 网络层
- 路由选择和中继、激活、种植网络连接,在一条数据链路上复用多条网络连接,多采取分时复用技术、差错检测与恢复、排序、流量控制、服务选择、网络管理;
- 传输层
- 传输层是两台计算机金国网络进行数据通信时,第一个端到端的层次,具有缓冲作用;
- 应用层
- 应用层向应用程序提供服务
- 原生jdbc操作数据库流程
- Class.forName()加载数据库连接驱动;
- DriverManager.getConnection() 获取数据连接对象;
- 根据SQL获取sql会话对象; 两种方式:Statement、PreparedStatement;
- 执行sql处理结果集;
- 关闭结果集、会话、连接;
- mysql性能优化
- 当只要一条数据时使用limit 1;
- 使用正确的数据库引擎,myISAM适用于大量查询的应用,InnoDB适用于写操作;
- 用not exists 代替 not in ;
- 充分使用索引;
- 用NOSQL的方式使用mysql;
- 事务的四大特性
- 原子性:真个事务中的所有操作,要么全部完成,要么全部不完成,事务在执行时发生错误就会回滚到开始前的状态;
- 一致性:在事务开始前和就结束后,数据库的完整约束没有被破坏。 就拿转账为例,A 有 500 元,B 有 300 元,如果在 一个事务里 A 成功转给 B50 元,那么不管并发多少,不管发生什么,只要事务执行成功了,那么最后 A 账户一定是 450 元,B 账户一 定是 350 元。
- 隔离性:一个事务的成功或者失败,对其他事务是没有影响的。两个事务相互独立;
- 持久性:当事务完成后,这个事务对数据库的所更改的数据便持久化的保存在数据库中,并不会被回滚。
- 四种隔离级别
- 读未提交:脏读,事务可以读取其他事务未提交的数据;(应当避免)
- 读已提交:事务可以读取其他事务已经提交的数据;
- 可重复读:一个事务中读到的数据始终保持一致,无论另一个事务提交已否;
- 可串行化:同时只能只能一个事务,相当于事务的单线程;
- 悲观锁和乐观锁
- 悲观锁:当对事务开始前就假设数据会冲突,所以在事务开始读取的时候就数据锁定【数据将暂时得不到修改】-- 例如select * from account where name=”Max” for update
- 乐观锁:一般假设不会产生数据冲突,在开始前生成一个版本的数据,事务完成操作后再次检查当前版本的数据和之前生成的版本数据比较,如果发生冲突,就让用户返回错误的数据。
- 索引
- 普通索引
- 通过索引实现数据库快速查询;
- 索引分为聚簇索引和非聚簇性索引:顺序和特长
- 聚簇索引是按照数据存放的物理位置为顺序,非聚簇索引不是;
- 聚簇索引能够提高多行索引的效率,非聚簇索引能够提升单行索引的效率;
- 添加索引的语句:create index index_name on tebale_name(字段名)
- 唯一索引
- 索引的字段组合是唯一的,但是不允许重复;
- 避免数据出现重复;
- 创建唯一索引的语句: create Unique index__name on table_name (字段名);
- 主索引
- 必须为主键字段创建一个索引;
- 创建主索引语句:create Primary index_name on table_name(字段名);
- 视图
- 视图是一张虚拟的表,是从一张或者多张映射出来的数据表;
- 数据库中只存放了视图的定义,没有存放视图的数据,数据依旧存放在以前的表中,数据库在查询数据的时候会从原来的表中进行查询;
- 视图的作用:
- 增加逻辑性独立性;
- 增加安全性;
- 使操作简单化;
- 创建视图语句:
- 单表创建语句:create view view_name AS select (需要展示的视图字段) from tabel_name where (查询条件);
- 多表创建语句:createview view_name AS select (需要展示的视图字段) table_A,table_B where (查询条件)
- springboot 常用的注解
- @SpringBootApplication:包含了@ComponentScan、@Configuration 和@EnableAutoConfiguration注解。其中@ComponentScan 让spring Boot 扫描到 Configuration 类并把它加入到程序上下文。
- @Configuration:等同于 spring 的 XML 配置文件;
- @EnableAutoConfiguration 自动配置。
- @ComponentScan 组件扫描,可自动发现和装配一些 Bean;
- @RestController 注解是@Controller 和@ResponseBody 的合集,表示这是个控制器 bean;
- @Autowired 自动导入
- Spring 的理解
- 主要核心思想:控制反转、依赖注入、面向切面编程
- 控制反转: spring 开发模式中,spring 容器使用了工厂模式为我们创建了所需要的对象,直接调用就可以了;
- 依赖注入: spring 使用 javaBean 对象的 set 方法或者带参的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过 程,就是依赖注入的思想;
- 面向切面比编程: 将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等,底层 是动态代理;
- SpringMVC 的工作原理
- 客户端发出一个HTTP请求给web客户端,web服务器对HTTP请求进行解析,如果匹配DispacherServelet的请求映射路径,web容器将请求准发给DispacherServlet;
- Dispacherservlet接受请求后,根据请求的信息以及handleMapping的配置找到处理请求的处理器handler;
- 再由局的的handlerAdapter对Handle进行具体的调用;
- Handle对数据的处理完成后将返回一个modelAndView对象给DispacherServelet;
- DispacherServlet通过ViewResolver将逻辑试图转化为视图View;
- Dispacher通过mode解析出ModeAndView中的参数进行解析,热闹和将View返回给客户端。
- mybatis中#{} 和 ${} 的区别
- #{} 占位符,预编译:将#{}中间的参数转译成字符,先编译再从sql中取值;能防止sql注入
- ${} 字符替换:先从sql中取值再进行编译;传入表名的或者使用Order by的时候必须使用 ${}
- Redis 有哪几种数据结构
- String——字符串;
- hash(键值对);
- list(列表);
- set(集合);
- zset(有序集合);
- Redis存满之后处理方案
- 增加内存;
- 使用内存淘汰策略;
- 集群;
- 添加过期时间;
- Redis 常见应用场景
- 热点数据缓存;
- 限时业务的应用;
- 计数器相关的应用;
- 排行榜相关的问题;
- 点赞、或者好友相互关系的存储;
- 延时操作;
- 分页、模糊查询等;
- Redis 持久化方案
- 存储在磁盘的Rdb文件中;
- 存储在磁盘的Aof文件中;
- 无持久化:只在服务器运行时存在;
总结一下面试中经常被问到的面试题,希望对各位初中级同胞有用。相关推荐
- Python培训常识:Python面试中常被问到的几种设计模式要知道
学习Python技术大家都是为了日后能够找到适合自己的工作岗位,那么除了要学习好Python技术外,对于面试环节的问题也要有所了解,本期小编为大家介绍的Python培训教程就算关于Python面试中常 ...
- 面试中经常会问的智力题,来看看你会做几道
转载自 面试中经常会问的智力题,来看看你会做几道 下面是大部分题目来自滴滴出行2017秋招题.开始头脑风暴吧~~~ 问题 question one 有50家人家,每家一条狗.有一天警察通知,50条 ...
- 这些面试中经常被问到的线程池问题,你都能回答的上来吗?
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:Real_man juejin.im/post/5e435ac3f265da5753 ...
- e - 数据结构实验之查找五:平方之哈希表_面试中常被问到的Hash表,你了解吗
#新人扶持计划# Hash表在面试中经常被问到,今天我们来了解下. Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够 ...
- (免费领取Java面试题)Java面试中经常被问到的问题
(免费领取Java面试题)Java面试中经常被问到的问题 免费领取Java面试题 -------------https://blog.csdn.net/kaikeba/article/details/ ...
- 面试中,被问到“哑口无言”的瞬间怎么办?
在面试过程中,可能会遇到各种意想不到的问题,有些问题会让你感到非常自信,而有些问题却会让你感到犯愁,甚至哑口无言.这种情况发生时,如何应对是很关键的.面试中,被问到"哑口无言"的瞬 ...
- 面试中常被问到(11)虚函数/纯虚函数
虚函数 如何定义一个虚函数?在基类成员函数前加入virtual关键字,但并不代表此函数不被实现,只是说明允许基类指针调用派生类重写的此函数 一个类只要声明有虚函数或者从基类继承了虚函数,在编译过程中就 ...
- 淘宝十年资深程序员在面试中最爱问的秒杀的面试题
淘宝十年资深程序员在面试中最爱问的秒杀的面试题 文章目录 淘宝十年资深程序员在面试中最爱问的秒杀的面试题 1.什么是秒杀?秒杀是什么场景? 2.秒杀场景下有哪些挑战?如何应对这些挑战? 3.如何防止商 ...
- java 实体类包含list 怎么取值_舅舅是面试官,偷偷告诉你们面试官最爱问的Java面试题...
2015 年,因为工作岗位的变动,舅舅开始负责给集团招聘一些技术人员,出于对公司的负责,也为了更好的胜任技术经理的职位,在面试的这件事上,舅舅做了大量的"功课",首先研究了几乎所有 ...
- AUC/ROC:面试中80%都会问的知识点
本文分享自华为云社区<技术干货 | 解决面试中80%问题,基于MindSpore实现AUC/ROC>,原文作者:李嘉琪. ROC/AUC作为机器学习的评估指标非常重要,也是面试中经常出现的 ...
最新文章
- springcloud 子项目怎么导入_使用eclipse一步一步创建SpringCloud项目(二)—— 使用feign和ribbon调用微服务...
- L1-007 念数字 (10分) (13行代码AC!!)
- Java中bytebuffer和string的转换记录
- CentOS7 修改静态IP
- UVA10427 Naughty Sleepy Boys【数学】
- Django的url别名功能的使用
- C#实现关机的两种方法
- 免费使用中国知网/查看外文文献—浙江图书馆
- Win7下硬盘安装Ubuntu-16.04 LTS教程
- 浅谈大型互联网的企业入/侵及防护策略
- 【PPT】跨境电商的N个知识点普及
- 程序员需要了解的硬核知识之控制硬件
- python开发工程师是干嘛的-python开发工程师是做什么的
- OI 生涯回忆录 《Pilgrimage》
- 一阶拟合算法C(六轴)
- kpu 处理器_深度学习及 KPU 基础知识
- 肇庆市学计算机比较好的学校,2021年肇庆高中学校排名一览表,肇庆比较好的高中学校排名...
- win10 文件服务器 群晖,转帖!手把手教您用win10做NAS:搭配emby,VM虚拟群晖,直通......
- 电脑用java怎么编程,使用java编程从0到1实现一个简单计算器
- 河北省网上报税系统使用心得