1. java三大特性;
//继承,封装.多态
2. 线程和进程的区别;
//进程可以包含多个线程,线程共享本进程的地址空间,进程之间是独立的地址空间;
3. ajax的优缺点;
//异步请求机制,使得页面不用刷新即可完成动态交互,减少了冗余的请求,减轻服务器的压力
缺点—暴露了与服务器的交互细节,浏览器的机制被破坏----后退和历史记录功能被打破;
4. read方法为什么返回int类型;
//读取的字节数据,如果是其他类型的容易混淆结束时的符号;
5. hashmap和hashtable的区别
//hashmap 底层是 数组 +链表+红黑树 允许一个key为null,线程不安全 扩容为 1.5倍 ,hashtable 线程安全,key与value都不允许为null, 扩容时通过rehash来确定容量;
6. 什么是orm
//对象关系映射,用于将对象和数据库之间建立联系,实现了对象和关系型数据库之间的数据交互,提高了开发效率 ;
7.int和integer的区别
//基本数据类型和包装类(引用数据类型)
8.filter的作用
//过滤器,用于筛选出一些符合条件或者不符合条件的数据;
9. mybatis属性字段和数据库列明不一致如何处理;
//起一个别名 //keyColumn xml中指定 typeAliases
10.get和post的区别
//get 发送的信息明文,且发送的数据量小,post发送的数据类型多,对用户来说不可见,
浏览器不会保存post提交的数据,
get请求可以被缓存,可以保留到浏览器历史记录中
get只允许ascii字符,post则没有限制
IO流的种类//字节流和字符流
11.如何跳出多重循环
break,内层循环想要跳出外层循环
int i=0;
int j=0;
a: for(;i<10;i++){
b:for(;j<10;j++){
if(j==4){
break a; //跳出a所在的循环
}
12.内部类种类
//静态内部类,局部内部类,匿名内部类,方法内部类
什么是动态代理?//通过反射在运行时确定对象类型,动态代理又分为接口代理和 cglib (子类代理)
import org.junit.Test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyDemo {
@Test
public void test(){
Dinner dinner= new Person("李二狗");
//get a proxy Instance
// args
/* ClassLoader loader, ---classloader
Class<?>[] interfaces, --- interface
InvocationHandler h ----invoke method
*/
//get classloader
ClassLoader classLoader=dinner.getClass().getClassLoader();
Class<?>[] interfaces = dinner.getClass().getInterfaces();
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnVal;
if(method.getName().equals("eat")){
System.out.println("饭钱洗手");
returnVal = method.invoke(dinner, args);
System.out.println("饭后刷碗");
}else{
returnVal= method.invoke(dinner,args);
}
return returnVal;
}
};
Dinner dinner1 = (Dinner)Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
dinner1.eat("米饭");
dinner1.drink();
}
}
13.数组和list如何互转
//Arrays工具类
14.线程的生命周期
//new running terminal ,waiting
15.是否可以继承string类,为什么?
不可以,被final修饰的类不能被继承
16.@RequestMapping的作用?
//标识 http 请求地址与 Controller 类的方法之间的映射
17.jsp的内置对象
很久的知识了,一般新技术公司不会问;
//request ,session ,application,pageContext, response ,out, exception ,page,config
18.throw和throws的区别?
//throws作用在方法上,向上抛异常;throw用于向上抛异常
19.connection和connections的区别?
一个是集合的根接口,一个是集合工具接口
20.java修饰符的区别?
//public 公共访问权限 default 本包中可访问 ,protected 本包即其子类可访问 ,private只有本类可访问;
21.final关键字的作用?
//修饰类 —类不能被继承,
修饰属性----属性不能被修改,修饰引用类型时表示该引用的地址不了被修改,引用中的内容还是可以修改的;
修饰方法 ------方法不能被修改,也不能被子类继承
22.mybatis #{} 和 ${} 的区别?
“#{}是预编译,将数据作为字符串处理” "
“${}是占位符,数据替换掉占位符,容易发生sql注入攻击”
23.java集合与数组的区别?
//数组存储基本数据类型和引用数据类型,数组大小一旦确定无法被修改;
集合存储引用数据类型,大小可变
24.什么是shiro?
//是 Java 的一个安全框架 ,也提供了身份验证全系只能验证,加密.记住我等功能但是功能不如security丰富
25.TreeMap原理?
TreeMap是基于红黑树实现。根据其键的自然顺序或创建时提供的比较器进行排序,具体取决于所使用的构造函数。
26.什么是线程池?
为什么使用线程池//将线程存放到一个容器中,重用线程,减少线程的创建和销毁带来的性能个损耗
27.cookie和session的区别?
//cookie存放在客户端,生命周期短,Cookie 只能保存ASCII 字符信息,session,cookie存放的数据量小于session,
28.静态变量和实例变量的区别?
//静态变量随着类一块被加载,属于类所有,全局可访问,实例变量是在实例初始化时才被分配空间
29.String,StringBuffer,StringBuilder的区别?
String不可变字符串, StringBuffer,StringBuilder都是可变字符串,StringBuffer线程安全,StringBuilder线程不安全,性能好一些
30.java中,堆和栈的区别?
堆用于存储对象和数组,可动态分配空间大小,栈用于存储对象地址以及局部变量,方法返回值等
31.对称集群和非对称集群的区别?
集群中的服务器地位相等,没有主从之分,非对称集群是服务器的地位不相等,其中一写服务器专门用于读/写操作
32.java中,重载和重写的区别?
重载是咋同一个类中方法的重载,方法名相同,参数列表不同,对返回值是否一致没有要求,重写是父类与子类之间,方法名,方法的参数,返回值要一致;
33.@RequestBody和@ResponseBody的区别?
@ResponseBody----方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中 ;
@RequestBody读取Request请求的body部分数据
34.什么是Java容器,有哪些常用的容器?
能够保存对象的类—List—>>ArrayList,LinkedList,
Set---->>.HashSet ,cunrrentHashSet, LinkedHashset,sortedset
queue---->>>ArrayDeque ,LinkedBlokingQueue
35.处理异常的方式?
//try catch throws
36.ssm如何进行整合?
//spring springmvc mybatis分别实现Spring与SpringMVC、Spring与Mybatis的 整合 ,而实现 整合 的主要工作就是把SpringMVC、Mybatis中的对象配置到Spring容器中,交给Spring来管理
37.ioc的注入方式
setter注入 ,构造注入,p命名空间注入
38.linux常用命令
ll ls cat vi rs rz nmcli systemctl yum grep lsof tar unzip mv cp chmod chaw ln
39常用的加密算法
sha256 AES DES RSA
40.git的作用
可以有效、高速地处理从很小到非常大的项目版本管理 ;
41.分布式系统有哪些特征?
//可扩展,可伸缩,可靠性,高可用性,并发性,容错性
42.springmvc如何设置重定向和转发?
Rediect Forward
43.mybatis的一级缓存和二级缓存?
为了提高查询效率,mybatis默认开启一级缓存,一级缓存的作用范围 在同一个session中;
在相同的查询操作之间 刷新缓存,提交, 增删改操作都会使得一级缓存清空;
public void test2() {
ProductDao mapper = sqlSession.getMapper(ProductDao.class);
Product product = mapper.selectProduct(1);
System.out.println(product.getPid() + "--" + product.getPname() + "--" + product.getPrice());
System.out.println("------分割线------------");
Product product2 = mapper.selectProduct(1);
System.out.println(product.getPid() + "--" + product.getPname() + "--" + product.getPrice());
// sqlSession.close();
}
二级缓存在mybatis配置文件上开启,同时在sqs语句中开启;二级缓存可以跨session及逆行访问,即session中的数据共享;
<!--useCache 使得二级缓存生效 将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。-->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
<select id="selectProduct" resultType="com.gavin.pojo.Product" parameterType="int" flushCache="false" statementType="PREPARED" useCache="false">
select * from product where pid =#{pid}
</select>
如果没有在sql中开启useCache 即useCache =false,那么即使在全局配置中开了二级缓存,在sql查询时也不会开启二级缓存;----即二级缓存开关要开启两个;
另一个,如果两此查询时在最后关闭了session,那么也会用两次sql查询语句;
在全局配置文件中开启二级缓存之后,还需要在相应sql中再次开启 缓存才能生效,但是这还没完全开启,需要指定缓存的类型,即用什么类型的类取处理缓存;
44.ArrayList,LinkedList的区别
//ArrayList实现是数组 ,扩容机制 是变为原来的1.5倍,查询效率高,增加删除效率低
LinkedList是数组加链表,查询效率低,增加删除效率高;
45.什么是守护线程?
//程序运行时在后台提供的一种通用服务的线程,用于服务其他线程的,当用户线程都执行完之后守护线程会自动结束,;
46.实现线程的方式?
继承Thread
runnable接口
用lambda
实现callable接口
线程池
47.cookie的生命周期
cookie生命周期这个要看是会话cookie还是持久化的cookie,huihua cookie的生命周期在会话期间;持久化的要看设置的失效时间;
48.mybatis传多个参数的方式?
一般是将参数包装成一个类来传入
对于多个的参数使用arg0 arg1 …传入参数
使用param1 param2 …传入参数
1,参数为基本参数类型,用arg 和param都可以;
2,如果给参数起了别名.那么arg的形式传入参数会失效;
49.面向对象五大基本原则
1,单一职责原则---->>即一个类最好去实现一种功能,不要古欧复杂,以便维护;
2,闭合开放原则---->>即封装与多态(继承与实现)
3,里氏替换原则---->>子类可以替换
4,依赖倒置原则---->>子类依赖父类而不是高一层的类依赖低一层的类
5,接口分离原则—>>>一个接口定义一种规范而不是多种的集合
50.抽象类与接口的区别
抽象类是模板,模板中的抽象方法子类一定要实现,模板中的其他方法子类可以有选择的实现;
接口是一种行为标准,接口中的抽象方法子类也要实现,在jdk1.8之后接口也可以有了default定义的方法,和静态方法,子类可以实现也可以不实现;
相同点
- 接口和抽象类都不能实例化
- 都位于继承的顶端,用于被其他实现或继承
- 都包含抽象方法,其子类都必须覆写这些抽象方法
单继承与多实现;
接口与抽象类的选用原则----->>
-
行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量 少用抽象类。
-
选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用 的功能。
用到老子的时候,就要用抽象类,接口更像是父类放任子类去做什么(只要符合我的标准就行)