1.java 集合实现了什么接口?java
Java API针对集合类型排序提供了两种支持:
java.util.Collections.sort(java.util.List)
java.util.Collections.sort(java.util.List, java.util.Comparator)
第一个方法要求所排序的元素类必须实现java.lang.Comparable接口。
第二个方法要求实现一个java.util.Comparator接口。
java.lang.Comparable接口和java.util.Comparator接口是Java对排序最提供最基本支持。这两个接口不但能够用于集合元素排序,还能够用于数组排序。
若是数组或集合元素是String类型,则能够利用Java API实现的Comparator<String>对象String.CASE_INSENSITIVE_ORDER为容器元素排序。mysql
方法一:实现Comparable接口排序package collsort.comparable;
package com.cvicse.sort.comparable;
public class Cat implements Comparable<Cat> {
private int age;
private String name;
public Cat(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
......
public int compareTo(Cat o) {
return this.getAge() - o.getAge();
}
......
}jquery
public class TestComparable {
public static void main(String args[]) {
test();
test2();
}
public static void test() {
......
List<Cat> listCat1 = new ArrayList<Cat>();
Cat cat1 = new Cat(34, "hehe");
Cat cat2 = new Cat(12, "haha");
Cat cat3 = new Cat(23, "leizhimin");
Cat cat4 = new Cat(13, "lavasoft");
listCat1.add(cat1);
listCat1.add(cat2);
listCat1.add(cat3);
......
System.out.println("调用Collections.sort(List<T> list)listCat2升序排序:");
Collections.sort(listCat1);
System.out.println("降序排列元素:");
Collections.sort(listCat1, Collections.reverseOrder());
System.out.println("Collections.reverse 从列表中最后一个元素开始输出:");
Collections.reverse(listCat1);
......
}
/**
* 针对数组的排序
*/
public static void test2() {
String[] strArray = new String[] { "z", "a", "C" };
System.out.println("数组转换为列表");
List<String> list = Arrays.asList(strArray);
System.out.println("顺序排序列表");
Collections.sort(list);
System.out
.println("按String实现的Comparator对象String.CASE_INSENSITIVE_ORDER排序----");
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
System.out.println("倒序排序列表");
Collections.sort(list, Collections.reverseOrder());
......
}
}
方法二:实现Comparator接口排序
public class Person {
private int age;
private String name;
......
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
......
}
实现了Comparator接口,重写了compare方法
import java.util.Comparator;
public class PersonComparator implements Comparator<Person> {angularjs
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
}
测试方法
public class TestComparator {
public static void main(String args[]) {
test1();
}
public static void test1() {
System.out.println("升序排序测试:");
List<Person> listPerson = new ArrayList<Person>();
Person person1 = new Person(34, "lavasoft");
Person person2 = new Person(12, "lavasoft");
Person person3 = new Person(23, "leizhimin");
Person person4 = new Person(13, "sdg");
listPerson.add(person1);
listPerson.add(person2);
listPerson.add(person3);
Comparator<Person> ascComparator = new PersonComparator();
System.out.println("排序后集合为:");
// 利用Collections类静态工具方法对集合List进行排序
Collections.sort(listPerson, ascComparator);
System.out.println("\n降序排序测试:");
// 从升序排序对象产生一个反转(降序)的排序对象
Comparator<Person> descComparator = Collections
.reverseOrder(ascComparator);
System.out.println("利用反转后的排序接口对象对集合List排序并输出:");
Collections.sort(listPerson, descComparator);
outCollection(listPerson);
}
}web
2.struts1或struts2的工做原理算法
struts1:spring
一、初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web、xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config、xml)的配置信息,为struts中不一样的模块初始化相应的对象。sql
二、发送请求:用户提交表单或经过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器。shell
三、form填充:struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员变量中。编程
四、派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并传给这个Action中的excute()方法。
五、处理业务:Action通常只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)完毕后返回一个ActionForward对象。服务器经过ActionForward对象进行转发工做。
六、返回响应:Action将业务处理的不一样结果返回一个目标响应对象给总控制器。
七、查找响应:总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,通常状况下为jsp页面。
八、响应用户:目标响应对象将结果传递给资源对象,将结果展示给用户。
struts2 :
一、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
二、这个请求通过一系列的过滤器(Filter)(这些过滤器中有一个叫作ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其余框架的集成颇有帮助,例如:SiteMesh、Plugin);
三、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否须要调用某个Action;
四、若是ActionMapper决定须要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
五、ActionProxy经过Configuration Manager询问框架的配置文件,找到须要调用的Action类;
六、ActionProxy建立一个ActionInvocation的实例。
七、ActionInvocation实例使用命名模式来调用,在调用Action的过程先后,涉及到相关拦截器(Intercepter)的调用。
八、一旦Action执行完毕,ActionInvocation负责根据struts、xml中的配置找到对应的返回结果。返回结果一般是(但不老是,也多是另外的一个Action链)一个须要被表示的JSP或者FreeMarker的模版。在表示的过程当中可使用Struts2框架中继承的标签。在这个过程当中须要涉及到ActionMapper。
3.struts1和struts2的核心工做原理
Action 类:
• Struts1要求Action类继承一个抽象基类。Struts1的一个广泛问题是使用抽象类编程而不是接口,而struts2的Action是接口。
• Struts 2 Action类能够实现一个Action接口,也可实现其余接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现 经常使用的接口。Action接口不是必须的,任何有execute标识的POJO对象均可以用做Struts2的Action对象。
线程模式:
• Struts1 Action是单例模式而且必须是线程安全的,由于仅有Action的一个实例来处理全部的请求。单例策略限制了Struts1 Action能做的事,而且要在开发时特别当心。Action资源必须是线程安全的或同步的。
• Struts2 Action对象为每个请求产生一个实例,所以没有线程安全问题。(实际上,servlet容器给每一个请求产生许多可丢弃的对象,而且不会致使性能和垃圾回收问题)
Servlet 依赖:
• Struts1 Action 依赖于Servlet API ,由于当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
• Struts 2 Action不依赖于容器,容许Action脱离容器单独被测试。若是须要,Struts2 Action仍然能够访问初始的request和response。可是,其余的元素减小或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
可测性:
• 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
• Struts 2 Action能够经过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
捕获输入:
• Struts1 使用ActionForm对象捕获输入。全部的ActionForm必须继承一个基类。由于其余JavaBean不能用做ActionForm,开发者常常建立多余的类捕获输入。动态Bean(DynaBeans)能够做为建立传统ActionForm的选择,可是,开发者多是在从新描述(建立)已经存 在的JavaBean(仍然会致使有冗余的javabean)。
• Struts 2直接使用Action属性做为输入属性,消除了对第二个输入对象的需求。输入属性多是有本身(子)属性的rich对象类型。Action属性可以经过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,可以用做输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。
表达式语言:
• Struts1 整合了JSTL,所以使用JSTL EL。这种EL有基本对象图遍历,可是对集合和索引属性的支持很弱。
• Struts2可使用JSTL,可是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).
绑定值到页面(view):
• Struts 1使用标准JSP机制把对象绑定到页面中来访问。
• Struts 2 使用 "ValueStack"技术,使taglib可以访问值而不须要把你的页面(view)和对象绑定起来。ValueStack策略容许经过一系列名称相同但类型不一样的属性重用页面(view)。
类型转换:
• Struts 1 ActionForm 属性一般都是String类型。Struts1使用Commons-Beanutils进行类型转换。每一个类一个转换器,对每个实例来讲是不可配置的。
• Struts2 使用OGNL进行类型转换。提供基本和经常使用对象的转换器。
校验:
• Struts 1支持在ActionForm的validate方法中手动校验,或者经过Commons Validator的扩展来校验。同一个类能够有不一样的校验内容,但不能校验子对象。
• Struts2支持经过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
Action执行的控制:
• Struts1支持每个模块有单独的Request Processors(生命周期),可是模块中的全部Action必须共享相同的生命周期。
• Struts2支持经过拦截器堆栈(Interceptor Stacks)为每个Action建立不一样的生命周期。堆栈可以根据须要和不一样的Action一块儿使用。
4.struts框架的核心内容
Action是整个Struts框架的核心内容。无论是struts1仍是struts2.
5.angularjs的工做原理
angularjs的原理核心是双向数据绑定。AngularJS的工做原理是:HTML模板将会被浏览器解析到DOM中, DOM结构成为AngularJS编译器的输入。AngularJS将会遍历DOM模板, 来生成相应的NG指令,全部的指令都负责针对view(即HTML中的ng-model)来设置数据绑定。
6.快速排序的要求
快速排序采用的思想是分治思想。
快速排序是找出一个元素(理论上能够随便找一个)做为基准(pivot),而后对数组进行分区操做,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此做为基准的元素调整到排序后的正确位置。递归快速排序,将其余n-1个元素也调整到排序后的正确位置。最后每一个元素都是在排序后的正 确位置,排序完成。因此快速排序算法的核心算法是分区操做,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
7.jsp原生标签
jsp:attribute / jsp:body /jsp:element / jsp:fallback / jsp:forward / jsp:getProperty / jsp:include / jsp:output /jsp:param / jsp:params/
jsp:plugin / jsp:setProperty / jsp:useBean
8.web.xml在项目中的做用和web.xml有哪些标签
每一个javaEE工程中都有web.xml文件,那么它的做用是什么呢?它是每一个web.xml工程都必须的吗?
一个web中能够没有web.xml文件,也就是说,web.xml文件并非web工程必须的。
web.xml文件是用来初始化配置信息:好比Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。
当你的web工程没用到这些时,你能够不用web.xml文件来配置你的Application。
每一个xml文件都有定义它书写规则的Schema文件,也就是说javaEE的定义web.xml所对应的xml Schema文件中定义了多少种标签元素,web.xml中就能够出现它所定义的标签元素,也就具有哪些特定的功能。web.xml的模式文件是由Sun 公司定义的,每一个web.xml文件的根元素为<web-app>中,必须标明这个web.xml使用的是哪一个模式文件。如:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>
web.xml的模式文件中定义的标签并非定死的,模式文件也是能够改变的,通常来讲,随着web.mxl模式文件的版本升级,里面定义的功能会愈来愈复杂,标签元素的种类确定也会愈来愈多,但有些不是很经常使用的,咱们只需记住一些经常使用的并知道怎么配置就能够了。
下面列出web.xml咱们经常使用的一些标签元素及其功能:
一、指定欢迎页面,例如:
<welcome-file-list>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index1.jsp</welcome-file>
</welcome-file-list>
PS:指定了2个欢迎页面,显示时按顺序从第一个找起,若是第一个存在,就显示第一个,后面的不起做用。若是第一个不存在,就找第二个,以此类推。
关于欢迎页面:
访问一个网站时,默认看到的第一个页面就叫欢迎页,通常状况下是由首页来充当欢迎页的。通常状况下,咱们会在web.xml中指定欢迎页。但 web.xml并非一个Web的必要文件,没有web.xml,网站仍然是能够正常工做的。只不过网站的功能复杂起来后,web.xml的确有很是大用处,因此,默认建立的动态web工程在WEB-INF文件夹下面都有一个web.xml文件。
二、命名与定制URL。咱们能够为Servlet和JSP文件命名并定制URL,其中定制URL是依赖命名的,命名必须在定制URL前。下面拿serlet来举例:
(1)、为Servlet命名:
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>org.whatisjava.TestServlet</servlet-class>
</servlet>
(2)、为Servlet定制URL、
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
三、定制初始化参数:能够定制servlet、JSP、Context的初始化参数,而后能够再servlet、JSP、Context中获取这些参数值。
下面用servlet来举例:
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>org.whatisjava.TestServlet</servlet-class>
<init-param>
<param-name>userName</param-name>
<param-value>Daniel</param-value>
</init-param>
<init-param>
<param-name>E-mail</param-name>
<param-value>125485762@qq.com</param-value>
</init-param>
</servlet>
通过上面的配置,在servlet中可以调用getServletConfig().getInitParameter("param1")得到参数名对应的值。
四、指定错误处理页面,能够经过“异常类型”或“错误码”来指定错误处理页面。
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
-----------------------------
<error-page>
<exception-type>java.lang.Exception<exception-type>
<location>/exception.jsp<location>
</error-page>
五、设置过滤器:好比设置一个编码过滤器,过滤全部资源
<filter>
<filter-name>XXXCharaSetFilter</filter-name>
<filter-class>net.test.CharSetFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXCharaSetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
六、设置监听器:
<listener>
<listener-class>net.test.XXXLisenet</listener-class>
</listener>
七、设置会话(Session)过时时间,其中时间以分钟为单位,假如设置60分钟超时:
<session-config>
<session-timeout>60</session-timeout>
</session-config>
除了这些标签元素以外,还能够往web.xml中添加不少标签元素,因为不经常使用省略。
9.hashMap和hashTable的区别
1.可见Hashtable 继承自 Dictiionary 而 HashMap继承自AbstractMap
2.HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap容许空(null)键值(key),因为非线程安全,效率上可能高于Hashtable。
3.Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不须要本身为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap)。
10.collection集合
List --> AbstractList,ArrayList,LinkedList,Stack,Vector
Map --> HashMap ,Hashtable, Properties, LinkedHashMap, IdentityHashMap, TreeMap, WeakHashMap, ConcurrentHashMap
Set --> HashSet ,TreeSet
11.Set如何遍历
package
com.shellway.javase;
import
java.util.ArrayList;
import
java.util.Collection;
import
java.util.HashSet;
import
java.util.Iterator;
import
java.util.List;
import
java.util.Map;
import
java.util.Set;
import
java.util.TreeMap;
import
org.junit.Test;
public
class
TestCollection {
public
static
void
print(Collection<?
extends
Object> c){
Iterator<?
extends
Object> it = c.iterator();
while
(it.hasNext()) {
Object object = (Object) it.next();
System.out.println(object);
}
}
@Test
public
void
demo1(){
Set<String> set =
new
HashSet<String>();
set.add(
"AAA"
);
set.add(
"BBB"
);
set.add(
"CCC"
);
print(set);
//Set的第一种遍历方式:利用Iterator
Iterator<String> it1 = set.iterator();
for
(String ss : set) {
System.out.println(ss);
}
//Set的第一种遍历方式:利用foreach
for
(String sss : set) {
System.out.println(sss);
}
List<String> list =
new
ArrayList<String>();
list.add(
"DDDDD"
);
list.add(
"EEEEE"
);
list.add(
"FFFFF"
);
print(list);
//List的第一种遍历方式:由于list有顺序,利用size()和get()方法获取
for
(
int
i =
0
; i < list.size(); i++) {
System.out.println(list.get(i));
}
//List的第二种遍历方式:利用Iterator
Iterator<String> it = list.iterator();
while
(it.hasNext()) {
System.out.println(it.next());
}
//List的第三种遍历方式:利用foreach
for
(String s2 : list) {
System.out.println(s2);
}
Map<String,String> map =
new
TreeMap<String, String>();
map.put(
"Jerry"
,
"10000"
);
map.put(
"shellway"
,
"20000"
);
map.put(
"Kizi"
,
"30000"
);
print(map.entrySet());
//Map的第一种遍历方式:先得到key,再得到值value
Set<String> sett = map.keySet();
for
(String s : sett) {
System.out.println(s+
":"
+map.get(s));
}
//Map的第二种遍历方式:得到键值对
for
(Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey()+
" : "
+entry.getValue());
}
}
}
12.String 和StringBuffer的区别
(1)String类对象为不可变对象,一旦你修改了String对象的值,隐性从新建立了一个新的对象,释放原String对象,StringBuffer类对象为可修改对象,能够经过append()方法来修改值
(2)String类对象的性能远不如StringBuffer类。
13.线程的启动方法
启动线程确定要用start()方法。当用start()开始一个线程后,线程就进入就绪状态,使线程所表明的虚拟处理机处于可运行状态,这意味着它能够由JVM调度并执行。这并不意味着线程就会当即运行。当cpu分配给它时间时,才开始执行run()方法(若是有的话)。START()是方法,它调用RUN()方法.而RUN()方法是你必须重写的. run()方法中包含的是线程的主体。
继承Thread类的启动方式:
public class ThreadStartTest {
public static void main(String[] args) {
ThreadTest tt = new ThreadTest();// 建立一个线程实例
tt.start(); // 启动线程
}
}
实现Runnable接口的启动方式:
public class RunnableStartTest {
public static void main(String[] args) {
Thread t = new Thread(new RunnableTest()); // 建立一个线程实例
t.start(); // 启动线程
}
}
实际上这两种启动线程的方式原理是同样的。首先都是调用本地方法启动一个线程,其次是在这个线程里执行目标对象的run()方法。那么这个目标对象是什么呢?为了弄明白这个问题,咱们来看看Thread类的run()方法的实现:
public void run() {
if (target != null) {
target.run();
}
}
当咱们采用实现Runnable接口的方式来实现线程的状况下,在调用new Thread(Runnable target)构造器时,将实现Runnable接口的类的实例设置成了线程要执行的主体所属的目标对象target,当线程启动时,这个实例的 run()方法就被执行了。当咱们采用继承Thread的方式实现线程时,线程的这个run()方法被重写了,因此当线程启动时,执行的是这个对象自身的 run()方法。总结起来就一句话,若是咱们采用的是继承Thread类的方式,那么这个target就是线程对象自身,若是咱们采用的是实现Runnable接口的方式,那么这个target就是实现了Runnable接口的类的实例。
而若是直接用Run方法,这只是调用一个方法而已,程序中依然只有主线程--这一个线程,其程序执行路径仍是只有一条,这样就没有达到写线程的目的。
14.讲讲mybatis
SqlSessionFactory是每一个MyBatis应用的核心
SqlSessionFactoryBuilder 是用过即丢,其生命周期只存在于方法体内
SqlSessionFactory 单例,存在于整合应用运行时
15.springmvc和mybatis整合,须要配置些什么
<!-- 配置DataSource数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://10.0.0.131:3306/ash2"/>
<property name="username" value="dev"/>
<property name="password" value="dev"/>
</bean>
<!-- 配置SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis.xml"/>
<!-- mapper和resultmap配置路径 -->
<property name="mapperLocations">
<list>
<!-- 表示在com.hoo.resultmap包或如下全部目录中,以-resultmap.xml结尾全部文件 -->
<value>classpath:com/hoo/resultmap/**/*-resultmap.xml</value>
<value>classpath:com/hoo/entity/*-resultmap.xml</value>
<value>classpath:com/hoo/mapper/**/*-mapper.xml</value>
</list>
</property>
</bean>
上面的配置最早配置的是DataSource,这里采用的是jdbc的DataSource;
而后是SqlSessionFactoryBean,这个配置比较关键。SqlSessionFactoryBean须要注入DataSource数据源,其次还要设置configLocation也就是mybatis的xml配置文件路径,完成一些关于mybatis的配置,如settings、mappers、plugin等;
16.jquery的选择器有哪些
不少种,大概概括为9种。
(1)基本
#id
element
.class
*
selector1,selector2,selectorN
(2)层次选择器:
ancestor descendant
parent > child
prev + next
prev ~ siblings
(3)基本过滤器选择器
:first
:last
:not
:even
:odd
:eq
:gt
:lt
:header
:animated
(4)内容过滤器选择器
:contains
:empty
:has
:parent
(5)可见性过滤器选择器
:hidden
:visible
(6)属性过滤器选择器
[attribute]
[attribute=value]
[attribute!=value]
[attribute^=value]
[attribute$=value]
[attribute*=value]
[attrSel1][attrSel2][attrSelN]
(7)子元素过滤器选择器
:nth-child
:first-child
:last-child
:only-child
(8)表单选择器
:input
:text
:password
:radio
:checkbox
:submit
:image
:reset
:button
:file
:hidden
(9)表单过滤器选择器
:enabled
:disabled
:checked
:selected
17.java传值与传引用 一、对象是按引用传递的 二、Java 应用程序有且仅有的一种参数传递机制,即按值传递 三、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本 四、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本