1、罕用的汇合类有哪些?比方List如何排序?
最罕用的汇合类是 List 、set和 Map。
List特点:元素有放入程序,元素可反复的。
Set特点:元素无放入程序,元素不可反复,反复元素会笼罩掉。
Map 提供了一个更通用的元素存储办法。 Map 汇合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值。
2、Object类中,有哪些办法?列举三个以上。
构造方法,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)
用于比拟两个对象的地址值是否雷同。
咱们获取对象后,比拟它的地址值意义不大。所以也会对这个办法进行重写。重写要实现什么性能,是依据需要定的。
3、Java中的异样有哪几类?别离怎么应用?
- Error:零碎级的谬误,eg:内存溢出 -- OutOfMemoryError
- Exception:程序级的谬误 -- 通常是因为程序员逻辑不当引起的,能够批改代码来解决的。
编译时异样;运行时异样;自定义异样。
- 检出异样,非检出异样。检出异样须要try...catch能力编译通过。非检出异样不必try...catch也能编译通过。
RuntimeException是非检出异样,不须要try...catch也能编译通过。
IoException,SQLException等等其余所有异样都是检出异样,必须要try...catach能力编译通过。
4、如何用Java调配一段间断的1G的内存空间?须要留神些什么?
ByteBuffer.allocateDirect(102410241024) 留神内存溢出
5、如何格式化日期?
应用 SimpleDateFormat 类或者 joda-time 库来格局日期。
6、java创建对象的几种形式?
应用new关键字
} → 调用了构造函数
应用Class类的newInstance办法
} → 调用了构造函数
应用Constructor类的newInstance办法
} → 调用了构造函数
应用clone办法
} → 没有调用构造函数
应用反序列化
} → 没有调用构造函数
7、final有哪些用法?
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);}
11、String类的罕用办法都有哪些?
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:字符串是否匹配正则表达式
12、JSP有哪些内置对象?作用别离是什么?
· request:封装客户端的申请,其中蕴含来自 get 或 post 申请的参数;
· response:封装服务器对客户端的响应;
· pageContext:通过该对象能够获取其余对象;
· session:封装用户会话的对象;
· application:封装服务器运行环境的对象;
· out:输入服务器响应的输入流对象;
· config:Web 利用的配置对象;
· page:JSP 页面自身(相当于 Java 程序中的 this);
· exception:封装页面抛出异样的对象。
13、JSP的四种作用域?
· page:代表与一个页面相干的对象和属性。
· request:代表与客户端收回的一个申请相干的对象和属性。一个申请可能逾越多个页面,波及多个 Web 组件;须要在页面显示的长期数据能够置于此作用域。
· session:代表与某个用户与服务器建设的一次会话相干的对象和属性。跟某个用户相干的数据应该放在用户本人的 session 中。
· application:代表与整个 Web 应用程序相干的对象和属性,它本质上是逾越整个Web 应用程序,包含多个页面、申请和会话的一个全局作用域。
14、String/StringBuffer/StringBuilder的区别,扩大再问他们的实现?
String 值不可变 字符串常量 操作大量数据 StringBuffer 值可变是线程平安 字符串变量,实用于多线程操作大量数据 StringBuilder 值可变是线程不平安的 字符串变量,实用于单线程操作大量数据
15、 Servlet的生命周期?
实例、初始化、服务解决(接管申请,解决申请,返回后果)、销毁。
16、Session/Cookie的区别?
Cookie是采纳客户端放弃状态的计划,内容寄存在客户的浏览器上,不平安,cookie,未设置过期工夫个别保留在内存中,成为会话Cookie,一旦浏览器敞开,这个Cookie也就敞开;若设置了过期工夫,则是保留在硬盘上,下次仍然会无效 Session是采纳服务器放弃状态的计划,内容寄存在服务器上,更为平安,当有一个客户端要与服务器建设连贯时,服务器会检索申请是否蕴含一个session标识,若蕴含,则将这个session检索进去。
3触发器的作用是什么?
触发器是一种用来保障参照完整性的非凡的存储过程,它保护不同表中数据间关系的无关规定。当对指定的表进行某种特定操作(如:Insert,Delete或Update)时,触发器产生作用。触发器能够调用存储过程。
索引的两种类型?
索引分单列索引和组合索引。 单列索引,即一个索引只蕴含单个列,一个表能够有多个单列索引,但这不是组合索引。 组合索引,即一个索引蕴含多个列
hibernate和mybatis/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中罕用注解?
答案:
- @Component :规范一个一般的spring Bean类。
- @Repository:标注一个DAO组件类。
- @Service:标注一个业务逻辑组件类。
- @Controller:标注一个控制器组件类。
- @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办法(执行的工作)
- newSingleThreadExecutor():它的特点在于工作线程数目被限度为 1,操作一个无界的工作队列,所以它保障了所有工作的都是被程序执行,最多会有一个工作处于活动状态,并且不容许使用者改变线程池实例,因而能够防止其扭转线程数目;
- newCachedThreadPool():它是一种用来解决大量短时间工作工作的线程池,具备几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创立新的工作线程;如果线程闲置的工夫超过 60 秒,则被终止并移出缓存;长时间闲置时,这种线程池,不会耗费什么资源。其外部应用 SynchronousQueue 作为工作队列;
- newFixedThreadPool(int nThreads):重用指定数目(nThreads)的线程,其背地应用的是无界的工作队列,任何时候最多有 nThreads 个工作线程是流动的。这意味着,如果工作数量超过了流动队列数目,将在工作队列中期待闲暇线程呈现;如果有工作线程退出,将会有新的工作线程被创立,以补足指定的数目 nThreads;
- newSingleThreadScheduledExecutor():创立单线程池,返回 ScheduledExecutorService,能够进行定时或周期性的工作调度;
- newScheduledThreadPool(int corePoolSize):和newSingleThreadScheduledExecutor()相似,创立的是个 ScheduledExecutorService,能够进行定时或周期性的工作调度,区别在于繁多工作线程还是多个工作线程;
- newWorkStealingPool(int parallelism):这是一个常常被人疏忽的线程池,Java 8 才退出这个创立办法,其外部会构建ForkJoinPool,利用Work-Stealing算法,并行地解决工作,不保障解决程序;
- ThreadPoolExecutor():是最原始的线程池创立,下面1-3创立形式都是ThreadPoolExecutor的封装。
16、什么是乐观锁和乐观锁?
观锁对应于生存中乐观的人总是想着事件往好的方向倒退,乐观锁对应于生存中乐观的人总是想着事件往坏的方向倒退。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。
乐观锁
总是假如最坏的状况,每次去拿数据的时候都认为他人会批改,所以每次在拿数据的时候都会上锁,这样他人想拿这个数据就会阻塞直到它拿到锁(共享资 源每次只给一个线程应用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比方行锁,表锁 等,读锁,写锁等,都是在做操作之前先上锁。Java 中 synchronized 和 ReentrantLock 等独占锁就是乐观锁思维的实现。
乐观锁
总是假如最好的状况,每次去拿数据的时候都认为他人不会批改,所以不会上锁,然而在更新的时候会判断一下在此期间他人有没有去更新这个数据,能够 应用版本号机制和
CAS 算法实现。乐观锁实用于多读的利用类型,这样能够提 高吞吐量,像数据库提供的相似于 write_condition 机制,其实都是提供的乐 观锁。在 Java 中
java.util.concurrent.atomic 包上面的原子变量类就是应用了 乐观锁的一种实现形式 CAS 实现的。
两种锁的应用场景
从上面对两种锁的介绍,咱们晓得两种锁各有优缺点,不可认为一种好于另一 种,像乐观锁实用于写比拟少的状况下(多读场景),即抵触真的很少产生的 时候,这样能够省去了锁的开销,加大了零碎的整个吞吐量。但如果是多写的 状况,个别会常常产生抵触乐