java面试之葵花宝典(持续更新)
- 1. java堆(heap)栈(stack)
- 2.==和equals区别
- 3.ArrayList、LinkedList、Vector的区别
- 4.for循环与迭代器iterator对比(ArrayList,LinkedList区别之一)
- 5.List 和 Map 区别
- 6.char、varchar、varchar2区别
- 7.redis和mysql区别
- 8.垃圾回收原理
- 9.java 中会存在内存泄漏吗
- 10.关键词final的作用
- 11.java 中冒泡排序法和选择排序法
- 12.javaweb 说一说 Servlet 的生命周期
- 13.SERVLET API 中 forward()转发与 redirect()重定向的区别
- 14.request.getAttribute()和 request.getParameter()有何区别?
- 15.数据库sql中 UNION 和 UNION ALL区别,HAVING
- 16.Spring IOC 、AOP
- 17.string,stringBuffer,stringBuild区别与联系
- 18.数据库优化
- 19.springcloud
- 20.shiro
有些公司会面试好几轮,初步面试老是从基础问题问起,自己会但是理论记不住,这种情况就是平时遇事则百度造成的,太依赖了,此文章只是一个简单的基础整理!
1. java堆(heap)栈(stack)
- 栈:存放基本类型(八大基本数据类型)的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
- 堆:存放所有new出来的对象。Test test = new Test();test为对象引用,存在栈中,
对象(new Test())存在堆中。
2.==和equals区别
String s1 = new String(“str”);
String s2 = new String(“str”);
== 返回 false ; equals 返回 true;==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。==比较的是2个对象的地址,而equals比较的是2个对象的内容。显然,当equals为true时,==不一定为true;
s1 == s2.intern() 返回true 虽然s2单独占用了堆空间,但它指向的实体和s1一样,取的同一个常量池。
3.ArrayList、LinkedList、Vector的区别
- ArrayList和Vector是基于数组实现的,LinkedList是基于双向链表实现。
- ArrayList和LinkedList线程不安全,Vector线程安全。
- 找特定位置的元素或只在集合的末端增加移动元素,那么使用ArrayList或Vector都是一样的,如果是在指定位置的插入、删除元素,最好选择LinkedList。
4.for循环与迭代器iterator对比(ArrayList,LinkedList区别之一)
- ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,
因此在ArrayList里,for循环较快 - LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,
因此在LinkedList里,使用iterator较快,可以在遍历的时刻用remove()
5.List 和 Map 区别
- List存储单列数据的集合,存储数据有序,并允许重复。
- Map 键值双列数据的集合,存储数据是无序,键不能重复,值是可以有重复。
6.char、varchar、varchar2区别
- varchar :可变长度的非 Unicode 数据,最长为 8,000 个字符。
- nvarchar:可变长度 Unicode 数据,其最大长度为 4,000 字符。
- char: 固定长度的非 Unicode 字符数据,最大长度为 8,000 个字符。
- nchar: 固定长度的 Unicode 数据,最大长度为 4,000 个字符。
- char和varchar都是字符串类型的。
7.redis和mysql区别
- 类型上:mysql是关系型数据库,redis是缓存数据库。
- 作用上:mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢。
redis用于存储使用较为频繁的数据到缓存中,读取速度快。
8.垃圾回收原理
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况通常,
GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,
哪些对象是”不可达的”。当GC确定一些对象为”不可达”时,GC就有责任回收这些内存空间。
程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
优点:可以有效的防止内存泄漏,有效的使用可以使用的内存。
9.java 中会存在内存泄漏吗
所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java 中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。
10.关键词final的作用
1.被final修饰的变量,如果是基本数据类型的变量,则一旦被赋值后便不可更改。
2.如果引用类型的变量,则一旦实例化对象后,便不可让这个变量指向其他对象,但是可以改变该对象
里面的属性。
3.final关键字修饰父类的一个方法时,子类不可重写这个方法。
4.被final修饰的类不可以被继承,final类里面的成员方法都会被隐式地声明为final。
5.final关键字与static对比:static关键字修饰变量时,会使该变量在类加载时就会被初始化,不会因为对象的创建再次加载,当变量被static 修饰时就代表该变量只会被初始化一次,final则不是。
11.java 中冒泡排序法和选择排序法
- 冒泡排序法概念:
从前向后(或从后向前)依次比较相邻的元素,若发现逆顺序,则交换。小的向前换,大的向后换,像水底的气泡逐渐向上冒,顾名思义冒泡排序法。通俗一点就是把大的往上挪向冒泡一样。是交换式排序法的一种;冒泡排序法效率较低。 - .选择排序法概念:
第一次从R[0]~R[n-1]中选取最小值,与R[0]交换。
第二次从R[1]~R[n-1]中选取最小值与R[1]交换。。。以此类推。
通俗点说就是每次找到后面元素的最小值然后与之交换。
选择排序法效率更高!!!
12.javaweb 说一说 Servlet 的生命周期
- servlet 有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。
这个生存期由 javax.servlet.Servlet 接口的 init,service 和 destroy 方法表达。 - web 容器加载 servlet,生命周期开始。通过调用 servlet 的 init()方法进行 servlet 的初始化。
通过调用 service()方法实现,根据请求的不同调用不同的 do***()方法。结束服务,web 容
器调用 servlet 的 destroy()方法。
13.SERVLET API 中 forward()转发与 redirect()重定向的区别
- 前者仅是容器中控制权的转向, 在客户端浏览器地址栏中不会显示出转向后的地址;
- 后者则是完全的跳转, 浏览器将会得到跳转的地址, 并重新发送请求链接, 从浏览器
的地址栏中可以看到跳转后的链接地址。 所以, 前者更加高效
14.request.getAttribute()和 request.getParameter()有何区别?
- getParameter()是获取 POST/GET 传递的参数值;
- getAttribute()是获取 SESSION 的值、是获取对象容器中的数据值;
15.数据库sql中 UNION 和 UNION ALL区别,HAVING
- UNION 在进行表链接后会筛选掉重复的记录;
- UNION ALL 只是简单的将两个结果合并后就返回,从效率上说,UNION ALL 要比 UNION 快很多。
- HAVING 相当于增加了一个普通的 WHERE 子句,
- 编写顺序:
FROM ==》WHERE (先过滤单表/视图/结果集,再JOIN)
==》GROUP BY 》HAVING (WHERE过滤的是行,HAVING过滤的是组,所以在GROUP之后)》ORDER BY
16.Spring IOC 、AOP
一、IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等,简单点说就是spring管理bean的容器。
Spring 可以用 xml , properties 文件等语义化配置文件表示;
而后来springboot中用注解表示:
1.@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
2.@Configuration 代表标识这个类可以使用Spring IoC容器作为bean定义的来源
3.@EnableAutoConfiguration:自动配置spring的上下文,通常会自动根据你的类路径和你的bean定义自动配置。
4.@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component
下的子注解@Service,@Repository,@Controller
5.@Bean 代表将方法返回的POJO装配到IoC容器中,属性name定义这个Bean的名称,如果没有配置则将方法名称
作为Bean的名称保存到IoC容器
6.@Component:标明该类会被Spring IoC容器扫描装配,指定的名称是该Bean 的名称,如果不指定该类第一个
字母小写作为该Bean的名称
7.@Autowired 自动注入 用的最多的注解
二、AOP面向切面编程:
AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以
获得逻辑过程中各部分之间低耦合性的隔离效果,对于我们开发中最常见的可能就是日志记录,事务处理,异常
处理等等。
@Aspect 作用是把当前类标识为一个切面供容器读取
@Component 将当前类注入到Spring容器内
@Pointcut 切入点,其中execution用于使用切面的连接点。使用方法:execution(方法修饰符(可选) 返回类型
方法名参数 异常模式(可选)) ,可以使用通配符匹配字符,*可以匹配任意字符。
@Before 在方法前执行
@After 在方法后执行
@AfterReturning 在方法执行后返回一个结果后执行
@AfterThrowing 在方法执行过程中抛出异常的时候执行
@Around 环绕通知,就是可以在执行前后都使用,这个方法参数必须为ProceedingJoinPoint,proceed()方法就
是被切面的方法,上面四个方法可以使用JoinPoint,JoinPoint包含了类名,被切面的方法名,参数等信息。
执行循序:around > before > around > after > afterReturning
原文链接:https://blog.csdn.net/qq_33257527/article/details/82561635
17.string,stringBuffer,stringBuild区别与联系
String:
1.Stirng是对象不是基本数据类型 。
2.String是final类,不能被继承。是不可变对象,一旦创建,就不能修改它的值。
3.对于已经存在的Stirng对象,修改它的值,就是重新创建一个对象,然后将新值赋予这个对象 。
StringBuffer:
1.:每次都对对象本身进行操作,而不是生成新的对象。所以在字符串内容不断改变的情况。
2.线程安全,效率低 。
StringBuild:
1. 是jdk1.5后用来替换stringBuffer的一个类,大多数时候可以替换StringBuffer。
2. 比 StringBuffer的速度快,效率高。是线程非安全的
18.数据库优化
1.选择最合适的字段属性
例如:在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,
甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了
2.使用join代替子查询
3.使用联合(UNION)来代替手动创建的临时表
4.数据库事务的四个特性及含义
(1)原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。
事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么ROLLBACK
命令就可以把数据库恢复到BEGIN开始之前的状态。
(2)一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
(3)隔离性:隔离状态执行事务,使得在同一时间仅有一个请求用于同一数据。
(4)持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
5.使用外键
6.使用索引
1)、索引的目的:快速访问数据表中的特定信息,提高检索速度
2)、索引的底层实现原理和优化:B+树,经过优化的B+树,主要是在所有的叶子结点中增加了指向下一个叶
子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引。
3)、什么情况下设置了索引但无法使用
★以“%”开头的LIKE语句,模糊匹配
★OR语句前后没有同时使用索引
★数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)
4)、
★主键是一种特殊的索引唯一性不能为空;唯一索引用unique 字段 ,创建主键会主动设置为聚集索引
★聚集索引(clustered ):表中存储的数据按照索引的顺序存储,检索效率比普通索引高,但对
数据新增/修改/删除的影响比较大,一个表中只能拥有一个聚集索引。
★非聚集性索引(non-clustered): 不影响表中的数据存储顺序,检索效率比聚集索引低,对
数据新增/修改/删除的影响很少是通过二叉树的数据结构来描述的。
★聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致
聚集索引叶节点指向最终的数据节点;非聚集节点指向索引节点(有指向最终节点的指针)
19.springcloud
不多说直接上链接,大佬讲解:[点击进入](https://juejin.im/post/5be13b83f265da6116393fc7)
20.shiro
不多说直接上链接,大佬讲解:[点击进入](https://blog.csdn.net/qq_37254736/article/details/99350029/)