杭州智库
1 set集合的底层结构
1 | 红黑树 |
2 hashmap的底层结构
1 | 底层结构是hash表数据结构,可以存入null键和null值,该集合线程不同步,效率较高,代替hashTable。实际上是一个“链表的数组”的数据结构。 |
3 案例 图片上传的优化方法
4 Redis有几种数据类型,分别是什么?
1 | 5种,分别是String、list、set、hash、sort set; |
5 Mysql是什么锁机制
1 | 行锁 |
6 联合索引
$$
实例问题:有ABC联合的索引,那么哪种情况会触发联合索引。
1,AB 2.BC 3.AC 4.CBA
$$
本文主要总结查询语句触发联合索引(索引定义中至少包含两个索引列)的几种条件。
示例如下。首先创建表:
1 | CREATE TABLE E (e1 INT, e2 VARCHAR(9), e3 INT, PRIMARY KEY(e1, e3)); |
这样就建立了一个联合索引:e1,e3
触发联合索引是有条件的:
1、使用联合索引的全部索引键,可触发索引的使用。
1 | 例如:SELECT E.* FROM E WHERE E.e1=1 AND E.e3=2 |
2、使用联合索引的前缀部分索引键,如“key_part_1常量”,可触发索引的使用。
1 | 例如:SELECT E.* FROM E WHERE E.e1=1 |
【注意】
3、使用部分索引键,但不是联合索引的前缀部分,如“key_part_2常量”,不可触发索引的使用。
1 | SELECT E.* FROM E WHERE E.e3=1 |
4、使用联合索引的全部索引键,但索引键不是AND操作,不可触发索引的使用。
罗万信息笔试题
==和equals的区别
1
2
3
4
5
6
7
8
9
10
11
121)对于==,比较的是值是否相等
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
原文链接:https://blog.csdn.net/qq_27471405/article/details/81010094abstract class和interface 的区别
1
2
3
4
5
6
7
8
9
10
11
12
13从形态上看
抽象类可以给出一些成员的实现,接口却不包含成员的实现;
抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现;
一个类只能继承一个抽象类,但可实现多个接口等等。
如何区分
1.类是对对象的抽象,抽象类是对类的抽象;
接口是对行为的抽象。
2.若行为跨越不同类的对象,可使用接口;
对于一些相似的类对象,用继承抽象类。
3.抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类;
接口是根本不知子类的存在,方法如何实现还不确认,预先定义。
原文链接:https://blog.csdn.net/MrBaymax/article/details/84328918怎么唤醒一个阻塞的线程
如果线程是因为调用了wait()、sleep()或者join()方法而导致的阻塞,可以中断线程,并且通过抛出InterruptedException来唤醒它;如果线程遇到了IO阻塞,无能为力,因为IO是操作系统实现的,Java代码并没有办法直接接触到操作系统。
String,StringBuffer和StringBuilder的区别;
1
2
3
4
5
6
7
8
9
10
11
121 .三者在执行速度方面的比较:StringBuilder > StringBuffer > String
2 .String <(StringBuffer,StringBuilder)的原因
String:字符串常量
StringBuffer:字符串常量
StringBuilder:字符串常量
StringBuilder:线程非安全的
StringBuffer:线程安全的
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。
当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
对于三者使用的总结: 1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer实现多线程有几种方法?分别是什么?实现线程同步有几种方法,分别是什么?
1 | 实现多线程有三种方法: |
用友笔试题
Java语言中,处理IO的方式都有_ , _和____三种。(NIO,BIO,AIO)
求交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3; ?
看到这个题在没有考虑必须用JAVA的情况下,我用了C语言的移位的骚操作(转化为二进制3=011,5=101),面试官都笑了。
百度了一下:
1
2
3
4
5
6
7
8
9
10//有两种解法, 一种用算术算法, 一种用^(异或)
a = a + b;
b = a - b;
a = a - b;
or
a = a^b;// 只能对int,char..
b = a^b;
a = a^b;
or
a ^= b ^= a;求两个字符串的最长公共字符串
数据库笔试题
1 | Student(Sid,Sname,Sage,Ssex)学生表 |
呆萝卜面试题
list和map的区别?map的底层结构?
1
2
3List:是存储单列数据的集合,存储的数据是有序并且是可以重复的
Map:存储双列数据的集合,通过键值对存储数据,存储的数据是无序的,Key值不能重复,value值可以重复
map的底层是由数组和链表组成。HashMap中通过key获取value源码剖析
1
2在一个长度为n的数组中插入一个元素的算法复杂度是多少?
1
o(n)
int、double、float的大小?
1
2
3
4
5
6
7
8
9
10
11
12
13一般情况下:
32位编译器:
char short int long float double 指针
1 2 4 4 4 8
64位编译器:
char short int long float double 指针
1 2 4 8 4 8堆和栈的区别?什么是“堆”,”栈”,”堆栈”,”队列”,它们的区别?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
171.堆栈空间分配
①栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
②堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
2.堆栈缓存方式
①栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
②堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
3.堆栈数据结构区别
①堆(数据结构):堆可以被看成是一棵树,如:堆排序。
②栈(数据结构):一种先进后出的数据结构。mysql有那些存储引擎?哪一种支持事务?数据库事务
1
在mysql中用的最多的存储引擎有:innodb,bdb,myisam ,memory 等。其中innodb和bdb支持事务而myisam等不支持事务。
mysql的索引有哪些什么是索引?Mysql目前主要的几种索引类型?优化索引的方法有哪些索引性能优化?
1
2
3
4
5
6
7
8
9
10索引有:
普通类型(CREATE INDEX)
唯一索引,索引列的值必须唯一(CREATE UNIQUE INDEX)
多列索引
主键索引(PRIMARY KEY),一个表只能有一个
全文索引(FULLTEXT INDEX),InnoDB 不支持
索引的优化方法:
非空字段 NOT NULL,Mysql 很难对空值作查询优化
区分度高,离散度大,作为索引的字段值尽量不要有大量相同值
索引的长度不要太长(比较耗费时间)二叉树的优势(查询速度快)
String IOC的理解Spring中IOC与AOP的理解?它是如何如何实现的(用了哪些设计模式)?
1
2
3
4
5
6
7IOC也称控制反转,其实是和依赖注入的含义是一样的,就是把原先控制代码对象的生产由代码转换到IOC容器中去实现。作用是为了解耦,降低类之间的耦合度,其设计思想就是设计模式的工厂模式,不懂什么是工厂模式的点击此:。。。。。,我们并不需要知道其生产的具体过程,我们只要其产出的对象即可。其工作流程就是:在Spring容器启动的时候,Spring会把你在application.xml中配置好的bean都初始化,在你需要调用的时候,把已经初始化的bean分配给你要调用这些bean的类,而不用去创建一个对象的实例。
1 工厂模式:BeanFactory、ApplicationContext创建中
2 模板模式:BeanFactory、ApplicationContext实现中
3 代理模式:在AOP实现中用到了JDK的动态代理
4 策略模式:加载资源文件的方式;AOP实现中采用了两种不同的代理,如JDK代理和CGLIB代理
5 单例模式:创建bean用过哪一些设计模式在项目中,如何在具体的项目中使用的?(一般单例经常被使用)
正方
一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球对,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合.
1
2
3SELECT a.name,b.name from team AS a,team AS b where a.name<b.name
--如果觉得顺序有些乱可以排一下序
SELECT a.name,b.name from team AS a,team AS b where a.name<b.name ORDER BY a.name写一个ArrayList的动态代理类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package TestProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
public class ProxyTest {
public static void main(String[] args) {
final ArrayList<String> list = new ArrayList<>();
List<String> listProxy=(List<String>) Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(list,args);
}
});
listProxy.add("你好") ;
System.out.println(list);
}
}leetcode习题
算法思想
双指针
题目:在有序组中找出两个数,是他们的和为target。
使用双面指针,一个指针指向较小的元素,一个指针指向较大的元素。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。
如果要判断sum==target,那么就可以等到要求的结果
如果sum>target,移动较大的元素,使sum变小,
反之sum<target,移动较小元素,是sum变大
1 | public int[] twoSum(int[] numbers,int target){ |
ps:时间空间复杂度–》判断一个算法的好坏
时间复杂度BigO
大O表示法是算法的渐进时间复杂度
T(n)=O(f(n))—》f(n)代表代码执行的次数,大O表示正比例关系;
比如O(logN)
1 | int i=1; |
O(n)–单层for循环;
O(n^2)–双层for循环;
有特殊情况
1 | for(int i=1;i<=n;i++){ |
普通代码数据操作–O(1);
其它复杂度的指标有:
O(Big O) 最差情况
Ω(big Omega) 最好情况
θ(big theta) 一个算法区间
2、空间复杂度—》内存空间增长的趋势
常用的空间复杂度O(1)、O(n)、O(n^2)
时间空间复杂度=时间和空间增长的趋势