1.HashMap的工作原理
HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。
2.为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行自动的垃圾回收(GC)。关于 JVM 的 GC 算法发生在堆主要有下面四种:
引用计数算法、标记–清除算法、标记–整理算法(老年代区)、复制算法(年轻区)
-
JVM(HotSpot)7种垃圾收集器:
Serial收集器(串行收集器)、ParNew收集器、Parallel Scavenge收集器、Serial Old收集器、Paraller Old收集器、CMS(Conturrent Mark Sweep)收集器、G1(Garbage-First)收集器 -
java统计字符串中每个字符出现的次数
采用 hashmap
通过toCharArray()拿到一个字符数组–>遍历数组,将数组元素作为key,数值1作为value存入map容器–>
如果key重复,通过getKey()拿到value,计算value+1后存入
java 基础题
-
jdk和jre的区别:
jdk就是整个java开发的核心,安装了jdk就拥有了java的运行环境以及可以使用开发java程序
jre就是包含java核心库,包含虚拟机和开发工具以及包,包含编译器等等。 -
==和equals的区别是: ==是地址内存空间的对比。 equals是传递值对比
-
final的作用是什么?
final 首先可以修饰类变量、方法、方法体。都不变以及不能继承。但可以被重载,不能和abract一起修饰方法 -
java中操作字符串的类有哪些类?
String <Stringbuffer< StringBuilder
他们都是以char[]的数组形式储存的。String修饰的类是不可改变的。Stringbuffer 通常有synchronized修饰的,所以线程是安全的。Stringbuilder则没有,但是性能也是最高的。 -
如何将字符串反转? StringBuilder和StringBuffer都有reverse方法 。
-
String有哪些常用方法:equals 、toString 、 trim 、 length 、spilt 、 replace 、 substring、format(格式化字符串)、 compareTo(根据每个字符去对比)
-
抽象类一定有抽象方法吗?
可以没。但是你声明一个抽象类,如果没有抽象方法,是不能够构造类对象引用该方法。 -
普通类、抽象类和接口区别:
普通类可以被实例化,抽象类要被实例化得有抽象方法,但不支持多继承。接口必须指向实现多有接口方法的类对象,适用于多继承。 -
java流分为哪几种?
按照数据流:输入流、输出流
按照数据格式:字符流(inputstreamReader)、字节流(inputstream) -
Files的常用方法:Files.exists()、 creatFile() 、copy()、delete()、 read() 、write()
-
BIO:同步阻塞 NIO:同步非阻塞 AIO: 异步非阻塞
java核心面试题
-
面向对象的特征有哪些?
继承 封装 多态 -
访问修饰符的区别:private < default < protect < public
private是私有变量的意思 只有类内可直接访问
default是默认的变量
protected是受保护的变量 类内和子类都可以访问
public是公共变量都可以访问 -
short s1=1 s1=s1+1 错误 需要强制转换 不然就是int 类型
short s1=1 s1+=1 对 相当于了 s1=(short)(s1+1); -
栈(stack):里面存放函数中定义的一些基本类型的变量和对象的引用对象。局部变量
堆(heap):内存放new创建的对象和数组。分为新生代和老年代。 成员变量
方法区: 方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 -
switch(expr1)中,expr1是一个整数表达式。
因此传递给switch和case语句的参数应该是int、short、char或则byte。
long,string都不能作用于swtich -
Java中用最有效率的方法算出2 乘以8 等於几?
2<<3
因为将一个数左移n 位,就相当于乘以了2 的n 次方,那么,一个数乘以8 只要将其左移3 位 -
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload
-
按值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:引用传递就是直接把内存地址传过去,也就是说引用传递时,操作的其实都是源数据。 -
重载:同名不同参 ,无关返回值
重写:同名同参 两小一大 -
描述一下jvm加载class的原理
Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。 -
char型变量中能不能存储一个中文汉字?
java采用unicode编码,2个字节(16位)来表示一个字符,无论是汉字还是数字,字母,或其他语言都可以存储。char在java中是2个字节,所以可以存储中文。 -
静态嵌套类和内部类的不同?
静态嵌套类:Static Nested Class 是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化
内部类:需要在外部类实例化后才能实例化。 -
java中内存在内存泄漏吗?
内存泄漏是指不再被使用的对象或者变量一直被占据在内存中。Java是有GC垃圾回收机制的,也就是说,不再被使用的对象,会被GC自动回收掉,自动从内存中清除。但还是有内存泄漏的问题,比如hibernate中的一级缓存session就是不被gc回收的。 -
静态变量和实例变量的区别?
静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,只分配一次,静态变量就可以被使用了。
总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。 -
如何实现对象克隆?
- 实现Cloneable接口并重写Object类中的clone()方法;
Person p2 = MyUtil.clone(p1);
2) 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆
-
String str = new String(“abc”); 创建了几个对象
两个或者一个 , 字符串或者字符常量池 -
匿名内部类: 可以继承其他类,但不能用extends。可以实现某接口,但不能用implements。
-
String str =(Stringbuffer) strbuffer.reverse().toString(); //字符串反转
str.replace(“a”,“b”); //字符串代替
String result = new String(s.getBytes(“GB2312”),“iso-8859-1”); //改变编码
//打印时间和日期
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd:HH-mm-ss");
String day = dateFormat.format(date);
System.out.println(day);
-
什么时候用断言(assert)?
断言在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,断言用于保证程序最基本、关键的正确性。断言检查通常在开发和测试时开启。 -
Error:程序无法处理的系统错误,编译器不做检查;
Exception:程序可以处理的异常,捕获后可能恢复; -
finally :捕获异常语句最终必须要执行。finalize:执行垃圾回收,清楚内存垃圾。
-
Arraylist:底层是数组结构,增删慢、查询快(下标直接就可以查)。
LinkedList:底层是双向链表数组结构,增删快、查询慢。
Vector: 底层是数组结构,通常加上锁,所以也是线程安全,不过性能较低。 -
List、Map、Set三个接口,存取元素时,各有什么特点?
List和Set 继承Collection接口,Map继承 map接口
Set不允许值重复,List是数据按序存储 -
TreeMap和TreeSet在排序时如何比较元素,Collections工具类中的sort()方法如何比较元素?
TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。
TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。
Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型 -
sleep和wait的区别:sleep是线程中自己的方法,wait是object中的方法。
sleep不会自己释放锁,但是wait会。
sleep不依赖synchronzied关键字,但wait需要。
sleep不需要被唤醒,但wait需要。
yield方法只会给相同优先级或者更高优先级线程运行的机会。 -
请说出与线程同步以及线程调度相关的方法
wait():等待线程时别人可以用
sleep():等待线程还是自己的,别人不可以用
yield():释放锁,同优先级的其他线程还有机会获得锁。
notify():唤醒线程。 -
实现多线程:继承Thread类、实现Runnable接口、 实现callable接口
-
synchronized关键字主要有以下这3种用法:
修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁;
修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁;
修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。 -
什么是线程池?
线程池,thread pool,是一种线程使用模式,线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。 -
线程的基本状态:新建new,start处于就绪状态,使用run()执行,阻塞状态,死亡状态。
-
synchronized和lock的区别
lock是一个接口,而synchronized是java的一个关键字
lock不会主动释放锁,因此可能死锁,而syn不会。
lock等待锁过程中可以用interrupt来中断等待,而synchronized只能等待锁的释放
多线程使用,Lock的性能要远远优于synchronized。 -
Java如何实现序列化,有什么意义?
让类实现Serializable接口,该接口是一个标志性接口,标注该类对象是可被序列。
如果需要反序列化,则可以用一个输入流建立对象输入流,然后通过readObeject方法从流中读取对象
意义:一种用来处理对象流的机制,如果不进行序列化,可能会存在数据乱序的问题。够用于对象的深度克隆。 -
写入一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。
public class testmain{
public int countfile(String filename,String str) throws IOException {
FileInputStream filename =new FileInputStream();
InputStreamReader isread=new InputStreamReader(filename);
BufferReader bf=new BufferReader(isread);
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
StringBuilder readLine=new StringBuilder(); String line;
while((line=br.readline( ))!=null){
readline.append(line );
}
int index;int count = 0;
while ((index=readLine.indexOf(str))!=-1) {
readLine.delete(0, index+str.length());
count++;
}
return count;
}
}
-
如何用java列出一个目录下所有文件
String path=”D:“+File.separator ;
File file= new File(path);
Stirng[] aa =file.list( );
for(){ syso{ aa[i] } ;} -
用java的套接字编程实现一个多线程的回显服务器
-
XML文档定义有几种方式?它们之间有何本质区别?解析XML文档有哪几种方式?
XML文档定义方式:有两种定义形式,dtd文档类型定义和schema模式
本质区别: schema本身是xml的,可以被XML解析器解析
解析XML文档方式:DOM解析、SAX解析、JDOM解析、DOM4J解析 -
XML的主要作用有两个方面:数据交换和信息配置。
-
JDBC连接数据库:
class.forName(“dirver”) //加载驱动
String Url=“jdbc:” //指定数据库源
Connection cn = DriverManage. getConnection(url , uname, pwd); //根据url创建连接数据库
Statement st =new Statement //用数据库连接创建statement 实现增删改查 -
prepareStatement与Statement的区别
Statement用于执行静态SQL语句,在执行时,必须指定一个事先准备好的SQL语句。
PrepareStatement是预编译的SQL语句对象,sql语句被预编译并保存在对象中。
使用PrepareStatement对象执行sql时,sql被数据库进行解析和编译,然后被放到命令缓冲区,
PrepareStatement可以减少编译次数提高数据库性能。 -
使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?
要提升读取数据的性能,可以指定通过结果集(ResultSet)对象的 setFetchSize()方法指定每次抓取的记录数(典型的空间换时间策略);
要提升更新数据的性能可以使用 PreparedStatement 语句构建批处理,将若干 SQL 语句置于一个批处理中执行。 -
在进行数据库编程时,连接池有什么作用?
提升访问数据库性能,直接将连接置于连接池中,而不必关闭连接,减少开销。 -
什么是DAO模式?是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露数据库实现细节的前提下提供了各种数据操作。
-
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
-
正则表达式就是记录文本规则的代码。Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。
-
获得一个类的类对象有哪些方式?
第一种方式:通过类本身来获得对象 Class classname = this .getClass();
第二种方式:通过子类的实例获取父类对象
第三种方式:通过类名加.class获取对象 Class ForClass = ..ClassName. class ;(类在包中的路径加. class )
第四种方式:通过类名的字符串获取对象 Class ForName = Class.forName( “..ClassName” ); -
如何通过Java中的反射调用对象的方法?
通过Class.forName(“包名+方法的类名”)拿到方法的对象; 接着就是invoke()调用方法了 -
什么是UML?UML是统一建模语言,定义了用况图、类图、对象图、包图、状态图、活动图、序列图、通信图、构件图、部署图等10种图。
-
用java写一个折半查找 这种搜索算法每一次比较都使搜索范围缩小一半,其时间复杂度是O(logN)
// 使用循环实现的二分查找
public static <T> int binarySearch(T[] x, T key, Comparator<T> comp) {
int low = 0;
int high = x.length - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int cmp = comp.compare(x[mid], key);
if (cmp < 0) {
low = mid + 1;
} else if (cmp > 0) {
high = mid - 1;
} else {
return mid;
}
}
return -1;
}
SpringBoot
-
什么是springboot?
springboot是基于spring框架上的延伸产品,可以创建独立的spring应用程序而不依赖servlet容器,有内置服务器,可以减少大量的构建配置,不需要xml的配置以及尽可能的提供第三方库。 -
什么是javaconfig?
它提供了配置 Spring IoC 容器的纯 Java 方法。因此 它有助于避免使用 XML 配置。充分利用 Java 中的 面向对象功能。 -
如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
Spring Boot 有一个开发工具(DevTools)模块,在pom文件引入,它有助于提高开发人员的生产力。
spring-boot-devtools 或者热部署 -
Spring Boot 中的监视器是什么?
Spring boot 监视器可帮助您访 问生产环境中正在运行的应用程序的当前状态。是启动框架的组件之一。
https://zhuanlan.zhihu.com/p/111349535?from_voters_page=true
-
如何在 Spring Boot 中禁用 Actuator 端点安全性?
默认所有敏感的http端点都是安全的,可以使用httpServletRequest.isUserInrole方法来禁用安全性。
可以在application.properties中设置端口
添加安全性 可以在pom文件添加 spring-boot-sercuity依赖 -
如何使用springboot实现分页和排序?
使用Spring data-JPA 是实现可分页 的传递给存储库方法。 -
什么是swagger? 你用springboot实现?
swagger是一种可视化的api,为前端开发提供在线沙盒,用于生成restful web服务的工具,使文档能够与服务器相同的速度更新,以最少量的实现逻辑来理解远程服务实现交互。 -
什么使spring Profiles?
允许用户注册bean。是得配置文件非常简单
什么是springbatch? 提供可重用的函数,记录大量数据。 -
如何使用springboot实现异常处理? 运用了controlleradvice类处理异常。
-
什么是webSockets?
是一种计算机通信协议,通过单个tcp连接提供全双工通信通道。相互是独立的
spring mvc
-
什么是Spring IOC 容器?
Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。 -
什么是Spring的依赖注入?
依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。
Spring依赖注入有三种方式:接口注入,setter注入,构造方法注入 -
@Required 注解
这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。 -
@Autowired 注解
@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法 -
使用Spring通过什么方式访问Hibernate?
控制反转 Hibernate Template和 Callback。
继承 HibernateDAOSupport提供一个AOP 拦截器。 -
什么是Spring的MVC框架?
Spring 配备构建Web 应用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。 -
DispatcherServlet
Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。 -
WebApplicationContext
WebApplicationContext 继承了ApplicationContext 并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题,并找到被关联的servlet。 -
什么是Spring MVC框架的控制器?
控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。 -
@Controller 注解
该注解表明该类扮演控制器的角色,Spring不需要你继承任何其他控制器基类或引用Servlet API。 -
@RequestMapping 注解
该注解是用来映射一个URL到一个类或一个特定的方处理法上。
java容器
-
java容器有哪些?
collection 和 map接口下的 list 和set Arraylist -
list和 set map之间有何区别?
实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。list是有序的队列,允许重复的元素。
实现了Set接口的集合有:HashSet、TreeSet、LinkedHashSet、EnumSet。set不包括重复的元素。
Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。 -
Hashmap和hashtable区别?
Hashtable继承Dictionary类,HashMap实现Map接口。
hashtable线程安全 ,hashmap不。 hashtable不允许null值,hashmap允许最多一个null值。 -
如何决定使用 HashMap 还是 TreeMap?
TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)
Hashmap数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。
由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。 -
说一下HashMap的实现原理?
HashMap 基于 Hash 算法实现,通过 put(key,value) 存储,get(key) 来获取 value
当传入 key 时,HashMap 会根据 key,调用 hash(Object key) 方法,计算出 hash 值,根据 hash 值将 value 保存在 Node 对象里,Node 对象保存在数组里。 -
说一下HashSet的实现原理?
HashSet实际上是一个HashMap实例,都是一个存放链表的数组。 -
Arraylist底层是数组,增删慢,查询快。
LinkedList底层是双向链表数组,增删快,查询慢。
Vector底层也是数组,不过性能较低,线程安全。 -
如何实现数组和List之间的转换?
数组转 List ,使用 JDK 中 java.util.Arrays 工具类的 asList 方法
List 转数组,使用 List 的toArray方法。无参toArray方法返回Object数组, -
Array和ArrayList的不同点:
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等 -
在 Queue 中 poll()和 remove()有什么区别?
相同点:都是返回第一个元素,并在队列中删除返回的对象。
不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。 -
哪些线程是安全的?
Vector hashtable stack enumeration -
迭代器Iterator是什么?
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
使用:
next() 方法获得集合中的下一个元素
hasNext() 检查集合中是否还有元素
remove() 方法将迭代器新返回的元素删除
forEachRemaining(Consumer<? super E> action) 方法,遍历所有元素 -
Iterator和ListIterator主要区别在以下方面?
ListIterator只能用于List,Iterator是通用的。
Iterator容易引起并发修改异常问题,而ListIterator可以避免线程安全问题的发生,因为其有内置的add()等修改集合的方法。 -
怎么确保一个集合不能被修改?
使用 JDK中java.util.Collections 类,unmodifiable*** 方法赋值原集合。
当再修改集合时,会报错 java.lang.UnsupportedOperationException。从而确保自己定义的集合不被其他人修改。 list = Collections.unmodifiableList(list);
反射
- Java反射?
Java反射机制主要提供了以下功能:
* .在运行时判断任意一个对象所属的类。
* 在运行时构造任意一个类的对象。
* 在运行时判断任意一个类所具有的成员变量和方法。
* 在运行时调用任意一个对象的方法。
-
什么是 java 序列化?什么情况下需要序列化?
序列化:将 Java 对象转换成字节流的过程。反序列化:将字节流转换成 Java 对象的过程。
当 Java 对象需要在网络上传输 或者 持久化存储到文件中时,就需要对 Java 对象进行序列化处理。
序列化的实现:类实现 Serializable 接口,这个接口没有需要实现的方法。实现 Serializable 接口是为了告诉 jvm 这个类的对象可以被序列化。 -
什么是动态代理,动态代理的应用有哪些? 怎么实现动态代理?
动态代理:当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。动态代理实现:首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。
动态代理的应用:Spring的AOP,加事务,加权限,加日志。
对象拷贝
-
为什么要使用克隆?
克隆的对象可能包含一些已经修改过的属性,而 new 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了。 -
如何实现对象克隆?
实现 Cloneable 接口并重写 Object 类中的 clone() 方法。
实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。 -
深拷贝和浅拷贝区别是什么?
浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。
java web
-
jsp和servlet有什么区别?
jsp经编译后就变成了Servlet。
jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。
Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletResponse对象以及HttpServlet对象得到
而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。 -
jsp有哪些内置对象?作用分别是什么?
request 用户端请求,此请求会包含来自GET/POST请求的参数,提供了几个用于获取cookie,header
response 网页传回用户端的回应,提供了几个设置返回浏览器的方法
pageContext 网页的属性是在这里管理,取名字
session 与请求有关的会话期,可以储存用户的状态信息
application servlet 正在执行的内容,有助于查找相关的引擎和信息
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外
-
说下jsp的4种作用域?
page(当前页面作用域):相当于 Java 关键字中 this。在这个作用域中存放的属性值,只能在当前页面中取出。
request(请求作用域):范围是从请求创建到请求消亡这段时间,一个请求可以涉及的多个页面。jsp:forward和jsp:include跳转到其他页面,也在作用域范围。
session(会话作用域):范围是一段客户端和服务端持续连接的时间,用户在会话有效期内多次请求所涉及的页面。seesion会话器,服务端为第一次建立连接的客户端分配一段有效期内的属性内存空间。
application(全局作用域):范围是服务端Web应用启动到停止,整个Web应用中所有请求所涉及的页面。当服务器开启时,会创建一个公共内存区域,任何客户端都可以在这个公共内存区域存取值。 -
session和cookie有什么区别?
cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie。
可以将登陆信息等重要信息存放为session。 -
说一下 session 的工作原理?
session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了。 -
是不是Cookie让禁用了,Session就一定不能用了呢?
答案是否定的,即使cookie禁用,session还可以借助于url来和客户端交互。 -
springmvc与struts2有什么区别?
底层实现机制:struts2:filter springmvc:servlet运行效率:
struts2:底层是Servlet,参数基于属性封装,如果配置单例,会出现线程安全问题,所以配置多例
springmvc:底层是Servlet,单例参数封装:struts2:基于属性封装 springmvc:基于方法进行封装
-
如何避免sql注入?
sql注入防御措施有:1.使用参数化筛选语句。2、避免使用解释程序。3、使用专业的漏洞扫描工具。4、企业在Web应用程序开发过程的所有阶段执行代码安全检查。 -
什么是 XSS 攻击,如何避免?
XSS 攻击,即跨站脚本攻击(Cross Site Scripting),它是 web 程序中常见的漏洞。
避免:
web 页面中可由用户输入的地方,如果对输入的数据转义、过滤处理
后台输出页面的时候,也需要对输出内容进行转义、过滤处理(因为攻击者可能通过其他方式把恶意脚本写入数据库)
前端对 html 标签属性、css 属性赋值的地方进行校验 -
什么使CSRF攻击?
是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。避免:检查Referer字段、添加校验token
JVM面试题
- 说一下jvm的主要组成部分以及作用?
类加载器(ClassLoader)
运行时数据区(Runtime Data Area)
执行引擎(Execution Engine)
本地库接口(Native Interface)
组件的作用:首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。
-
说一下jvm运行时的数据区?
运行时数据区分为线程私有和共享数据区两大类。其中线程私有的数据区包含程序计数器、虚拟机栈、本地方法区,所有线程共享的数据区包含 Java 堆、方法区,在方法区内有一个常量池。 -
说一下栈和堆的区别?
栈(stack)一般如数据结构的树,先进后出;栈因为是运行单位,因此里面存储的信息都是跟当前线程程序相关的,用于储存对象信息,包括局部变量、程序运行状态、方法返回值。
heap堆主要是动态分布运行内存大小,主要通过new指令构建对象来运用,存取速度较慢。 -
队列和栈有什么区别?
队列(Queue):是限定只能在表的一端进行插入和在另一端进行删除操作的线性表;
栈(Stack):是限定只能在表的一端进行插入和删除操作的线性表。
入队出队,先进先出。 入栈出栈,先进后出。 -
什么是双亲委派模型?
双亲委派的意思是当一个类收到了类加载的请求,首先自己并不会去加载这个类,而是将其委派到父类加载器,由父类去加载,如果此时父类无法加载,反馈给子类加载器,子类加载器再尝试去加载。逻辑上:自定义(classloader)—>应用类加载器(application classloder)---->拓展类加载器(Extension class)
------> 启动类加载器(bootstrap classloder) -
说一下类加载的执行过程?
加载-----链接------初始化------使用------卸载 -
谈谈如何判断一个对象是否可以被回收?
方式一:引用计数器:为每个对象创建一个引用计数,当有对象引用时,计数器+1,当引用释放时,计数器-1,所以,当计数器为0时,就认为可以被回收。
方式二:可达性分析从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链时,则认为此对象可以被回收 -
java中有哪些引用类型?
引用分为了:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。 -
GC 算法发生在堆主要有下面四种:
引用计数算法、标记–清除算法、标记–整理算法(老年代区)、复制算法(年轻区) -
说一下 jvm 有哪些垃圾回收器?
新生代收集器:Serial ParNew Parallel Scavenge
老年代收集器:Serial Old CMS Parallel Old
堆内存垃圾收集器:G1 -
详细介绍下cms
CMS 处理过程有七个步骤:
初始标记(CMS-initial-mark) ,会导致swt;
并发标记(CMS-concurrent-mark),与用户线程同时运行;
预清理(CMS-concurrent-preclean),与用户线程同时运行;
可被终止的预清理(CMS-concurrent-abortable-preclean) 与用户线程同时运行;
重新标记(CMS-remark) ,会导致swt;
并发清除(CMS-concurrent-sweep),与用户线程同时运行;
并发重置状态等待下次CMS的触发(CMS-concurrent-reset),与用户线程同时运行; -
新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
新生代回收器:Serial、ParNew、Parallel Scavenge
老年代回收器:Serial Old、Parallel Old、CMS
整堆回收器:G1
新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。
-
简述分代垃圾回收器是怎么工作的?
分代回收器有两个分区:老生代和新生代(2:1)
新生代使用的是复制算法,新生代里有 3 个分区:Eden、To Survivor、From Survivor,默认占比是 8:1:1 -
说一下jvm调优的工具?
都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm 这两款视图监控工具。
jconsole:用于对 JVM 中的内存、线程和类等进行监控;
jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化
- 常用的 JVM 调优的参数:
-Xms2g:初始化推大小为 2g;
-Xmx2g:堆最大内存为 2g;
-XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;
Mysql
1.mysql有哪几种锁?
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
2.Mysql中有哪些不同的表格?
MyISAM Heap Merge INNODB ISAM
3.如何显示前 50 行?
SELECT*FROM LIMIT 0,50;
java并发编程
-
在 java 中守护线程和本地线程区别
通过方法 Thread.setDaemon(boolon);true 则把该线程设置为守护线程,反之则为用户线程。 -
一个进程包含多个线程,线程在进程下运行,进程之间不会影响。
-
死锁:争抢资源,无法动弹,就死锁。
活锁:互让资源,无法运行,就活锁。
饥饿:指一个线程长时间一直得不到资源去运行,产生的饥饿,不过系统还能正常运行。 -
java中用到的线程调度算法是什么?
抢占式。一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。 -
使用Executor框架能够统一一下管理线程,野线程比较缺乏管理,而且耗费挺多资源。
-
什么是并发容器的执行?
并发容器使用了与同步容器完全不同的加锁策略来提供更高的并发性和伸缩性,例如在 ConcurrentHashMap 中采用了一种粒度更细的加锁机制,可以称为分段锁,在这种锁机制下,允许任意数量的读线程并发地访问 map,并且执行读操作的线程和写操作的线程也可以并发的访问 map,同时允许一定数量的写操作线程并发地修改 map,所以它可以在并发环境下实现更高的吞吐量。并发度就是segment 默认是16。 -
多线程同步和互斥有哪几种实现方法?
线程间的同步方法大体可以分为两类:用户模式和内核模式
用户模式:原子操作,临界区 内核模式:事件、信号量、互斥量
内核模式就是利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换内核态,只在用户态完成操作 -
什么是多线程中的上下文切换?
多线程会共同使用一组计算机上的 CPU,而线程数大于给程序分配的 CPU 数量时,为了让各个线程都有执行的机会,就需要轮转使用 CPU。不同的线程切换使用 CPU发生的切换数据等就是上下文切换。 -
如何停止一个正在运行的线程?
使用interrupt方法来终止线程。 Thread.join() 、 Thread.sleep() 、 ServerSocket.accept(); -
java如何实现多线程之间的通讯和协作 ?
协作就是同步,一.syncrhoized加锁的线程的Object类的wait()/notify()/notifyAll()
二.ReentrantLock类加锁的线程的Condition类的await()/signal()/signalAll()
线程间直接的数据交换:三.通过管道进行线程间通信:1)字节流;2)字符流 -
volatile 有什么用?
volatile 保证内存可见性和禁止指令重排。
volatile 用于多线程环境下的单次操作(单次读或者单次写)。
-
什么是Threadlocal变量?
threadlocal是多线程之间的一个特殊变量,一般用于在多线程传递常用变量之间,为了减少常量传递的复杂性而创建的,也是为了线程安全。 -
线程池的submit和execute方法区别
线程吃中的execute方法用于开启线程池中的任务,submit也能做到。
区别:接受的参数不同、submit有返回值、submit方便Exception处理 -
什么是阻塞式方法
java中的阻塞式方法是指在程序调用改方法时,必须等待输入数据可用或者检测到输入结束或者抛出异常,否则程序会一直停留在该语句上,不会执行下面的语句。 -
同步方法和同步块,那个是更好的选择?
同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。
算法题
- 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数
思路:这是一道二叉树遍历题,按照二叉搜索树的特点,结点的左孩子的值比当前结点小,右孩子的值比当前结点大,那么我们可以采取中序遍历的思想,首先遍历左孩子,然后中间节点,然后右孩子,使用一个变量记录当前是遍历的第几个结点,第k小结点就是遍历的第k个结点。
代码:
int index = 0;
int result = 0;
public int kthSmallest(TreeNode root, int k) {
leftCenterRight(root, k);
return result;
}
private void leftCenterRight(TreeNode root, int k) {
if (root.left != null || root.right != null) {
if (root.left != null) {
leftCenterRight(root.left, k);
}
index++;
if (index == k) {
result = root.val;
} else if (root.right != null) {
leftCenterRight(root.right, k);
}
} else {
index++;
if (index == k) {
result = root.val;
}
}
}
2.Java中如何找出数组中的最大值和最小值,平均值
int arr[] ={1,10,12,232,123};
class max1(arr[] ){
int max=a[0];
for(int i=0;i<=arr.length();i++){
if(max<arr[i]){
max=arr[i];
}
}
return max;
}
- 给出N个正整数,其中只有一个数出现了奇数次,其余的数都出现偶数次。求那个出现了奇数次的数.
public static int find(int[] arrry){
if(int i=1;i<array.length();i++){
array[0]=array[0]^array[i];
return array[0];
}
syso{find(array)};
}
mybatis
-
什么是mybatis
mybatis框架封装了jdbc,只需要专注于sql语句的编写,不用去编写和链接驱动,灵活度高,通过xml来配置和映射信息。 -
#{}是预编译处理,${}是字符串替换。
-
模糊查询like语句该怎么写?
select * from foo where bar like #{value} -
Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
使用标签 、、 使用sql列的别名功能 -
Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
-
Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
答:、、、、,加上动态sql的9个标签,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。 -
使用MyBatis的mapper接口调用时有哪些要求?
① Mapper接口方法名和mapper.xml中定义的每个sql的id相同;
② Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同;
③ Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同;
④ Mapper.xml文件中的namespace即是mapper接口的类路径。 -
您对微服务有何了解?
微服务,又称微服务 架构,是一种架构风格,它将应用程序构建为以业务领域为模型的小型自治服务集合 。