关于java:面试题

55次阅读

共计 8048 个字符,预计需要花费 21 分钟才能阅读完成。

1、罕用的汇合类有哪些?比方 List 如何排序?


最罕用的汇合类是 List、set 和 Map。

List 特点:元素有放入程序,元素可反复的。

Set 特点:元素无放入程序,元素不可反复,反复元素会笼罩掉。

Map 提供了一个更通用的元素存储办法。Map 汇合类用于存储元素对(称作 ” 键 ” 和 ” 值 ”),其中每个键映射到一个值。

2Object类中,有哪些办法?列举三个以上。

构造方法,toString(),equals,hashCode,getClass,finalize,clone, 三个 wait(),notify,notifyAll.

A:void finalize()

当垃圾回收器确定不存在对该对象的更多援用时,由对象的垃圾回收器调用此办法。

B:Class getClass()

获取对象的字节码文件的形容类,前面再讲反射的时候还会在说这个类。String name = s.getClass().getName();

C:int hashCode()

获取对象的哈希值。其实就是对象的内存地址值十进制示意

D:String toString()

返回对象的字符串示意。示意格局:

getClass().getName()+”@”+Integer.toHexString(hashCode());

个别咱们输入对象名的时候,其实底层调用的就是该对象的 toString()办法。这种返回没有意义,所以,咱们会重写这个办法,显示类的成员变量信息。

E:boolean equals(Object obj)

用于比拟两个对象的地址值是否雷同。

咱们获取对象后,比拟它的地址值意义不大。所以也会对这个办法进行重写。重写要实现什么性能,是依据需要定的。

3Java中的异样有哪几类?别离怎么应用?

  1. Error: 零碎级的谬误,eg: 内存溢出 — OutOfMemoryError
  2. Exception:程序级的谬误 — 通常是因为程序员逻辑不当引起的,能够批改代码来解决的。

编译时异样;运行时异样;自定义异样。

  1. 检出异样,非检出异样。检出异样须要 try…catch 能力编译通过。非检出异样不必 try…catch 也能编译通过。

RuntimeException 是非检出异样,不须要 try…catch 也能编译通过。

IoException,SQLException 等等其余所有异样都是检出异样,必须要 try…catach 能力编译通过。

4、如何用 Java 调配一段间断的 1G 的内存空间?须要留神些什么?

ByteBuffer.allocateDirect(102410241024) 留神内存溢出

5、如何格式化日期?

应用 SimpleDateFormat 类或者 joda-time 库来格局日期。

6java创建对象的几种形式?

应用 new 关键字

} → 调用了构造函数

应用 Class 类的 newInstance 办法

} → 调用了构造函数

应用 Constructor 类的 newInstance 办法

} → 调用了构造函数

应用 clone 办法

} → 没有调用构造函数

应用反序列化

} → 没有调用构造函数

7final有哪些用法?

final 的用法:润饰类;润饰办法;润饰成员变量;润饰局部变量。

1. 被 final 润饰的类不能够被继承 2. 被 final 润饰的办法不能够被重写 3. 被 final 润饰的变量不能够被扭转。如果润饰援用,那么示意援用不可变,援用指向的内容可变。4. 被 final 润饰的办法,JVM 会尝试将其内联,以进步运行效率 5. 被 final 润饰的常量,在编译阶段会存入常量池中。

8、如何实现汇合排序?

第一种称为天然排序, 参加排序的对象需实现 comparable 接口, 重写其 compareTo()办法, 办法体中实现对象的比拟大小规定。

第二种叫定制排序, 或自定义排序, 需编写匿名外部类, 先 new 一个 Comparator 接口的比拟器对象, 同时实现 compare()其办法; 而后将比拟器对象传给 Collections.sort()办法的参数列表中, 实现排序功能;

重点把握

Collections.sort(list,new Comparator<String>(){public int compare(String o1, String o2) {return o1.length()-o2.length();}  
}); 
System.out.println(list);    

自定义排序

Collections.sort(list,new Comparator<Point2>(){public int compare(Point2 o1, Point2 o2) {int len1 =o1.getX()*o1.getX()+o1.getY()*o1.getY(); 
        int len2 =o2.getX()*o2.getX()+o2.getY()*o2.getY();
        return len1-len2;
      }
}); 
System.out.println(list);

Random random = new Random(); 
for(int i=0;i<10;i++){list.add(random.nextInt(100));
} 
System.out.println(list); 
Collections.sort(list); 
System.out.println(list);

9、如何打印数组信息?

应用 for 或(fore)循环

for(int i=0;i<array.length;i++){System.out.println(array[i]);
}


应用 Arrays.toString() 打印。

public class Demo {public static void main(String[] args) {String[] infos = new String[] {"Java", "Android", "C/C++", "Kotlin"};
    System.out.println(Arrays.toString(infos));
  }
}
​

应用 Arrays.deepToString() 办法打印。如果数组中有其它数组,即多维数组,也会用同样的办法深度显示。

public class Demo {public static void main(String[] args) {String[] infos = new String[] {"Java", "Android", "C/C++", "Kotlin"};
​    System.out.println(Arrays.deepToString(infos));
  }
}

数组如何扩容?

10、遍历 ArrayList 时,如何正确移除一个元素?

办法一、for 循环遍历 public class Test1{

public static void main(String args[]) {List<String> aList = new ArrayList();
    aList.add("a");
    aList.add("ab");
    aList.add("abc");
    aList.add("abc");
    aList.add("abcr");
    aList.add("abc");
    aList.add("abcf");
    aList.add("abc");
    aList.add("abdc");
    for(int i=0;i<aList.size();i++) {if(aList.get(i).equals("abc")) {System.out.println(i+":"+aList.get(i));
            aList.remove(i); // 删除后 下标调整 导致漏删
        }
    }
    System.out.println(aList);
}

办法二、迭代遍历

public static void main(String args[]) {List<String> aList = new ArrayList();
    aList.add("a");
    aList.add("ab");
    aList.add("abc");
    aList.add("abc");
    aList.add("abcr");
    aList.add("abc");
    aList.add("abcf");
    aList.add("abc");
    aList.add("abdc");
    Iterator<String> iter = aList.iterator();
    while(iter.hasNext()) {if(iter.next().equals("abc")) {iter.remove();
        }
    }
        System.out.println(aList);
}

11String类的罕用办法都有哪些?

equals:字符串是否雷同

length:字符串字符数

indexOf:指标字符或字符串在源字符串中地位下标

lastIndexOf:指标字符或字符串在源字符串中最初一次呈现的地位下标

substring:截取字符串

charAt:获取指定下标地位的字符

startsWith:是否以指标字符串结尾

endsWith:是否以指标字符串完结

valueOf:其余类型转字符串

toLowerCase:字符串转小写

toUpperCase:字符串转大写

trim:去字符串首尾空格

split:以某正则表达式宰割字符串

replace:字符串替换

replaceAll:带正则字符串替换

replaceFirst:替换第一个呈现的指标字符串

equalsIgnoreCase:疏忽大小写后字符串是否雷同

compareTo:依据字符串中每个字符的 Unicode 编码进行比拟

compareToIgnoreCase:依据字符串中每个字符的 Unicode 编码进行疏忽大小写比拟

codePointAt:指定下标的字符的 Unicode 编码

concat:追加字符串到以后字符串

isEmpty:字符串长度是否为 0

contains:是否蕴含指标字符串

format:格式化字符串

getBytes:获取字符串的字节数组

getChars:获取字符串的指定长度字符数组

toCharArray:获取字符串的字符数组

join:以某字符串,连贯某字符串数组

matches:字符串是否匹配正则表达式

12JSP有哪些内置对象?作用别离是什么?

· request封装客户端的申请,其中蕴含来自 get 或 post 申请的参数;

· response:封装服务器对客户端的响应;

· pageContext:通过该对象能够获取其余对象;

· session:封装用户会话的对象;

· application:封装服务器运行环境的对象;

· out:输入服务器响应的输入流对象;

· config:Web 利用的配置对象;

· page:JSP 页面自身(相当于 Java 程序中的 this);

· exception:封装页面抛出异样的对象。

13JSP的四种作用域?

· page:代表与一个页面相干的对象和属性。

· request:代表与客户端收回的一个申请相干的对象和属性。一个申请可能逾越多个页面,波及多个 Web 组件;须要在页面显示的长期数据能够置于此作用域。

· session:代表与某个用户与服务器建设的一次会话相干的对象和属性。跟某个用户相干的数据应该放在用户本人的 session 中。

· application:代表与整个 Web 应用程序相干的对象和属性,它本质上是逾越整个 Web 应用程序,包含多个页面、申请和会话的一个全局作用域。

14String/StringBuffer/StringBuilder的区别,扩大再问他们的实现?

String 值不可变 字符串常量 操作大量数据 StringBuffer 值可变是线程平安 字符串变量,实用于多线程操作大量数据 StringBuilder 值可变是线程不平安的 字符串变量,实用于单线程操作大量数据

15 Servlet的生命周期?

实例、初始化、服务解决(接管申请,解决申请,返回后果)、销毁。

16Session/Cookie的区别?

Cookie 是采纳客户端放弃状态的计划,内容寄存在客户的浏览器上,不平安,cookie,未设置过期工夫个别保留在内存中,成为会话 Cookie,一旦浏览器敞开,这个 Cookie 也就敞开;若设置了过期工夫,则是保留在硬盘上,下次仍然会无效 Session 是采纳服务器放弃状态的计划,内容寄存在服务器上,更为平安,当有一个客户端要与服务器建设连贯时,服务器会检索申请是否蕴含一个 session 标识,若蕴含,则将这个 session 检索进去。

3触发器的作用是什么?

触发器是一种用来保障参照完整性的非凡的存储过程,它保护不同表中数据间关系的无关规定。当对指定的表进行某种特定操作(如:Insert,Delete 或 Update)时,触发器产生作用。触发器能够调用存储过程。

索引的两种类型?

索引分单列索引和组合索引。单列索引,即一个索引只蕴含单个列,一个表能够有多个单列索引,但这不是组合索引。组合索引,即一个索引蕴含多个列

hibernatemybatis/ibatis 的区别?

相同点:屏蔽 jdbc api 的底层拜访细节,应用咱们不必与 jdbc api 打交道,就能够拜访数据。

jdbc api 编程流程固定,还将 sql 语句与 java 代码混淆在了一起,常常须要拼凑 sql 语句,细节很繁琐。

ibatis 的益处:屏蔽 jdbc api 的底层拜访细节;将 sql 语句与 java 代码进行拆散; 提供了将后果集主动封装称为实体对象和对象的汇合的性能,queryForList 返回对象汇合,用 queryForObject 返回单个对象;提供了主动将实体对象的属性传递给 sql 语句的参数。

Hibernate 是一个全自动的 orm 映射工具,它能够主动生成 sql 语句,ibatis 须要咱们本人在 xml 配置文件中写 sql 语句,hibernate 要比 ibatis 性能负责和弱小很多。因为 hibernate 主动生成 sql 语句,咱们无法控制该语句,咱们就无奈去写特定的高效率的 sql。对于一些不太简单的 sql 查问,hibernate 能够很好帮咱们实现,然而,对于特地简单的查问,hibernate 就很难适应了,这时候用 ibatis 就是不错的抉择,因为 ibatis 还是由咱们本人写 sql 语句。

简述 Spring 中罕用注解?

答案:

  1. @Component:规范一个一般的 spring Bean 类。
  2. @Repository:标注一个 DAO 组件类。
  3. @Service:标注一个业务逻辑组件类。
  4. @Controller:标注一个控制器组件类。
  5. @Resource:注入组件

过滤器和拦截器

过滤器和拦截器 触发机会 不一样:过滤器是在申请进入容器后,但申请进入 servlet 之前进行预处理的。申请完结返回也是,是在 servlet 解决完后,返回给前端之前。 ①拦截器是基于 java 的反射机制的,而过滤器是基于函数回调。②拦截器不依赖与 servlet 容器,过滤器依赖与 servlet 容器。③拦截器只能对 action 申请起作用,而过滤器则能够对简直所有的申请起作用。④拦截器能够拜访 action 上下文、值栈里的对象,而过滤器不能拜访。⑤在 action 的生命周期中,拦截器能够屡次被调用,而过滤器只能在容器初始化时被调用一次。拦截器能够获取 IOC 容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,能够调用业务逻辑。

springmvc的启动流程

Ajax

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

AJAX 不是新的编程语言,而是一种应用现有规范的新办法。

AJAX 是与服务器替换数据并更新局部网页的艺术,在 不从新加载整个页面 的状况下。

什么是AOP

在运行时,动静的将代码切入到类的指定办法、指定地位上的编程思维就是面向切面的编程。AOP即面向切面编程。应用切面编程,能够将一些系统性的代码提取进去,独立实现,与外围业务代码剥离,比方权限治理、事务管理、日志记录等等。AOP 是 spring 提供的要害个性之一。

AOP 分为动态 AOP 和动静 AOP

14、如何实现跨域?

15、创立线程池有哪几种形式?简述特点、

· extends Thread — 重写 run 办法(定义执行的工作)

· implements Runnable 接口 — 重写 run 办法(执行的工作)

  1. newSingleThreadExecutor():它的特点在于工作线程数目被限度为 1,操作一个无界的工作队列,所以它保障了所有工作的都是被程序执行,最多会有一个工作处于活动状态,并且不容许使用者改变线程池实例,因而能够防止其扭转线程数目;
  2. newCachedThreadPool():它是一种用来解决大量短时间工作工作的线程池,具备几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创立新的工作线程;如果线程闲置的工夫超过 60 秒,则被终止并移出缓存;长时间闲置时,这种线程池,不会耗费什么资源。其外部应用 SynchronousQueue 作为工作队列;
  3. newFixedThreadPool(int nThreads):重用指定数目(nThreads)的线程,其背地应用的是无界的工作队列,任何时候最多有 nThreads 个工作线程是流动的。这意味着,如果工作数量超过了流动队列数目,将在工作队列中期待闲暇线程呈现;如果有工作线程退出,将会有新的工作线程被创立,以补足指定的数目 nThreads;
  4. newSingleThreadScheduledExecutor():创立单线程池,返回 ScheduledExecutorService,能够进行定时或周期性的工作调度;
  5. newScheduledThreadPool(int corePoolSize):和 newSingleThreadScheduledExecutor()相似,创立的是个 ScheduledExecutorService,能够进行定时或周期性的工作调度,区别在于繁多工作线程还是多个工作线程;
  6. newWorkStealingPool(int parallelism):这是一个常常被人疏忽的线程池,Java 8 才退出这个创立办法,其外部会构建 ForkJoinPool,利用 Work-Stealing 算法,并行地解决工作,不保障解决程序;
  7. ThreadPoolExecutor():是最原始的线程池创立,下面 1 - 3 创立形式都是 ThreadPoolExecutor 的封装。

16、什么是乐观锁和乐观锁?

观锁对应于生存中乐观的人总是想着事件往好的方向倒退,乐观锁对应于生存中乐观的人总是想着事件往坏的方向倒退。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。

乐观锁

总是假如最坏的状况,每次去拿数据的时候都认为他人会批改,所以每次在拿数据的时候都会上锁,这样他人想拿这个数据就会阻塞直到它拿到锁(共享资 源每次只给一个线程应用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比方行锁,表锁 等,读锁,写锁等,都是在做操作之前先上锁。Java 中 synchronized 和 ReentrantLock 等独占锁就是乐观锁思维的实现。

乐观锁

总是假如最好的状况,每次去拿数据的时候都认为他人不会批改,所以不会上锁,然而在更新的时候会判断一下在此期间他人有没有去更新这个数据,能够 应用版本号机制和

CAS 算法实现。乐观锁实用于多读的利用类型,这样能够提 高吞吐量,像数据库提供的相似于 write_condition 机制,其实都是提供的乐 观锁。在 Java 中

java.util.concurrent.atomic 包上面的原子变量类就是应用了 乐观锁的一种实现形式 CAS 实现的。

两种锁的应用场景

从上面对两种锁的介绍,咱们晓得两种锁各有优缺点,不可认为一种好于另一 种,像乐观锁实用于写比拟少的状况下(多读场景),即抵触真的很少产生的 时候,这样能够省去了锁的开销,加大了零碎的整个吞吐量。但如果是多写的 状况,个别会常常产生抵触乐

正文完
 0