⾃⼰总结的⼀些合肥地区1-3年java⾯试题及答案
此篇⽂章是今年5⽉份⾯试⼀些公司问到的⼀些问题,在此与⼤家分享⼀下,话不多说进⼊正题。
java基础部分
1.JDK JVM JRE有什么区别?
JDK是针对Java开发员的产品,是整个Java的核⼼,包括了Java运⾏环境JRE、Java⼯具和Java基础类库。JRE是运⾏JAVA程序所必须的环境的集合,包含JVM标准实现及Java核⼼类库。JVM是Java虚拟机的缩写,是整个java实现跨平台的最核⼼的部分,能够运⾏以Java语⾔写作的软件程序。
2.java有⼏⼤特性?
java有4个基本特性分别是抽象、封装、继承、多态
3.string常⽤API列举?
常⽤的⽅法有length()计算字符串长度,equals()⽐较字符串,replace()替换,charAt()截取⼀个字符串,substring()截取字符串,indexOf()查字符或者⼦串第⼀次出现的地⽅,concat()连接两个字符串,trim()去掉起始和结尾的空格,valueOf()转换为字符串等
4.如何删除字符串中指定的某个元素?
这是我写的⼀个测试⽅法,只是其中⼀种解决⽅法⽹上还有很多其他⽅法
public class test {
public static void main(String[] args){
String str = "abcde";
String strafter= "";
char delstr = 'a';
for (int i=0;i<str.length();i++){
if(str.charAt(i)!=delstr){
strafter+=str.charAt(i);
}
}
System.out.println(strafter);
}
}
数据类型分类标准5.Arrylist和Linkedlist区别?
简单来说1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2. 对于随机访问get和set,ArrayList 觉得优于LinkedList,因为LinkedList要移动指针。 3. 对于新增和删除操作add和remove,LinedList⽐较占优势,因为ArrayList要移动数据
6.list和map的⼏种遍历⽅式?
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("123");
list.add("456");
list.add("789");
System.out.println("------经典的for循环-----");
for (int i = 0; i < list.size(); i++) {
System.out.(i));
}
System.out.println("-------Iterate循环--------");
Iterator<String> iter=list.iterator();
while(iter.hasNext())
{
System.out.());
}
System.out.println("-------foreach循环---------");
for (String string : list) {
System.out.println(string);
}
}
//循环遍历map的⽅法
public class MapF {
public static void main(String[] args) {
Map<String, Integer> tempMap = new HashMap<String, Integer>();
tempMap.put("a","12");
tempMap.put("b","34");
tempMap.put("c","56");
// JDK1.4中
// 遍历⽅法⼀ hashmap entrySet() 遍历
Iterator it = Set().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
Object key = Key();
Object value = Value();
System.out.println("key=" + key + " value=" + value);
}
System.out.println("");
// JDK1.5中,应⽤新特性For-Each循环
// 遍历⽅法⼆
for (Map.Entry<String, Integer> entry : Set()) {
String key = Key().toString();
String value = Value().toString();
System.out.println("key=" + key + " value=" + value);
}
System.out.println("");
// 遍历⽅法三 hashmap keySet() 遍历
for (Iterator i = tempMap.keySet().iterator(); i.hasNext();) {
Object obj = i.next();
System.out.println(obj);// 循环输出key
System.out.println("key=" + obj + " value=" + (obj));
}
for (Iterator i = tempMap.values().iterator(); i.hasNext();) {
Object obj = i.next();
System.out.println(obj);// 循环输出value
}
// 遍历⽅法四 treemap keySet()遍历
for (Object o : tempMap.keySet()) {
System.out.println("key=" + o + " value=" + (o));
}
System.out.println("11111");
// java如何遍历Map <String, ArrayList> map = new HashMap <String,
// ArrayList>();
System.out.println("java 遍历Map <String, ArrayList> map = new HashMap<String, ArrayList>();"); Map<String, ArrayList> map = new HashMap<String, ArrayList>();
echarts地图Set<String> keys = map.keySet();
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()) {
String key = ();
ArrayList arrayList = (key);
for (Object o : arrayList) {
System.out.println(o);
}
}
Map<String, List> map = new HashMap<String, List>();
for (Map.Entry entry : Set()) {
String key = Key().toString();
List<String> list= (List) Value();
for (String value : list) {
System.out.println(key + "====" + value);
}
}
acesse爱搜索会员登录}
}
7.hashmap实现原理及与hashtable区别?
HashMap基于hashing原理,我们通过put()和get()⽅法储存和获取对象。当我们将键值对传递给put()⽅法时,它调⽤键对象的hashCode()⽅法来计算hashcode,让后到bucket位置来储存值对象。当获取对象时,通过键对象的equals()⽅法到正确的键值对,然后返回值对象。HashMap使⽤链表来解决碰撞问题,当发⽣碰撞了,对象将会储存在链表的下⼀个节点中。 HashMap在每个链表节点中储存键值对对象。
当两个不同的键对象的hashcode相同时会发⽣什么? 它们会储存在同⼀个bucket位置的链表中。键对象的equals()⽅法⽤来到键值对。
HashMap和Hashtable都实现了Map接⼝,但决定⽤哪⼀个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
1. HashMap⼏乎可以等价于Hashtable,除了HashMap是⾮synchronized的,并可以接受null(HashMap可以接受为null的键
值(key)和值(value),⽽Hashtable则不⾏)。
2. HashMap是⾮synchronized,⽽Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享⼀个
Hashtable;⽽如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是
HashTable的替代,⽐HashTable的扩展性更好。
3. 另⼀个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,⽽Hashtable的enumerator迭代器不是fail-fast的。所以当有
其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本⾝的remove()⽅法移除元素则不会抛出ConcurrentModificationException异常。但这并不是⼀个⼀定发⽣的⾏为,要看JVM。这条同样也是Enumeration和Iterator的区别。
4. 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它⽐HashMap要慢。如果你不需要同步,只需要单⼀
线程,那么使⽤HashMap性能要好过Hashtable。
5. HashMap不能保证随着时间的推移Map中的元素次序是不变的。
<与post请求区别?
简单总结⼀下1.get是从服务器上获取数据,post是向服务器传送数据。2. POST⽐GET安全,因为数据在地址栏上不可见。3.get ⽅式提交的数据最多只能有1024字节,⽽post则没有此限制。4.GET使⽤URL或Cookie传参。⽽POST将数据放在BODY中。
9.接⼝和抽象类的区别?
1、⼀个类可以实现多个接⼝,但是却只能继承最多⼀个抽象类;
2、抽象类可以包含具体的⽅法,接⼝的所有⽅法都是抽象的;
3、抽象类可以声明和使⽤字段;接⼝则不能,但接⼝可以创静态的final常量;
4、接⼝的⽅法都是public的,抽象类的⽅法可以使public,private,protecte或者是默认的packag;
5、抽象类可以定义构造函数,但是接⼝不⾏。
⼀般情况下,客户端通过传递 pageNo(页码)、pageSize(每页条数)两个参数去分页查询数据库中的数据,在数据量较⼩(元组百/千级)时使⽤ MySQL⾃带的 limit 来解决这个问题:
收到客户端{pageNo:1,pagesize:10}
select * from table limit (pageNo-1)*pageSize, pageSize;
其实你答出limit和两个参数就可以了,问到oracle分页答出rownum关键字差不多了,如果数据量⽐较⼤这时我们就要考虑加索引了。
11.重定向和转发有什么区别?
重定向:以前的request中存放的变量全部失效,并进⼊⼀个新的request作⽤域。
转发:以前的request中存放的变量不会失效,就像把两个页⾯拼到了⼀起。
通俗的说重定向⽤户请求变了⽽转发没变
java提升部分
1.简述Spring IOC AOP理解
IOC:Inversion of Control控制反转,也叫(Dependency Injection)依赖注⼊, dao接⼝的实现不再是业务逻辑层调⽤⼯⼚类去获取,⽽是通过容器(spring)来⾃动的为我们的业务层设置Dao的实现类,这样整个过程就反过来,以前是我们业务层主动去获取dao,⽽现在是dao主动被设置到业务逻辑层中来了,这个也就是反转控制的由来。通过IOC,我们就可以在不修改任何代码的情况下,⽆缝地实现数据库的换库迁移
简单⼀点说:
IOC就是⼀个⽣产和管理bean的容器就⾏了,原来需要在调⽤类中new的东西,现在都是通过容器⽣成,同时,要是产⽣的是单例的bean,他还可以给管理bean的⽣命周期。
AOP:⾯向切⾯编程。(Aspect-Oriented Programming)
AOP可以说是对OOP的补充和完善。OOP引⼊封装、继承和多态性等概念来建⽴⼀种对象层次结构,⽤以模拟公共⾏为的⼀个集合。实现AOP的技术。对于如权限认证、⽇志、事务等⼏乎业务功能都需要的功能,若采⽤OOP的设计则会产⽣⼤量的重复代码,不利于各模块的重⽤。Spring AOP采⽤的是动态代理,在运⾏期间对业务⽅法进⾏增强,所以不会⽣成新类,对于动态代理技术,Spring AOP提供了对JDK动态代理的⽀持以及CGLib的⽀持。
2.bean的⽣命周期
1.实例化bean对象(通过构造⽅法或者⼯⼚⽅法)
2.设置对象属性(setter等)(依赖注⼊)
3.如果Bean实现了BeanNameAware接⼝,⼯⼚调⽤Bean的setBeanName()⽅法传递Bean的ID。
4.如果Bean实现了BeanFactoryAware接⼝,⼯⼚调⽤setBeanFactory()⽅法传⼊⼯⼚⾃⾝
5.将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)⽅法
6.调⽤Bean的初始化⽅法
7.将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)⽅法
使⽤Bean
8.容器关闭之前,调⽤Bean的销毁⽅法
两者的区别:
1.JDK动态代理只能代理实现了接⼝的类,动态代理类的字节码在程序运⾏时由Java反射机制动态⽣成。
2.Cglib是可以代理没有实现接⼝的类,cglib是针对类来实现代理的,他的原理是对指定的⽬标类⽣成⼀个⼦类,并覆盖其 中⽅法实现增强,所以不能对final修饰的类进⾏代理。底层采⽤ASM实现。
3.Spring怎么管理事务(配置,事务的传播机制)
Spring的事务机制包括声明式事务和编程式事务。
编程式事务管理:Spring推荐使⽤TransactionTemplate,实际开发中使⽤声明式事务较多。
声明式事务管理:将我们从复杂的事务处理中解脱出来,获取连接,关闭连接、事务提交、回滚、异常处理等这些操作都不⽤我们处理了,Spring都会帮我们处理。
声明式事务管理使⽤了AOP⾯向切⾯编程实现的,本质就是在⽬标⽅法执⾏前后进⾏拦截。在⽬标⽅法执⾏前加⼊或创建⼀个事务,在执⾏⽅法执⾏后,根据实际情况选择提交或是回滚事务。
browser能删除吗如何管理的:
Spring事务管理主要包括3个接⼝,Spring的事务主要是由他们三个共同完成的。
1)PlatformTransactionManager:事务管理器--主要⽤于平台相关事务的管理
oops英语怎么读语音主要有三个⽅法:commit 事务提交;
rollback 事务回滚;
getTransaction 获取事务状态。
2)TransactionDefinition:事务定义信息--⽤来定义事务相关的属性,给事务管理器PlatformTransactionManager使⽤
这个接⼝有下⾯四个主要⽅法:
getIsolationLevel:获取隔离级别;
getPropagationBehavior:获取传播⾏为;
getTimeout:获取超时时间;
isReadOnly:是否只读(保存、更新、删除时属性变为false--可读写,查询时为true--只读)
事务管理器能够根据这个返回值进⾏优化,这些事务的配置信息,都可以通过配置⽂件进⾏配置。
3)TransactionStatus:事务具体运⾏状态--事务管理过程中,每个时间点事务的状态信息。
例如它的⼏个⽅法:
hasSavepoint():返回这个事务内部是否包含⼀个保存点,
isCompleted():返回该事务是否已完成,也就是说,是否已经提交或回滚
isNewTransaction():判断当前事务是否是⼀个新事务
声明式事务的优缺点:
优点
不需要在业务逻辑代码中编写事务相关代码,只需要在配置⽂件配置或使⽤注解(@Transaction),这种⽅式没有侵⼊性。
缺点
声明式事务的最细粒度作⽤于⽅法上,如果像代码块也有事务需求,只能变通下,将代码块变为⽅法。
mysql面试题常问4.简述Spring MVC流程
1.⽤户向服务器发出请求到spring mvc的前端总控制器DispatcherServlet,并且通过DispatcherServlet来加载相关的配置⽂件信息。
2.DispatcherServlet接收到客户端请求,到对应HandlerMapping,根据映射规则,到对应的处理器(Handler)。
3.调⽤相应处理器中的处理⽅法,处理该请求后,会返回⼀个ModelAndView。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论