Java面试题大全(javaSe,HTML,CSS,js,Spring框架等)梦豆学院

1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?7

2、Java有没有goto7

3、说说&和&&的区别。7

4、在JAVA中如何跳出当前的多重嵌套循环?7

5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上8

6、shorts1=1;s1=s1+1;有什么错shorts1=1;s1+=1;有什么错8

7、char型变量中能不能存贮一个中文汉字为什么8

8、用最有效率的方法算出2乘以8等於几8

9、请设计一个一百亿的计算器8

10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?8

11、"=="和equals方法究竟有什么区别?9

12、静态变量和实例变量的区别?9

13、是否可以从一个static方法内部发出对非static方法的调用?9

14、Integer与int的区别9

15、Math.round(11.5)等于多少Math.round(-11.5)等于多少10

16、下面的代码有什么不妥之处10

17、请说出作用域public,private,protected,以及不写时的区别10

18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型10

19、构造器Constructor是否可被override10

20、接口是否可继承接口抽象类是否可实现(implements)接口抽象类是否可继承具体类(concreteclass)抽象类中是否可以有静态的main方法?抽象类是否可有以内部类?接口是否可以有内部类?10

21、写clone()方法时,通常都有一行代码(不是必须有),是什么?11

22、面向对象的特征有哪些方面11

23、java中实现多态的机制是什么?11

24、abstractclass和interface有什么区别11

25、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized,是否可同时是final12

26、什么是内部类?StaticNestedClass和InnerClass的不同。12

27、内部类可以引用它的包含类的成员吗?有没有什么限制?12

28、AnonymousInnerClass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)12

29、super.getClass()方法和this.getClass()方法返回对象是否相同?12

30、String是最基本的数据类型吗12

31、Strings="Hello";s=s+"world!";这两行代码执行后,原始的String对象中的内容到底变了没有?12

32、是否可以继承String类12

33、Strings=newString("xyz");创建了几个StringObject二者之间有什么区别?13

34、String和StringBuffer的区别13

34.1、StringBuffer和StringBuilder的区别13

35、如何把一段逗号分割的字符串转换成一个数组13

36、数组有没有length()这个方法String有没有length()这个方法?JS的数组有没有length()方法?JS的字符串有没有length()方法?14

37、下面这条语句一共创建了多少个对象:Strings="a"+"b"+"c"+"d";14

38、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后14

39、下面的程序代码输出的结果是多少?15

40、final,finally,finalize的区别。16

41、运行时异常(Runtime)与检查异常(Checked)有何异同?16

42、error和exception有什么区别16

43、Java中的异常处理机制的简单原理和应用。17

44、请写出你最常见到的5个RuntimeException。17

45、Java语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?17

46、Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法stop()和suspend()方法为何不推荐使用?18

47、sleep()和wait()有什么区别19

48、同步和异步有何异同,在什么情况下分别使用他们?举例说明。19

49.下面两个方法同步吗?(自己发明)19

50、多线程有几种实现方法同步有几种实现方法20

51、启动一个线程是用run()还是start()20

52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法20

53、线程的基本概念、线程的基本状态以及状态之间的关系20

54、简述synchronized和java.util.concurrent.locks.Lock的异同?20

55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。21

56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。22

57、介绍Collection框架的结构23

58、Collection框架中实现比较要实现什么接口24

59、ArrayList和Vector的区别24

60、HashMap和Hashtable的区别24

61、List和Map区别24

62、List,Set,Map是否继承自Collection接口24

63、List、Map、Set三个接口,存取元素时,各有什么特点?24

64、说出ArrayList,Vector,LinkedList的存储性能和特性25

65、去掉一个Vector集合中重复的元素25

66、Collection和Collections的区别。25

67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢是用==还是equals()它们有何区别25

68、你所知道的集合类都有哪些?主要方法?25

69、两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对26

70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!26

71、说出一些常用的类,包,接口,请各举5个26

72、Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?26

73、字节流与字符流的区别26

74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。26

75、描述一下JVM加载class文件的原理机制27

76、heap和stack有什么区别。27

77、GC是什么为什么要有GC27

78、垃圾回收的优点和原理。并考虑2种回收机制。27

79、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?27

80、什么时候用assert。28

81、java中会存在内存泄漏吗,请简单描述。28

82、能不能自己写个类,也叫java.lang.String?28

83.Java代码查错29

84、SSH集成方式33

二.算法与编程33

1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。33

2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。34

3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。35

4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。35

5、说明生活中遇到的二叉树,用java实现二叉树36

6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序:37

7、写一个Singleton出来。39

8、递归算法题140

9、递归算法题241

10、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。41

11、有数组a[n],用java代码将数组元素顺序颠倒42

12、金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。43

13、不使用递归遍历二叉树43

14、以最快的效率找出一个数组中第二大的数45

三.html&JavaScript&ajax部分46

1.判断第二个日期比第一个日期大46

2.用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。47

3、HTML的form提交之前如何验证数值文本框的内容全部为数字否则的话提示用户并终止提交47

4、请写出用于校验HTML文本框中输入的内容全部为数字的javascript代码48

5、说说你用过那些ajax技术和框架,说说它们的区别48

四.Javaweb部分48

1、Tomcat的优化经验48

2、HTTP请求的GET与POST方式的区别48

3、解释一下什么是servlet;49

4、说一说Servlet的生命周期49

5、Servlet的基本架构49

6、ServletAPI中forward()与redirect()的区别?49

7、什么情况下调用doGet()和doPost()?49

8、Request对象的主要方法:49

9、request.getAttribute()和request.getParameter()有何区别50

10.jsp有哪些内置对象作用分别是什么分别有什么方法?50

12.jsp生命周期51

12.jsp有哪些动作作用分别是什么51

13、JSP的常用指令51

14.JSP中动态INCLUDE与静态INCLUDE的区别?51

15、两种跳转方式分别是什么有什么区别51

16、页面间对象传递的方法51

17、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?51

18、MVC的各个部分都有那些技术来实现如何实现52

19、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso-8859-1等,如何输出一个某种编码的字符串?52

20、现在输入n个数字,以逗号分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset52

五.数据库部分52

1、根据部门号从高到低,工资从低到高列出每个员工的信息。52

2、列出各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门号排序52

3、存储过程、函数与触发器必须讲,经常被面试到53

4、数据库三范式是什么54

5、说出一些数据库优化方面的经验55

6、union和unionall有什么不同56

6.1、表test中有两个字段a、b,都为数值型,如果a大于b,取a列的值,如果a不大于b,取b列的值,写出你认为最有效率的SQL,兼容所有数据库。56

7、分页语句56

8.用一条SQL语句查询出每门课都大于80分的学生姓名56

9.所有部门之间的比赛组合56

10.每个月份的发生额都比101科目多的科目57

11.统计每年每月的信息58

13.删除除了id号不同,其他都相同的学生冗余信息60

14.航空网的几个航班查询题:60

15.查出比经理薪水还高的员工信息:61

16、求出小于45岁的各个老师所带的大于12岁的学生人数61

17.求出发帖最多的人:61

18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决61

19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户。(跟第42条SQL语句同)62

20.xxx公司的sql面试62

21、注册Jdbc驱动程序的三种方式63

22、用JDBC如何调用存储过程64

23、JDBC中的PreparedStatement相比Statement的好处64

24、Class.forName的作用为什么要用64

25、大数据量下的分页解决方法。64

26、用JDBC查询学生成绩单,把主要代码写出来(考试概率极大).65

27、这段代码有什么不足之处65

28、说出数据连接池的工作机制是什么65

29、为什么要用ORM和JDBC有何不一样66

30.数据库大数据处理66

31.存储过程和函数具体的区别:66

六.XML部分66

1、xml有哪些解析技术区别是什么66

2、你在项目中用到了xml技术的哪些方面如何实现的67

3、用jdom解析xml文件时如何解决中文问题如何解析67

4、编程用JAVA解析XML的方式.68

5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?69

七.流行的框架与新技术70

1、谈谈你对Struts的理解。70

2、谈谈你对Hibernate的理解。70

3、AOP的作用。70

4、你对Spring的理解。71

5、谈谈Struts中的ActionServlet。71

6、Struts优缺点71

7、STRUTS的应用(如STRUTS架构)72

8、说说struts1与struts2的区别。72

9、hibernate中的update()和saveOrUpdate()的区别,session的load()和get()的区别。72

10、简述Hibernate和JDBC的优缺点如何书写一个onetomany配置文件.72

11、iBatis与Hibernate有什么不同72

12、写Hibernate的一对多和多对一双向关联的orm配置hibernate的inverse属性的作用73

13、在DAO中如何体现DAO设计模式73

14、Spring+Hibernate中委托方案怎么配置73

15.hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决;73

16.介绍一下Hibernate的二级缓存74

17、Spring的依赖注入是什么意思给一个Bean的message属性,字符串类型,注入值为"Hello"的XML配置文件该怎么写74

18、JDO是什么74

19、什么是spring的AOP75

20、Struts的工作流程!75

21、Spring与EJB的区别75

八.软件工程与设计模式75

1、UML方面75

2、j2ee常用的设计模式?说明工厂模式。75

3、开发中都用到了那些设计模式用在什么场合75

九.j2ee部分76

1、BS与CS的联系与区别。76

2、应用服务器与WEBSERVER的区别?77

3、应用服务器有那些?77

4、J2EE是什么?77

5、J2EE是技术还是平台还是框架?什么是J2EE77

6、请对以下在J2EE中常用的名词进行解释(或简单描述)77

7、如何给weblogic指定大小的内存78

8、如何设定的weblogic的热启动模式(开发模式)与产品发布模式78

9、如何启动时不需输入用户名与密码78

12、在weblogic中发布ejb需涉及到哪些配置文件78

13、如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置78

14、如何查看在weblogic中已经发布的EJB78

可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。

一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同

java中的保留字,现在没有在java中使用。

&和&&都可以用作逻辑与的运算符,&&为短路与,&不是短路与。

另外&可以做为整数的位运算符

例1:对于if(str!=null&&!str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,

例2:If(x==33&++y>0)y会增长,if(x==33&&++y>0)不会增长

备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。

1.Break+标签

2.直接使用Break

3.使用方法的return

在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。例如,

ok:for(inti=0;i<10;i++){

for(intj=0;j<10;j++){

System.out.println("i="+i+",j="+j);

if(j==5)

breakok;

}

另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。

intarr[][]={{1,2,3},{4,5,6,7},{9}};

booleanfound=false;

for(inti=0;i

for(intj=0;j

if(arr[i][j]==5){

found=true;

break;

第三种,使用方法的return

privatestaticinttest(){

intcount=0;

for(inti=0;i<10;i++){

count++;

if(j==5){

returncount;

return0;

作用在byte,short,char,int,enum

封装类对象和枚举,其它基本数据类型及引用数据类型都不能做为case的条件

对于shorts1=1;s1=s1+1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。

对于shorts1=1;s1+=1;由于+=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字

补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

2<<3

因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2<<3。

如果只是大整数运算,使用BigInteger就可以

如果有浮点数据参与去处,需要使用BigDecimal进行运算

Java中基本类型的浮点数运算是不精确的,需要使用BigDecimal运算,尤其是金融、会计方向的软件

引用变量不能重新赋值,但是引用指向的对象的内容可以变化

例1:finalStringBuffera=newStringBuffer("immutable");

a=newStringBuffer("");

有编译错

例2:

finalStringBuffera=newStringBuffer("immutable");

a.append(“123”);

正确

他们的区别主要存在在引用数据类型上

==为比较两侧的对象是否同一对象,是用内存地址来比较的

equals是方法,默认是用内存地址比较,重写后,主要是用来比较两侧的对象的值是否相同,和equals方法中的实现有关

==可以两侧都为null,但equals左侧的引用指向的对象不能空,不然有NullPointerException

除非需要比较两个引用指向的对象是同一对象,一般都使用equals方法进行比较。尤其是String之类的值对象,另外,常量尽量放在比较的左侧

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。

总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

不可以。因为非static方法(实例方法)是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。

int是java提供的8种原始数据类型之一,意思整型,占用4字节。

Integer是java为int提供的封装类,是引用数据类型。

int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。

例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer

在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。

在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。

Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,Math.ceil(11.6)的结果为11,Math.ceil(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。

1.if(username.equals(“zxx”){}

username可能为null,会报空指针错误;改为"zxx".equals(username)

2.intx=1;

returnx==1true:false;这个改成returnx==1;就可以!

这四个作用域的可见范围如下表所示。

说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly/default。

作用域

当前类

同package

子孙类

其他package

public

protected

×

friendly/default

private

备注:只要记住了有4种访问权限,4个访问范围,然后将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。

Overload是重载的意思,Override是覆盖的意思,也就是重写。

Overload和Override有共同之处,两个方法的方法名都必须相同,如果不同,既不构成Overload,也不构成Override。

a)参数列表完全相同:个数相同、类型相同、顺序相同

b)子类的返回值不能比父类的返回值范围大

c)子类方法抛出的异常不能比父类方法抛出的异常范围大

d)修饰符只能为public、protected、friendly,不能为private

e)父子类方法不能使用static修饰

构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。

接口可以继承接口;抽象类可以实现(implements)接口;抽象类可以继承具体类;抽象类中可以有静态的main方法;抽象类可有以内部类;接口可以有内部类,但必须是static内部类,但不一定是final的。

只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。

clone有缺省行为,super.clone();因为首先要把类中的成员复制到位,然后才是复制自己的成员。

1.封装,隐藏内部实现,只暴露公共行为

2.继承,提高代码的重用性

3.多态,体现现实生活中相似对象的差异性

4.抽象,抽取现实世界中相似对象的共同点

通过继承父类或实现接口。

继承指子类继承父类的所有属性、方法、内部类。对于属性而言,如果子类的属性名和父类的属性名相同,则子类会把父类的属性隐藏。属性根据引用来调用,方法根据对象来调用;Java中只有单继承,一个子类只能直接继承一个父类。

实现指某类可以实现接口中的部分或所有方法,并能继承接口中的所有的属性和内部类。接口中的属性都为publicstaticfinal类型,方法都为public类型,内部类都为publicstatic类型。接口可以继承多个接口,实现类可以实现多个接口。

含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstractclass,abstractclass类中的方法不必是抽象的。abstractclass类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为publicabstract类型,接口中的成员变量类型默认为publicstaticfinal。

下面比较一下两者的语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4.抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为publicabstract类型。

5.抽象类中可以包含静态方法,接口中不能包含静态方法

6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是publicstaticfinal类型,并且默认即为publicstaticfinal类型。

7.一个类可以实现多个接口,但只能继承一个抽象类。

下面接着再说说两者在应用上的区别:

接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约;

而抽象类在代码实现方面发挥作用,可以实现代码的重用。

abstract的method不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系!

native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用。

synchronized和abstract合用的问题不能共用,abstract方法只能存在于抽象类或接口中,它不能直接产生对象,而默认synchronized方法对当前对象加锁,没有对象是不能加锁。

另外synchronized不能被继承,子类继承时,需要另加修改符。

final方法和abstract不能共用,因为final是不能被子类重写的,而抽象方法必须被某级子类重写。

内部类就是在一个类的内部定义的类。内部可以定义在除参数位置上的任意位置。

1.静态内部类需要使用static修饰,而普通内部类不能使用static修饰

2.静态内部类只能定义在和属性同级,普通内部类可以定义在除参数位置以外的任意位置

3.静态内部类必需有名称,而普通内部类可以是匿名的

4.静态内部类没有this引用,只此只能访问外部类的静态成员,而普通内部类可以访问外部类的全部成员

5.静态内部类访问外部类的同名函数时,使用“外部类名.方法名”即可,而普通内部类需要使用“外部类名.this.外部方法”

6.静态内部类可以定义静态方法,而普通内部类不能定义静态方法,但能定义简单数据类型的静态属性,不能定义引用类型的静态属性。

1.如果内部类为静态内部类,只能调用外部类的静态成员;如果有重名成员,需要用“外部类名.成员名”访问;不能调用外部类的对象成员。

2.如果内部类为非静态内部类,则可以调用外部类的所有成员;如果有重名成员,需要使用“外部类名.this.成员名”

可以继承其他类或实现其他接口。不仅是可以,而是必须!

返回的Class对象是同一对象,都是子类的对象。final方法,不允许重写

基本数据类型包括byte、int、char、long、float、double、boolean和short。

String是引用数据类型。

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer/StringBuilder类

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。

s=s+"world!";相当于:(JDK1.5以上版本)

s=newStringBuilder(String.valueOf(s)).append("world!").toString();

String类是final类故不可以继承。

两个对象。一个是"xyz",为缓冲区对象。另一个是new出来的String对象。

这两个对象的值相同,但不是同一个对象。

补充,新建对象有几种方式?

1.使用new关键字

2.使用反射,调用newInstance

3.使用clone方法

4.使用序列化与反序列化

5.动态代理(Proxy类和CGLIB)

这两个类都实现了CharSequence接口。

1.类型不同,因为不是一个类,也没有继承关系,做参数时不能共用

2.String对象是不可变对象,不能修改值。而StringBuffer是可变对象,能修改值。

3.拼接字符串时,String会产生新对象,而StringBuffer只是增加新字符,不产生新对象,因此效率高。

4.String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。

相同之处,这两类都是可变长的字符串存储类,都实现了CharSequence接口

2.StringBuffer为线程安全类,StringBuilder为线程非安全类

3.StringBuffer性能低,StringBuilder性能高,如果在局部优先使用StringBuilder

4.JDK在1.5之前,字符串相加使用StringBuffer对象,在1.5之后使用StringBuilder对象

StringTokenizertokener=newStringTokenizer(s,",");

String[]result=newString[tokener.countTokens()];

Integeri=0;

while(tokener.hasMoreTokens()){

result[i++]=tokener.nextToken();

intindex=-1;

intoldIndex=0;

Listss=newArrayList();

while((index=s.indexOf(',',index+1))!=-1){

ss.add(s.substring(oldIndex,index));

oldIndex=index+1;

if(s.charAt(s.length()-1)==','){

ss.add("");

String[]array=ss.toArray(newString[ss.size()]);

System.out.println(Arrays.toString(array));

数组没有length()这个方法,有length的属性。String有有length()这个方法。JS中只有length属性,没有length方法。

答:产生了一个对象,即"abcd"

对于如下代码:

Strings1="a";

Strings2=s1+"b";

Strings3="a"+"b";

System.out.println(s2=="ab");//false

System.out.println(s3=="ab");//true

Strings="a"+"b"+"c"+"d";

System.out.println(s=="abcd");//trues被优化为”abcd”

也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果:

publicclassTest{

publicstaticvoidmain(String[]args){

System.out.println(test());

staticinttest(){

intx=1;

try{

returnx;

finally{

++x;

---------执行结果---------

1

运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

publicclassSmallT{

publicstaticvoidmain(Stringargs[]){

SmallTt=newSmallT();

intb=t.get();

System.out.println(b);

publicintget(){

return1;

}finally{

return2;

返回的结果是2。

我可以通过下面一个例子程序来帮助我解释这个答案,从下面例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

在讲解答案时可以用下面的程序来帮助分析:

System.out.println(newTest().test());

inttest(){

returnfunc1();

returnfunc2();

intfunc1(){

System.out.println("func1");

intfunc2(){

System.out.println("func2");

-----------执行结果-----------------

func1

func2

2

结论:finally中的代码比return和break语句后执行

内部类要访问局部变量,局部变量必须定义成final类型

finalint[]number={20};

newThread(){

@Override

publicvoidrun(){

for(intk=0;k<20;k++){

number[0]++;

}.start();

Thread.sleep(10);

System.out.println(number[0]);

finally是异常处理语句结构的一部分,表示总是执行,用来释放资源。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用

运行时异常为编程时的异常,应该在生产环境正常运行状态下不会发生的异常

检查异常通常为一种设计模式,表示某处执行时可能因为条件不足而出现异常,程序必须对此进行处理,JVM会提示编程人员捕获或重新抛出异常

error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出,不可能指望程序能处理这样的情况。exception表示一种设计或实现问题,也就是说,它表示如果程序运行正常,正常情况下从不会发生的情况。

异常是指java程序运行时(非编译)所发生的非正常情况或错误。

Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象中,该对象中包含有异常的信息。

Java可以自定义异常类,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception。

提示答题者:就按照三个级别去思考:虚拟机必须宕机的错误,程序可以死掉也可以不死掉的错误,程序不应该死掉的错误

NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、IllegelArgumentException、SecurityException。

throw程序出错时,手工抛出异常,最好能把异常进行堆栈式抛出

try尝试执行,里面的语句可能出现异常,如出现异常需要处理

catch处理try中出现的异常

finally在try后执行清理操作,用于释放资源

java5以前,有如下两种:

第一种:

newThread(){}.start();这表示调用Thread子类对象的run方法,newThread(){}表示一个Thread的匿名子类的实例对象,子类加上run方法后的代码如下:

第二种:

newThread(newRunnable(){}).start();这表示调用Thread对象接受的Runnable对象的run方法,newRunnable(){}表示一个Runnable的匿名子类的实例对象,runnable的子类加上run方法后的代码如下:

newThread(newRunnable(){

}).start();

从Java5开始,还有如下一些线程池创建多线程的方式:

ExecutorServicepool=Executors.newFixedThreadPool(3);

pool.execute(newRunable(){

});

Executors.newCachedThreadPool().execute(newRunable(){

Executors.newSingleThreadExecutor().execute(newRunable(){

有两种实现方法,分别使用newThread()和newThread(runnable)形式,第一种直接调用thread的run方法,所以,我们往往使用Thread子类,即newSubThread()。第二种调用runnable的run方法。

1.sleep是在Thread类定义的,wait是在Object类定义的

2.sleep有两个重载方法,wait有三个重载方法

3.sleep能自动唤醒,wait有参数的方法能自动唤醒,但无参数的重载方法不能自动唤醒,需要使用notify/notifyAll进行手动唤醒

4.sleep挂起时,不释放锁资源,wait挂起时,会释放锁资源

5.sleep调用时,不需要放在synchronized内,wait需要放在synchronized内

6.sleep一般不会产生死锁,但是wait可能会产生死锁

同步是指所有操作串行化执行,顺序不能改变,前一操作未完成,后个操作不执行。

异步是指所有操作可以并行执行,顺序无关。

例如寄信

同步:如果没有寄完,不能吃饭,邮递员10天后送到,发送人被饿死

异步:寄出后可以立即吃饭,邮递员送完后,通知发送人送信结果。

如果强调执行顺序的话,用同步。如果顺序无关,则可以用异步。

异步执行效率比同步高。该用同步时,如果用了异步,结果可能会出现不一致。

classTest{

synchronizedstaticvoidsayHello3(){

synchronizedvoidgetX(){

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口

同步的实现方面有五种,分别是synchronized、wait与notify、sleep、suspend、join

synchronized:一直持有锁,直至执行结束

wait():使一个线程处于等待状态,并且释放所持有的对象的lock,需捕获异常。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,需捕获异常,不释放锁。

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。

如果其它方法中使用当前对象作为锁对象,则不能;

如果其它方法中没有使用当前对象作为锁对象,则能。

在多任务操作系统中,为了提高CPU的利用率,可以使用多进程编程。但对进程通信比较困难,进程间数据不能共享,因此可以使用多线程编程。一个进程至少包含一个主入口线程。

主要相同点:Lock能完成synchronized所实现的所有功能

主要不同点:

举例说明(对下面的题用lock进行了改写):

packagecom.huawei.interview;

importjava.util.concurrent.locks.Lock;

importjava.util.concurrent.locks.ReentrantLock;

publicclassThreadTest{

privateintj;

privateLocklock=newReentrantLock();

ThreadTesttt=newThreadTest();

for(inti=0;i<2;i++){

newThread(tt.newAdder()).start();

newThread(tt.newSubtractor()).start();

privateclassSubtractorimplementsRunnable{

while(true){

lock.lock();

System.out.println("j--="+j--);

lock.unlock();

privateclassAdderimplementsRunnable{

System.out.println("j++="+j++);

以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。

publicclassThreadTest1{

ThreadTest1tt=newThreadTest1();

Incinc=tt.newInc();

Decdec=tt.newDec();

Threadt=newThread(inc);

t.start();

t=newThread(dec);

privatesynchronizedvoidinc(){

j++;

System.out.println(Thread.currentThread().getName()+"-inc:"+j);

privatesynchronizedvoiddec(){

j--;

System.out.println(Thread.currentThread().getName()+"-dec:"+j);

classIncimplementsRunnable{

for(inti=0;i<100;i++){

inc();

classDecimplementsRunnable{

dec();

publicstaticvoidmain(String[]args)throwsException{

for(inti=0;i<50;i++){

MainThreadmain=newMainThread();

main.start();

main.join();

classMainThreadextendsThread{

SubThreadsub=newSubThread();

sub.start();

sub.join();

}catch(InterruptedExceptione){

//LOG

System.out.println("main:"+i);

classSubThreadextendsThread{

System.out.println("sub:"+i);

Iterable(顺序表)

àCollection(他下面可以装东西)

àList(是collection下面的接口)可以重

àArrayList(局部变量用这个合适)

àLinkedList(是一个链表,按顺序连接)

àVector(它是一个类,叫做向量,也算一种list,唯一区别是跟线程同步)

àStack(栈())

àSet(是collection下面的接口)不可以重(无序的,

àHashSet

àSortedSet(它是一个接口)

àTreeSet(是用treeMap实现的)(value不重要Key重要)

Map(无序的,放进去取出来不同)(在数学上是集合,是一个元素元素不能又重的)

àSortedMap(

àTreeMap

àHashtable(跟它的区别)(它是旧实现因为跟线程同步,另外它用的旧接口便利用invtion便利)

àProperties

àHashMap

àLinkedHashMap

Collections,不属于集合,是集合类的工具类

Arrays,不属于集合类,是数据对象的工具类

Comparable/Comparator

1.线程同步,Vector线程安全,ArrayList线程不安全

2.效率问题,Vector效率低,ArrayList效率高

3.增长数量,Vector以1.5倍增长,ArrayList以2倍增长

1.线程同步,Hashtable线程安全,HashMap线程不安全

2.效率问题,Hashtable效率低,HashMap效率高

3.HashMap可以使用null作为key,Hashtable不可以使用null为key

4.HashMap使用的是新实现,继承AbstractMap,而Hashtable是继承Dictionary类,实现比较老

5.Hash算法不同,HashMap的hash算法比Hashtable的hash算法效率高

6.HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。因为contains方法容易让人引起误解。

7.取值不同,HashMap用的是Iterator接口,而Hashtable中还有使用Enumeration接口

一个是存储单列数据的集合,另一个是存储键和值的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。

List、Set是,Map不是

List使用get(index)取值,也可以使用Iterator、toArray取值

Set只能通过Iterator、toArray取值

Map取值使用get(key)取值,也可以使用keySet取键值集合,也可使用values取值集合,entrySet取全部键值对映射。

1.ArrayList和Vector使用数组存储元素;LinkedList使用链表存储元素

2.ArrayList和Vector插入删除数据时,需要搬运数据,效率较差;LinkedList使用链表,不需要搬运数据,效率高

3.ArrayList和Vectory查询时,按数组下标查询,不需要遍历,效率高;LinkedList需要遍历,查询效率底

4.ArrayList和Vector的区别见59条

1.自行遍历,用另外一个Vector来判断是否有重复

2.用Set(TreeSet或HashSet)来去重

3.用Apache的CollectionUtil工具类去重

VectornewVector=newVector();

for(inti=0;i

Objectobj=vector.get(i);

if(!newVector.contains(obj))

newVector.add(obj);

还有一种简单的方式,HashSetset=newHashSet(vector);

Collection是集合类的上级接口,继承与他的接口主要有Set和List.

Collections是针对集合类的一个工具类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

Set里的元素是不能重复的,元素重复与否视具体情况而定:

1.HashSet使用equals比较

2.TreeSet使用compareTo进行比较

最常用的集合类接口是List和Map。

List的具体实现包括ArrayList、Vector、LinkedList,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List适用于按数值索引访问元素的情形。

Set的具体实现包括HashSet和TreeSet,它们也是可变大小集合,但不适合用索引取值。

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

ArrayList/Vector、LinkedList

HashSet/TreeSet

Properties/HashTable/TreeMap/HashMap

List的主要方法有:

add、get、remove、set、iterator、contains、addAll、removeAll、indexOf、toArray、clear、isEmpty

Set的主要方法有:

add、remove、iterator、contains、addAll、removeAll、toArray、clear、isEmpty

Map的主要方法有:

put、get、keySet、values、entrySet、clear、remove、isEmpty

1.equals等,hashCode同,因此重写equals方法必须重写hashCode

2.hashCode等,equals不一定同,但hashCode最好散列化

3.任何对象equalsnull都得false

4.没有继承关系的两个类,equals都得false

5.重写equals方法的类最好是值类,即不可变

6.如果A对象equalsB对象,B对象equalsC对象,则A对象equalsC对象

1.如果子类重新实现了Comparable,且比较时全部使用父类的引用和属性,则不会出错

2.如果子类重新实现了Comparable,且比较时使用了子类的引用和属性,出异常

3.子类没有重新实现Comparable,则不会了出错。

用哪个对象比较,则调用哪个对象的comparaTo方法

要让人家感觉你对JavaEE开发很熟,所以,不能仅仅只列corejava中的那些东西,要多列你在做ssh项目中涉及的那些东西。就写你最近写的那些程序中涉及的那些类。

常用的类:BufferedReader,BufferedWriter,FileReader,FileWirter,String,Integer,

java.util.Date,System,Class,List,HashMap

常用的包:java.lang,java.io,java.util,java.sql,javax.servlet,org.apache.strtuts.action,org.hibernate,org.springframework

常用的接口:List,Map,Document,NodeList,Servlet,HttpServletRequest,HttpServletResponse,HttpSession,Action(Struts),Transaction(Hibernate),Session(Hibernate),ApplicationContext(Spring),FactoryBean(Spring)

字节流,字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。

FileInputStream、FileReader、ByteArrayInputStream、CharArrayReader、BufferedInputStream、BufferedReader、ZipInputStream、PrintStream、StringReader、ObjectInputStream、RandomAccessFile(不属于流,但像流)

字节流是按字节读取或写入设备,但字符流是以字符为单位读取或写入设备。

如果是二进制文件,需要用字节流读取。一般来说,字符流只处理文本文件。在设备中,大多数情况是以字节形式存储数据的,因此字符流通过需要传入字节流当参数。

序列化是把内存Java对象保存到存储介质中,反序列化就是把存储介质中的数据转化为Java对象。Java通过ObjectInputStream和ObjectOutputStream实现序列化和反序列化。需要进行序列化的对象的类必须实现Serializable接口,通常情况下需要满足以下条件:

1.强烈建议手动生成serialVersionUID常量

2.如果需要加解密的话,需要实现两个方法readObject和writeObject方法

3.如果使用Hibernate二级缓存或其它缓存服务器的话,对象必须是可序列化的

4.如果需要远程调用对象或传值的话,则对像需要序列化

5.序列化类的可序列化成员必须也是可序列化的,不需要序列化的属性用transient修饰

1.查找当前ClassLoader中是否有此class的类对象,有则返回

2.若没有的话,向上递归所有的父ClassLoader中有无此class类对象,有则返回

3.若还没有,查找BootstrapClassLoader中有无此class类对象,有则返回

4.若还没有的话,使用findClass或resolveClass加载类对象

a.读取class二进制文件

b.根据字节数组生成Class对象

c.缓存到当前ClassLoader中

JVM加载class对象是懒加载,按需加载

Java的内存分为两类,一类是栈内存,一类是堆内存。

栈中存储的是当前线程的方法调用、基本数据类型和对象的引用,栈是有序的。

堆中存储的是对象,堆是无序的。

方法中的局部变量使用final修饰后,放在堆中,而不是栈中。

GC是垃圾回收的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。线程对象在没有终止前,即使没有任何引用,也不会被垃圾回收。

只能建议JVM回收内存,不能强制,可以使用System.gc()建议执行。

GC有三种方式,串行回收、并行回收、混合回收。

对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,assert将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

会,原因:

如果对象被集合类引用时,如果只是添加,而不删除,会引起内存泄漏,严重时会发出内存溢出。

Java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露

内存泄露的另外一种情况:当一个对象被存储进HashSet或HashMap中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,造成内存泄露。

可以,如果非要实现java.lang.String,需要自已写ClassLoader,不然JVM优先加载默认rt.jar中的java.lang.String。

可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载rt.jar包中的那个java.lang.String。由于在tomcat的web应用程序中,都是由webapp自己的类加载器先自己加载WEB-INF/classess目录中的类,然后才委托上级的类加载器加载,如果我们在tomcat的web应用程序中写一个java.lang.String,这时候Servlet程序加载的就是我们自己写的java.lang.String,但是这么干就会出很多潜在的问题,原来所有用了java.lang.String类的都将出现问题。

虽然java提供了endorsed技术,可以覆盖jdk中的某些类,但是,能够被覆盖的类是有限制范围,反正不包括java.lang这样的包中的类。

(下面的例如主要是便于大家学习理解只用,不要作为答案的一部分,否则,人家怀疑是题目泄露了)例如,运行下面的程序:

packagejava.lang;

publicclassString{

System.out.println("string");

报告的错误如下:

java.lang.NoSuchMethodError:main

Exceptioninthread"main"

这是因为加载了jre自带的java.lang.String,而该类中没有main方法。

1.

abstractclassName{

privateStringname;

publicabstractbooleanisStupidName(Stringname){}

大侠们,这有何错误

答案:错。abstractmethod必须以分号结尾,且不带花括号。

2.

publicclassSomething{

voiddoSomething(){

privateStrings="";

intl=s.length();

有错吗

答案:错。局部变量前不能放置任何访问修饰符(private,public,和protected)。final可以用来修饰局部变量

(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。

3.

abstractclassSomething{

privateabstractStringdoSomething();

这好像没什么错吧

答案:错。abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,怎么可以用private把abstract

method封锁起来呢(同理,abstractmethod前不能加final)。

4.

publicintaddOne(finalintx){

return++x;

这个比较明显。

答案:错。intx被修饰成final,意味着x不能在addOnemethod中被修改。

5.

Othero=newOther();

newSomething().addOne(o);

publicvoidaddOne(finalOthero){

o.i++;

classOther{

publicinti;

和上面的很相似,都是关于final的问题,这有错吗

答案:正确。在addOnemethod中,参数o被修饰成final。如果在addOnemethod里我们修改了o的reference

(比如:o=newOther();),那么如同上例这题也是错的。但这里修改的是o的membervairable

(成员变量),而o的reference并没有改变。

6.

classSomething{

inti;

publicvoiddoSomething(){

System.out.println("i="+i);

有什么错呢看不出来啊。

答案:正确。输出的是"i=0"。inti属於instantvariable(实例变量,或叫成员变量)。instantvariable有defaultvalue。int的defaultvalue是0。

7.

finalinti;

和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗

答案:错。finalinti是个final的instantvariable(实例变量,或叫成员变量)。final的instantvariable没有defaultvalue,必须在constructor(构造器)结束之前被赋予一个明确的值。可以修改为"finalinti=0;"。

8.

Somethings=newSomething();

System.out.println("s.doSomething()returns"+doSomething());

publicStringdoSomething(){

return"Dosomething...";

看上去很完美。

答案:错。看上去在main里calldoSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。staticmethod不能直接callnon-staticmethods。可改成"System.out.println("s.doSomething()returns"+s.doSomething());"。同理,staticmethod不能访问non-staticinstantvariable。

9.

此处,Something类的文件名叫OtherThing.java

privatestaticvoidmain(String[]something_to_do){

System.out.println("Dosomething...");

这个好像很明显。

答案:正确。从来没有人说过Java的Class名字必须和其文件名相同。但publicclass的名字必须和文件名相同,如果main方法是public,则为程序的入口方法,而为private只是普通的静态方法而已。

10.

interfaceA{

intx=0;

classD{

intx=2;

classBextendsD{

classCextendsBimplementsA{

publicvoidpX(){

System.out.println(super.x);

newC().pX();

11.

interfacePlayable{

voidplay();

interfaceBounceable{

interfaceRollableextendsPlayable,Bounceable{

Ballball=newBall("PingPang");

classBallimplementsRollable{

publicStringgetName(){

returnname;

publicBall(Stringname){

this.name=name;

publicvoidplay(){

ball=newBall("Football");

System.out.println(ball.getName());

这个错误不容易发现。

Spring是一个容器,可以把Struts的Action对象和Hibernate的SessionFactory对象、事务管理器管理起来,负责这些对象的生命周期,包括对象的创建、装载、销毁,从而使开发人员只去实现具体的业务逻辑。具体集成方式如下:

1.在web.xml中配置struts的servlet或filter入口类,同时在web.xml中配置spring的listener和配置文件路径

2.引用SSH所需的jar包放在WEB-INF/lib下,需要有struts-spring-plugin.jar

3.在struts.xml配置中,把Struts的Action类交由Spring托管

4.把Hibernate所需的DataSource、SessionFactory、TranscationManager、HibernateTemplate配置在Spring的配置文件中

5.Dao层的类有时需要继承HiberateDaoSupport类,如果有HibernateTemplate时,可以不继承

6.把Action、Service、Dao等对象注册到Spring中管理

packagecom.bwie.interview;

importjava.io.IOException;

importjava.io.InputStreamReader;

importjava.io.PrintStream;

importjava.util.StringTokenizer;

publicclassAnswerB01{

publicstaticvoidmain(String[]args)throwsIOException{

StringTokenizertokenizer1=getTokenzer("/a.txt");

StringTokenizertokenizer2=getTokenzer("/b.txt");

PrintStreamout=newPrintStream("C:/c.txt");

while(tokenizer1.hasMoreTokens()&&tokenizer2.hasMoreTokens()){

out.println(tokenizer1.nextToken());

out.println(tokenizer2.nextToken());

out.close();

privatestaticStringTokenizergetTokenzer(StringfileName)throwsIOException{

InputStreamReaderreader=newInputStreamReader(AnswerB01.class.getResourceAsStream(fileName));

StringBuilderbuilder=newStringBuilder(1000);

intlength=-1;

char[]cs=newchar[1024];

while((length=reader.read(cs))!=-1){

builder.append(cs,0,length);

reader.close();

returnnewStringTokenizer(builder.toString());

答:listFiles方法接受一个FileFilter对象,这个FileFilter对象就是过虑的策略对象,不同的人提供不同的FileFilter实现,即提供了不同的过滤策略。

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.FileOutputStream;

importjava.io.FilenameFilter;

publicclassAnswerB02{

FilesourceFolder=newFile("D:/java");

File[]files=sourceFolder.listFiles(newJavaFileFilter());

for(Filefile:files){

StringabsolutePath=file.getName();

StringtargetFile="D:/jad/"+absolutePath.substring(0,absolutePath.length()-5)+".jad";

copy(file,newFile(targetFile));

privatestaticvoidcopy(Filesource,Filetarget)throwsIOException{

FileInputStreaminput=newFileInputStream(source);

FileOutputStreamout=newFileOutputStream(target);

byte[]bs=newbyte[1024];

while((length=input.read(bs))!=-1){

out.write(bs,0,length);

input.close();

privatestaticfinalclassJavaFileFilterimplementsFilenameFilter{

publicbooleanaccept(Filedir,Stringname){

returnname.endsWith(".java");

publicclassAnswerB03{

Strings="我ABC汉DEF";

System.out.println(substring(s,6));

publicstaticStringsubstring(Strings,intlength){

char[]cs=s.toCharArray();

StringBuilderbuilder=newStringBuilder();

for(charc:cs){

if(isAsc(c)){

}else{

count+=2;

if(count>length){

builder.append(c);

returnbuilder.toString();

publicstaticbooleanisAsc(charc){

returnc<128;

答:哈哈,其实包含中文字符、英文字符、数字字符原来是出题者放的烟雾弹。

Stringcontent="中国aadf的111萨bbb菲的zz萨菲";

HashMapmap=newHashMap();

for(inti=0;i

charc=content.charAt(i);

Integercount=map.get(c);

if(count==null){

count=0;

count=count+1;

map.put(c,count);

Setentries=map.entrySet();

for(Entryentry:entries){

system.out.println(entry.getkey()+":"+entry.getValue());

如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。

intengishCount;

intchineseCount;

intdigitCount;

for(inti=0;i

charch=str.charAt(i);

if(ch>='0'&&ch<='9'||ch=='.'){

digitCount++;

}elseif((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){

engishCount++;

chineseCount++;

这是组合设计模式。

我有很多个(假设10万个)数据要保存起来,以后还需要从保存的这些数据中检索是否存在某个数据,(我想说出二叉树的好处,该怎么说呢?那就是说别人的缺点),假如存在数组中,那么,碰巧要找的数字位于99999那个地方,那查找的速度将很慢,因为要从第1个依次往后取,取出来后进行比较。平衡二叉树(构建平衡二叉树需要先排序,我们这里就不作考虑了)可以很好地解决这个问题,但二叉树的遍历(前序,中序,后序)效率要比数组低很多,原理如下图:

代码如下:

publicclassAnswerB04{

Noderoot=makeupTree();

traverse(root);

privatestaticvoidtraverse(Nodenode){

if(node==null){

return;

traverse(node.left);

System.out.println(node.value);

traverse(node.right);

}//11112021222

privatestaticNodemakeupTree(){

Noderoot=newNode(0);

Nodenode1=newNode(1);

Nodenode2=newNode(2);

Nodenode11=newNode(11);

Nodenode12=newNode(12);

Nodenode21=newNode(21);

Nodenode22=newNode(22);

root.left=node1;

root.right=node2;

node1.left=node11;

node1.right=node12;

node2.left=node21;

node2.right=node22;

returnroot;

publicstaticclassNode{

publicNodeleft;

publicNoderight;

publicintvalue;

publicNode(intvalue){

this.value=value;

1,张三,28

2,李四,35

3,张三,28

4,王五,35

5,张三,28

6,李四,35

7,赵六,28

8,田七,35

importjava.io.BufferedReader;

importjava.util.ArrayList;

importjava.util.Collections;

importjava.util.HashMap;

importjava.util.List;

importjava.util.Map;

importjava.util.Set;

publicclassAnswerB06{

BufferedReaderreader=newBufferedReader(newInputStreamReader(newFileInputStream("/person.txt")));

MapnameMap=newHashMap();

Stringline=null;

while((line=reader.readLine())!=null){

String[]segments=line.split(",",-1);

Stringname=segments[1];

Integercount=nameMap.get(name);

nameMap.put(name,count);

ListpersonCounts=newArrayList();

Setnames=nameMap.keySet();

for(Stringname:names){

PersonCountpersonCount=newPersonCount();

personCount.name=name;

personCount.count=nameMap.get(name);

personCounts.add(personCount);

Collections.sort(personCounts);

for(PersonCountpersonCount:personCounts){

System.out.println(personCount.name+"="+personCount.count);

staticclassPersonCountimplementsComparable{

publicStringname;

publicintcount;

publicintcompareTo(PersonCounto){

returncount-o.count;

第一种:饱汉模式

publicclassSingleTon{

privateSingleTon(){

//实例化放在静态代码块里可提高程序的执行效率,但也可能更占用空间

privatefinalstaticSingleToninstance=newSingleTon();

publicstaticSingleTongetInstance(){

returninstance;

第二种:饥汉模式

privatestaticSingleToninstance;

publicstaticsynchronizedSingleTongetInstance(){

if(instance==null){

instance=newSingleTon();

第三种:用枚举

publicenumSingleTon{

ONE;

第四种,双重校验:

synchronized(SingleTon.class){

其他形式:

定义一个类,它的构造函数为private的,所有方法为static的。

一般认为第一种形式要更加安全些

一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。

例:n=1237

则输出为:

9896,

4948,

2474,

1237,

提示:写程序时,先致谢按递增方式的代码,写好递增的以后,再增加考虑递减部分。

publicstaticvoiddoubleNum(intn){

if(n<=5000)

doubleNum(n*2);

System.out.println(n);

第1个人10,第2个比第1个人大2岁,依次递推,请用递归方式计算出第8个人多大?

packagecn.itcast;

importjava.util.Date;

publicclassA1{

System.out.println(computeAge(8));

publicstaticintcomputeAge(intn){

if(n==1)

return10;

returncomputeAge(n-1)+2;

publicstaticvoidtoBinary(intn,StringBufferresult){

if(n/2!=0)

toBinary(n/2,result);

result.append(n%2);

排序算法有:

冒泡排序、插值排序、选择排序、HASH排序、快速排序

冒泡排序:

publicstaticvoidbubbleSort(int[]array){

for(inti=1;i

for(intj=0;j

if(array[i]

inttemp=array[i];

array[i]=array[j];

array[j]=temp;

快速排序:

publicclassQuickSort{

publicvoidquickSort(String[]strDate,intleft,intright){

Stringmiddle,tempDate;

inti,j;

i=left;

j=right;

middle=strDate[(i+j)/2];

do{

while(strDate[i].compareTo(middle)<0&&i

i++;//找出左边比中间值大的数

while(strDate[j].compareTo(middle)>0&&j>left)

j--;//找出右边比中间值小的数

if(i<=j){//将左边大的数和右边小的数进行替换

tempDate=strDate[i];

strDate[i]=strDate[j];

strDate[j]=tempDate;

i++;

}while(i<=j);//当两者交错时停止

if(i

quickSort(strDate,i,right);

if(j>left){

quickSort(strDate,left,j);

String[]strVoid=newString[]{"11","66","22","0","55","22","0","32"};

QuickSortsort=newQuickSort();

sort.quickSort(strVoid,0,strVoid.length-1);

for(inti=0;i

System.out.println(strVoid[i]+"");

publicclassAnswerB11{

int[]array={2,25,21,63,234,83};

reverse(array);

privatestaticvoidreverse(int[]array){

for(inti=0;i

array[i]=array[array.length-1-i];

array[array.length-1-i]=temp;

publicclassAnswerB12{

privatestaticfinalchar[]data=newchar[]{'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};

privatestaticfinalchar[]units=newchar[]{'元','拾','佰','仟','万','拾','佰','仟','亿'};

System.out.println(toUpcaseMoney(convert(100215)));

privatestaticStringtoUpcaseMoney(Stringmoney){

returnnewStringBuilder(money).toString().replaceAll("零[拾佰仟]","零").replaceAll("零+万","万").replaceAll("零+元","元").replaceAll("零+","零");

publicstaticStringconvert(intmoney){

StringBuffersbf=newStringBuffer();

intunit=0;

while(money!=0){

sbf.insert(0,units[unit++]);

intnumber=money%10;

sbf.insert(0,data[number]);

money/=10;

returnsbf.toString();

importjava.util.Stack;

publicclassAnswerB13{

//两次pop

Nodetree=makeupTree();

Stackstack=newStack();

NodecurrentNode=tree;

while(currentNode!=null){

System.out.println(currentNode.value);

stack.push(currentNode);

currentNode=currentNode.left;

Nodeparent=stack.pop();

currentNode=parent.right;

if(currentNode==null){

if(stack.isEmpty()){

NodeparentParent=stack.pop();

currentNode=parentParent.right;

//一次pop

StacknodeStack=newStack();

Nodecurrent=tree;

while(current!=null){

System.out.println(current.value);

Nodeparent=current;

current=current.left;

if(current==null){

if(!nodeStack.isEmpty()){

NodeparentNode=nodeStack.pop();

current=parentNode.right;

nodeStack.push(parent);

publicclassQuestionB14{

int[]nums={1,2,7,4,6,9,5,3,65,23,87};

intmax1=Integer.MIN_VALUE;

intmax2=Integer.MIN_VALUE;

for(inti=0;i

intcurrent=nums[i];

if(current

continue;

if(current>max1){

max2=max1;

max1=current;

max2=current;

System.out.println(max2);

window.onload=function(){

//这么写是为了实现js代码与html代码的分离,当我修改js时,不能影响html代码。

document.getElementById("frm1").onsubmit=function(){

vard1=this.d1.value;

vard2=this.d2.value;

if(!verifyDate(d1)){

alert("第一个日期格式不对");

returnfalse;

if(!verifyDate(d2)){

alert("第二个日期格式不对");

if(!compareDate(d1,d2)){

alert("第二个日期比第一日期小");

};

functioncompareDate(d1,d2){

vararrayD1=d1.split("-");

vardate1=newDate(arrayD1[0],arrayD1[1],arrayD1[2]);

vararrayD2=d2.split("-");

vardate2=newDate(arrayD2[0],arrayD2[1],arrayD2[2]);

returndate1>date2;

functionverifyDate(d){

vardatePattern=/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2]\d|3[0-1])$/;

returndatePattern.test(d);

1

2

3

4

5

6

7

8

9

10

vartbl=document.getElementById("tbl");

rows=tbl.getElementsByTagName("tr");

for(i=0;i

varj=parseInt(i/3);

if(j%2==0)

rows[i].style.backgroundColor="#f00";

else

rows[i].style.backgroundColor="#0f0";

functionchkForm(this){

varvalue1=this.d1.value;

varlen=value1.length;

for(vari=0;i

if(value1.charAt(i)>"9"||value1.charAt(i)<"0"){

alert("含有非数字字符");

returntrue;

functionchkNumber(eleText){

varvalue=eleText.value;

varlen=value.length;

if(value.charAt(i)>"9"||value.charAt(i)<"0"){

eleText.focus();

除了写完代码,还应该在网页上写出实验步骤和在代码中加入实现思路,让面试官一看就明白你的意图和检查你的结果。

jQuery、ExtJs、Dojo、DWR、Pushlet

1.内存优化-Xms

2.增加线程数maxThreads="150"

3.修正server.xml中的中文编码

4.BIO改NIO

答:

1.URL地址长度不同,GET支持的字符少

2.GET的密码是明文,安全问题,容易受到黑客攻击

3.GET只传输文本,不支持文件传输

4.GET方式通常用来查询,不用来修改数据,是幂等操作,修改数据用POST

答:通常Servlet特指HttpServlet,用来接受浏览器的访问请求,浏览器最常用的请求为GET和POST方式,还有其它五种,而HttpServlet分别有七个方法(PUT、DELETE、HEADER、TRACE、OPTION)处理这些类型的请求,另有一个是J2EE不支持的,是CONNECT。Servlet是J2EE规范中的重要成员,是构成WEB的重要组件

1.加载Servlet类

2.实例化

3.初始化init

4.处理请求serviceà进一步调用doGet/doPost方法

5.销毁destory

1.定义一个Servlet类,继承HttpServlet抽象类

2.在web.xml中定义一个servlet标签,配置类名和servlet名

3.配置servlet处理的URL请求连接,可以用模糊匹配

4.在J2EE生命周期中,一个Servlet只有一个实例

5.一个Servlet可以为多个请求服务,每个请求在独立的线程中执行

Forward:服务器端内部跳转,URL地址不变,属于单次请求

Redirect:服务器通知浏览器中转,URL地址发生改变,是两次跳转

Forward不能跨域跳转

Redirect可以跨域跳转

Forward在两个页面传值可以通过parameter,也可以通过attribute,能传递Java对象

Redirect在两个页面传值只能通过parameter,在URL中传参

Jsp页面中的FORM标签里的method属性为get时调用doGet(),为post时调用doPost()。

在地址栏进接输入URL回车,会调用doGet()方法

setAttribute(Stringname,Object):设置名字为name的request的参数值

getAttribute(Stringname):返回由name指定的属性值

getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例

getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组

getCharacterEncoding():返回请求中的字符编码方式

getContentLength():返回请求的Body的长度

getHeader(Stringname):获得HTTP协议定义的文件头信息

getHeaders(Stringname):返回指定名字的requestHeader的所有值,结果是一个枚举的实例

getHeaderNames():返回所以requestHeader的名字,结果是一个枚举的实例

getInputStream():返回请求的输入流,用于获得请求中的数据

getMethod():获得客户端向服务器端传送数据的方法

getParameter(Stringname):获得客户端传送给服务器端的有name指定的参数值

getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例

getParametervalues(Stringname):获得有name指定的参数的所有值

getProtocol():获取客户端向服务器端传送数据所依据的协议名称

getQueryString():获得查询字符串

getRequestURI():获取发出请求字符串的客户端地址

getRemoteAddr():获取客户端的IP地址

getRemoteHost():获取客户端的名字

getServerName():获取服务器的名字

getServletPath():获取客户端所请求的脚本文件的路径

getServerPort():获取服务器的端口号

removeAttribute(Stringname):删除请求中的一个属性

1.getParameter是表单数据或URL参数,不能在server端修改

getAttribute是两个页面或servlet之间内部跳转传递对象参数,可以修改

2.getParameter的类型只能是String

getAttribute的类型可以是任意Java对象

3.forward跳转时才有attribute,redirect时,attribute全部为null

JSP共有以下9个内置的对象:

request用户端请求,此请求会包含来自GET/POST请求的参数

response网页传回用户端的回应

pageContext网页的属性是在这里管理

session与请求有关的会话期

applicationservlet正在执行的内容

out用来传送回应的输出

configservlet的构架部件

pageJSP网页本身

exception针对错误网页,未捕捉的例外

request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie,header,和session数据的有用的方法。

response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)

out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。

applicaton表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息

config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。

page表示从该页面产生的一个servlet实例

1.JSP生成.java文件

2.编译成.class文件

3.加载jsp.class类

4.实例化

5.初始化_jspInit

6.处理请求_jspService

7.销毁_jspDestory

(这个问题似乎不重要,不明白为何有此题)

答:JSP共有以下6种基本动作

jsp:include:在页面被请求的时候引入一个文件。

jsp:useBean:寻找或者实例化一个JavaBean。

jsp:setProperty:设置JavaBean的属性。

jsp:getProperty:输出某个JavaBean的属性。

jsp:forward:把请求转到一个新的页面。

jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式)

标签不同

执行的时机不同,动态include是在运行时把两个JSP合并,静态include是在编译期合并动态include在页面发生改变时,能及时更新,而静态页面,不会再次重新编译

跟6题同

1.request

2.session

3.application

4.cookie

5.URL地址

1.JSP编译后就是Servlet,因此本质上讲,JSP就是Servlet

2.JSP常用来做展示层,Servlet常用来做控制层

3.JSP容易编写,美工也可以参与修改,但Servlet专业技术要求较高

JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。

MVC是Model-View-Controller的简写。

Model代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),通常是数据访问层。

View是应用的表示层(由JSP页面产生)或模板框架,如freemarker、velocity

Controller是提供应用的处理过程控制(一般是一个Servlet),负责页面间跳转

通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

Model:JDBC、Hibernate、MyBatis

View:JSP、FreeMarker、Struts

Controller:SpringMVC、Struts、Servlet

SpringSide集成Spring、Struts、Hibernate、WebService、View展示框架,作者江南白衣

publicStringtranslate(Stringstr){

returnnewString(str.getBytes("ISO-8859-1"),"GBK").trim();

}catch(Exceptione){

System.err.println(e.getMessage());

thrownewRuntimeException(e);

employee:eid,ename,salary,dept_id

select*fromemployeeorderbydept_iddesc,salary;

selectcount(*),a.dept_id

fromemployeea

where

a.salary>(selectavg(b.salary)fromemployeebwhereb.dept_id=a.dept_id)

groupbya.dept_id

orderbya.dept_id

createorreplaceprocedureinsert_student(_namevarchar,_ageint,out_idint)

declear

avarchar;

begin

insertintostudentvalue(null,_name,_age);

selectmax(stuId)into_idfromstudent;

end;

callinsert_student('wfz',23,@id);

select@id;

mysql>createtriggerupdate_studentBEFOREupdateonstudentFOREACHROW

->select*fromstudent;

触发器不允许返回结果

createtriggerupdate_StudentBEFOREupdateonstudentFOREACHROW

insertintostudentvalue(null,'zxx',28);

mysql的触发器目前不能对当前表进行操作

deletefromarticleswhereid=8;

这个例子不是很好,最好是用删除一个用户时,顺带删除该用户的所有帖子

这里要注意使用OLD.id

触发器用处还是很多的,比如校内网、开心网、Facebook,你发一个日志,自动通知好友,其实就是在增加日志时做一个后触发,再向通知表中写入条目。因为触发器效率高。而UCH没有用触发器,效率和数据处理能力都很低。

存储过程的实验步骤:

mysql>delimiter|

mysql>createprocedureinsertArticle_Procedure(pTitlevarchar(50),pBidint,out

pIdint)

->begin

->insertintoarticle1value(null,pTitle,pBid);

->selectmax(id)intopIdfromarticle1;

->end;

->|

QueryOK,0rowsaffected(0.05sec)

mysql>callinsertArticle_Procedure('传智播客',1,@pid);

QueryOK,0rowsaffected(0.00sec)

mysql>delimiter;

mysql>select@pid;

@pid

3

1rowinset(0.00sec)

mysql>select*fromarticle1;

id

title

bid

test

chuanzhiboke

传智播客

3rowsinset(0.00sec)

触发器的实验步骤:

createtableboard1(idintprimarykeyauto_increment,namevarchar(50),ar

ticleCountint);

createtablearticle1(idintprimarykeyauto_increment,titlevarchar(50)

,bidintreferencesboard1(id));

delimiter|

createtriggerinsertArticle_Triggerafterinsertonarticle1foreachro

wbegin

->updateboard1setarticleCount=articleCount+1whereid=NEW.bid;

delimiter;

insertintoboard1value(null,'test',0);

insertintoarticle1value(null,'test',1);

第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式。

数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。

第二范式(2NF):在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。

要求数据库表中的每个实例或行必须可以被唯一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。

第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。

第三范式的要求如下:

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

所以第三范式具有如下特征:

1,每一列只有一个值

2,每一行都能区分。

3,每一个表都不包含其他表已经包含的非主关键字信息。

例如,帖子表中只能出现发帖人的id,而不能出现发帖人的id,还同时出现发帖人姓名,否则,只要出现同一发帖人id的所有记录,它们中的姓名部分都必须严格保持一致,这就是数据冗余。

1.程序优化,用PrepareedStatement进行增删改查

2.程序优化,尽量批量处理,避免逐条处理,减小IO数

3.查询结果不要用*来查询所有字段,要明确指明结果字段

4.减少多表连接数,尽量少的表进行连接

5.表连接时,尽量用主键进行连接或用唯一索引

6.表的查询多时,一定建立索引

7.根据查询条件,建立索引,如果查询条件不止一个时,使用组合索引

8.在查询条件表达式的左侧尽量不要使用函数,否则索引失效

9.如果不得不用函数,则建立函数索引

11.如果有like话,尽量避免%xxx%两侧都有%的条件,单侧%可以使用索引,多侧不可以

12.尽量不用数据库,使用缓存

13.可以考虑用nosql数据库提高效率

14.SQL的条件表达式,在Oracle中,是按倒序使用索引的

15.如果用DDL改动了数据库表字段,需要重建索引,不然索引失效

16.SQL尽量不要有多余的空格和换行

17.使用分布式数据库

18.合理创建表分区表空间

19.建立索引时字段不能有null值

20.使用数据库连接池

21.条件中与null比较索引无效

22.表结构改动时索引全部失效

22.使用存储过程

union和unionall都是合并结果集

union的两个select查询字段相同,参数类型的顺序相同,Hibernate的HQL不支持union。

区别是:

1.union去除两个结果集的重复记录,unionall不去除重复记录,是两个结果集的加和

2.union效率低,unionall效率高

selectafromtestwherea>b

unionall

selectbfromtestwherea<=b

oracle:

select(casewhena>bthenaelsebend)asresultfromtest

取出sql表中第31到40的记录(以自动增长ID为主键)

sqlserver方案1:

selecttop10*fromtwhereidnotin(selecttop30idfromtorderbyid)ordebyid

sqlserver方案2:

selecttop10*fromtwhereidin(selecttop40idfromtorderbyid)orderbyiddesc

mysql方案:select*fromtorderbyidlimit30,10

oracle方案:select*from(selectrownumr,*fromtwherer<=40)wherer>30

namekechengfenshu

张三语文81

张三数学75

李四语文76

李四数学90

王五语文81

王五数学100

王五英语90

答案:

A:selectdistinctnamefromscorewherenamenotin(selectdistinctnamefromscorewherefenshu<=80)

B:selectdistinctt1.namefromscoret1where80

C:selectdistinctnamefromscoret1wherenotexists(select*fromscoret2wheret2.name=t1.nameandt2.fenshu<80);

一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.

selecta.name,b.name

fromteama,teamb

wherea.name>b.name

请用SQL语句实现:从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。请注意:TestDB中有很多科目,都有1-12月份的发生额。

AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。

数据库名:JcyAudit,数据集:Select*fromTestDB

准备数据的sql代码:

droptableifexistsTestDB;

createtableTestDB(idintprimarykeyauto_increment,AccIDvarchar(20),Occmonthdate,DebitOccurbigint);

insertintoTestDBvalues

(null,'101','1988-1-1',100),

(null,'101','1988-2-1',110),

(null,'101','1988-3-1',120),

(null,'101','1988-4-1',100),

(null,'101','1988-5-1',100),

(null,'101','1988-6-1',100),

(null,'101','1988-7-1',100),

(null,'101','1988-8-1',100);

--复制上面的数据,故意把第一个月份的发生额数字改小一点

(null,'102','1988-1-1',90),

(null,'102','1988-2-1',110),

(null,'102','1988-3-1',120),

(null,'102','1988-4-1',100),

(null,'102','1988-5-1',100),

(null,'102','1988-6-1',100),

(null,'102','1988-7-1',100),

(null,'102','1988-8-1',100);

--复制最上面的数据,故意把所有发生额数字改大一点

(null,'103','1988-1-1',150),

(null,'103','1988-2-1',160),

(null,'103','1988-3-1',180),

(null,'103','1988-4-1',120),

(null,'103','1988-5-1',120),

(null,'103','1988-6-1',120),

(null,'103','1988-7-1',120),

(null,'103','1988-8-1',120);

(null,'104','1988-1-1',130),

(null,'104','1988-2-1',130),

(null,'104','1988-3-1',140),

(null,'104','1988-4-1',150),

(null,'104','1988-5-1',160),

(null,'104','1988-6-1',170),

(null,'104','1988-7-1',180),

(null,'104','1988-8-1',140);

--复制最上面的数据,故意把第二个月份的发生额数字改小一点

(null,'105','1988-1-1',100),

(null,'105','1988-2-1',80),

(null,'105','1988-3-1',120),

(null,'105','1988-4-1',100),

(null,'105','1988-5-1',100),

(null,'105','1988-6-1',100),

(null,'105','1988-7-1',100),

(null,'105','1988-8-1',100);

selectdistinctAccIDfromTestDB

whereAccIDnotin

(

select

TestDB.AccID

from

TestDB,

(select*fromTestDBwhereAccID='101')asdb101

TestDB.Occmonth=db101.Occmonth

andTestDB.DebitOccur<=db101.DebitOccur

);

yearmonthamount

199111.1

199121.2

199131.3

199141.4

199212.1

199222.2

199232.3

199242.4

查成这样一个结果

yearm1m2m3m4

19911.11.21.31.4

19922.12.22.32.4

准备sql语句:

droptableifexistssales;

createtablesales(idintauto_incrementprimarykey,yearvarchar(10),monthvarchar(10),amountfloat(2,1));

insertintosalesvalues

(null,'1991','1',1.1),

(null,'1991','2',1.2),

(null,'1991','3',1.3),

(null,'1991','4',1.4),

(null,'1992','1',2.1),

(null,'1992','2',2.2),

(null,'1992','3',2.3),

(null,'1992','4',2.4);

答案一:

selects.year,

(selectt.amountfromsalestwheret.month='1'andt.year=s.year)m1,

(selectt.amountfromsalestwheret.month='2'andt.year=s.year)m2,

(selectt.amountfromsalestwheret.month='3'andt.year=s.year)m3,

(selectt.amountfromsalestwheret.month='4'andt.year=s.year)m4

fromsaless

groupbys.year;

答案二:

y.year,

(selectt.amountfromsalestwheret.month='1'andt.year=y.year)m1,

(selectt.amountfromsalestwheret.month='2'andt.year=y.year)m2,

(selectt.amountfromsalestwheret.month='3'andt.year=y.year)m3,

(selectt.amountfromsalestwheret.month='4'andt.year=y.year)m4

(selectdistinctyearfromsalessorderbyyear)y

回复表:reply_id,article_id,reply_time,content

a.title,a.post_user,r.reply_time

fromreplyr

leftjoinarticleaona.article_id=r.article_id

r.reply_id=

selectmax(re.reply_id)

fromreplyre

re.article_id=r.article_id

)

学生表(student)如下:

id号学号姓名课程编号课程名称分数

idsidnamecnocnamescore

12005001张三0001数学69

22005002李四0001数学89

32005001张三0001数学69

A:deletefromstudentwhereidnotin(selectmin(id)fromstudentgroupbysid,name,cno,cname,score)

表结构如下:

城市(city){城市ID(city_id),城市名称(city_name)}

1、查询起飞城市是北京的所有航班,按到达城市的名字排序

select*

fromflightf

leftjoincitysconsc.city_id=f.start_city_id

leftjoincityeconec.city_id=f.end_city_id

sc.city_name='北京'

orderbyec.city_name

selectsc.city_name,ec.city_name,f.start_time,flight_id

andec.city_name='上海'

3、查询具体某一天(2005-5-8)的北京到上海的的航班次数

selectcount(*)

andf.start_time>=to_date('2005-05-08','yyyy-mm-dd')

andf.start_time

employee:id,name,salary,manager_id;

fromemployeee

leftjoinemployeemonm.id=e.manager_id

e.salary>m.salary

数据库中有3个表teacher表,student表,teacher_student关系表。

teacher表:teacher_id,name,age

student表:student_id,name,age

teacher_student表:teacher_id,student_id

selectcount(*),ts.teacher_id

fromteacher_studentts

leftjointeachertont.teacher_id=ts.teacher_id

leftjoinstudentsons.student_id=ts.student_id

t.age<45

ands.age>12

groupbyts.teacher_id

fromteacher_studentts,teachert,students

t.teacher_id=ts.teacher_id

ands.student_id=ts.student_id

andt.age<45

selectmax(post_count),b.post_user_id,u.name

selectcount(*)aspost_count,a.post_user_id

fromarticlea

groupbya.post_user_id

)b

leftjoinuseruonu.user_id=b.post_user_id。

方案一:updateusersetscore=0;

dropcolumnscore;altertableuseraddcolumnscoreint。

在Oracle中,动了表结构,索引失效

方案三:使用Java程序,for循环,效率最差

方案四:使用存储过程loop循环,效率其次差

selectdistinctuser_id

fromuser_rolescx

notexists

fromuser_rolescy

scy.user_id='张三'

andnotexits

fromuser_rolescz

scz.user_id=scx.user_id

andscz.role_id=scy.role_id

EMPLOYEES(employee_idNUMBER,first_nameVARCHAR2(25),last_nameVARCHAR2(25),salarynumber(8,2),hired_dateDATE,department_idnumber(2))

Departments(Departmentidnumber(2),DepartmentNameVARCHAR2(25))

(1)基于上述EMPLOYEES表写出查询:写出雇用日期在今年的,或者工资在[1000,2000]之间的,或者员工姓名(last_name)以’Obama’打头的所有员工,列出这些员工的全部个人信息。

答案一、

select*fromemployees

Year(hired_date)=Year(date())

or(salarybetween1000and200)

orleft(last_name,5)='Obama’';

答案二、

hired_date>=to_date(Year(date())||‘-01-01’,‘yyyy-mm-dd’

andhired_date

orlast_namelike‘Obama%’

(2)查出部门平均工资大于1800元的部门的所有员工,列出这些员工的全部个人信息。

select*fromemployeeem

em.department_idin

selectdepartment_id

groupbydepartment_id

havingavg(salary)>1800

selectavg(e.salary)fromemployeeewheree.department_id=em.department_id

)>1800

(3)查出个人工资高于其所在部门平均工资的员工,列出这些员工的全部个人信息及该员工工资高出部门平均工资百分比。

selecte.*,((e.salary-as.avg_salary)/as.avg_salary)assalary_percent

leftjoin

selectem.department_id,avg(em.salary)asavg_salary

fromemployeeem

groupbyem.department_id

)asone.department_id=as.department_id

e.salary>as.avg_salary

selectemployeee.*,(e.salary-t.avg_salary)/as.avg_salary

fromemployeee,

selectt.department_id,avg(salary)avg_salary

groupbyt.department_id

)ast

e.department_id=t.department_idande.salary>t.avg_salary

1.Class.forName(driver)

2.ClassLoader.loadClass(driver)

3.newXXXDriver();

Class.forName("com.mysql.jdbc.Driver");

Stringurl="jdbc:mysql:///test";

Connectioncn=DriverManager.getConnection(url,"root","root");

Stringsql="{callinsert_student(,,)}";

CallableStatementcstmt=cn.prepareCall(sql);

cstmt.registerOutParameter(3,Types.INTEGER);

cstmt.setString(1,"wangwu");

cstmt.setInt(2,25);

cstmt.execute();

//get第几个,不同的数据库不一样,建议不写

System.out.println(cstmt.getString(3));

一个sql命令在数据库执行的步骤为:语法检查,语义分析,编译成内部指令,缓存指令,执行指令等过程。

1.PrepareStatement第一次执行某SQL时可以把最终结果缓存到数据中,以后再执行同一格式的SQL时,不再进行优化,直接使用缓存中的优化结果,效率比较高。

2.参数传值,可以防止SQL注入

答:按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。加载完这个Class字节码后,接着就可以使用Class字节码的newInstance方法去创建该类的实例对象了。

有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时候就需要使用Class.forName去动态加载该类,这个类名通常是在配置文件中配置的,例如,spring的ioc中每次依赖注入的具体类就是这样配置的,jdbc的驱动类名通常也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更换驱动类名。

查询结果集如果记录数比较多时,服务器内存和浏览器内存都可能溢出,另外,数据量太大客户端的性能会降低,滚动条较小,操作也不方便,需要数据库分页查询。

SQLServer分页:

selecttop#pageSize#*fromstudentswhereidnotin

(selecttop#pageSize#*(#pageNumber#-1)idfromstudentsorderbyid)orderbyid

MySQL分页:

select*fromstudentsorderbyidlimit#pageSize#*(#pageNumber#-1),#pageSize#

Oracle分页:

SELECT*FROM

SELECTT1.*

FROM

SELECTT.*,ROWNUMRNFROMTR_ORDERTORDERBYT.ORDER_IDDESC

)T1

WHERE

T1.RN<=#{pageSize}*#{pageNumber}

)T

WHERET.RN>#{pageSize}*(#{pageNumber}-1)

Connectioncn=null;

PreparedStatementpstmt=null;

Resultsetrs=null;

Class.forname(driveClassName);

cn=DriverManager.getConnection(url,username,password);

pstmt=cn.prepareStatement(“selectscore.*fromscore,student“+

“wherescore.stuId=student.idandstudent.name=”);

pstmt.setString(1,studentName);

Resultsetrs=pstmt.executeQuery();

while(rs.next()){

system.out.println(rs.getInt(“subject”)+“\t”+rs.getFloat(“score”));

}catch(Exceptione){e.printStackTrace();}

if(rs!=null)try{rs.close();}catch(exceptione){}

if(pstmt!=null)try{pstmt.close();}catch(exceptione){}

if(cn!=null)try{cn.close();}catch(exceptione){}

Connectionconn=...;

Statementstmt=...;

ResultSetrs=stmt.executeQuery("select*fromtable1");

}catch(Exceptionex){

答:没有finally语句来关闭各个对象,另外,使用finally之后,要把变量的定义放在try语句块的外面,以便在try语句块之外的finally块中仍可以访问这些变量。

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接标记为空闲,其他调用就可以使用这个连接。

实现方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正关连接,而是把它代理的Connection对象还回到连接池中。

ORM是对象和关系型数据库映射,是把Java中的JavaBean对象和数据库表进行映射,使数据库表中的记录和JavaBean对象一一对应,从而大大简化原来直接使用JDBC时,手工拼写SQL带来的不便。

ORM通过配置文件,使数据库表和JavaBean类对应起来,提供简便的操作方法,增、删、改、查记录,不再拼写字符串生成SQL,编程效率大大提高,同时减少程序出错机率,增强数据库的移植性,方便测试。但是原生的JDBC具有更强的灵活性,适合复杂多变的SQL应用。

常用的ORM框架有:Hibernate、MyBatis、TopLink、OJB

1.大数据可以采用分布式数据库和建立分区表(PARTITION)

2.建立有效索引:主键索引、联合索引、倒序索引、函数索引(INDEX)

3.使用物化视图(MATERIALIZEDVIEW)

4.使用存储过程(PROCDUDER)

5.读写分离(goldengate软件实现)

6.归档旧数据(新旧数据查询,保证新数据的效率提高),程序做调整,旧数据和新数据查询页面分离

可以出于任何使用SQL语句的目的来使用存储过程,它具有以下优点:

(1)功能强大,限制少。

(2)可以在单个存储过程中执行一系列SQL语句。

(3)可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。

(4)存储过程在创建时即在上进行编译,所以执行起来比单个SQL语句快。

(5)可以有多个返回值,即多个输出参数,并且可以使用SELECT返回结果集。

函数:是由一个或多个SQL语句组成的子程序,可用于封装代码以便重新使用。自定义函数诸多限制,有许多语句不能使用,许多功能不能实现。函数可以直接引用返回值,用表变量返回记录集。但是,用户定义函数不能用于执行一组修改全局数据库状态的操作。

答:有DOM,SAX,STAX等

DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问

STAX:StreamingAPIforXML(StAX)

讲解这些区别是不需要特别去比较,就像说传智播客与其他培训机构的区别时,我们只需说清楚传智播客有什么特点和优点就行了,这就已经间接回答了彼此的区别。

答:看如下代码,用编码方式加以解决

packagetest;

importjava.io.*;

publicclassDOMTest

{

privateStringinFile="c:\\people.xml"

privateStringoutFile="c:\\people.xml"

publicstaticvoidmain(Stringargs[])

newDOMTest();

publicDOMTest()

try

javax.xml.parsers.DocumentBuilderbuilder=

javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();

org.w3c.dom.Documentdoc=builder.newDocument();

org.w3c.dom.Elementroot=doc.createElement("老师");

org.w3c.dom.Elementwang=doc.createElement("王");

org.w3c.dom.Elementliu=doc.createElement("刘");

wang.appendChild(doc.createTextNode("我是王老师"));

root.appendChild(wang);

doc.appendChild(root);

javax.xml.transform.Transformertransformer=

javax.xml.transform.TransformerFactory.newInstance().newTransformer();

transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING,"gb2312");

transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT,"yes");

transformer.transform(newjavax.xml.transform.dom.DOMSource(doc),

new

javax.xml.transform.stream.StreamResult(outFile));

catch(Exceptione)

System.out.println(e.getMessage());

答:用SAX方式解析XML,XML文件如下:

王小明

信息学院

6258113

男,1955年生,博士,95年调入海南大学

事件回调类SAXHandler.java

importjava.util.Hashtable;

importorg.xml.sax.*;

publicclassSAXHandlerextendsHandlerBase

privateHashtabletable=newHashtable();

privateStringcurrentElement=null;

privateStringcurrentValue=null;

publicvoidsetTable(Hashtabletable)

this.table=table;

publicHashtablegetTable()

returntable;

publicvoidstartElement(Stringtag,AttributeListattrs)

throwsSAXException

currentElement=tag;

publicvoidcharacters(char[]ch,intstart,intlength)

currentValue=newString(ch,start,length);

publicvoidendElement(Stringname)throwsSAXException

if(currentElement.equals(name))

table.put(currentElement,currentValue);

JSP内容显示源码,SaxXml.jsp:

剖析XML文件people.xml

<%@pageerrorPage=ErrPage.jsp

contentType=text/html;charset=GB2312%>

<%@pageimport=java.io.*%>

<%@pageimport=java.util.Hashtable%>

<%@pageimport=org.w3c.dom.*%>

<%@pageimport=org.xml.sax.*%>

<%@pageimport=javax.xml.parsers.SAXParserFactory%>

<%@pageimport=javax.xml.parsers.SAXParser%>

<%@pageimport=SAXHandler%>

<%

Filefile=newFile(c:\people.xml);

FileReaderreader=newFileReader(file);

Parserparser;

SAXParserFactoryspf=SAXParserFactory.newInstance();

SAXParsersp=spf.newSAXParser();

SAXHandlerhandler=newSAXHandler();

sp.parse(newInputSource(reader),handler);

HashtablehashTable=handler.getTable();

out.println(教师信息表);

out.println(姓名++

(String)hashTable.get(newString(name))+);

out.println(学院++

(String)hashTable.get(newString(college))+);

(String)hashTable.get(newString(telephone))+);

out.println(备注++

(String)hashTable.get(newString(notes))+);

out.println();

%>

a:两种形式dtdschema,b:本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),c:有DOM,SAX,STAX等

DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问

SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问

1.struts是一个按MVC模式设计的Web层框架,实质是一个强大的Servlet。负责处理请求转发和路由。

2.struts的基本配置文件为struts-config.xml,里面配置了很多Action、ActionForm及中转规则,这个文件通过web.xml中的ActionServlet进行加载和初始化。

3.当用户请求发送到服务器端时,ActionServlet会接收到此请求,然后根据struts.xml中的配置找到相应的Action,同时根据ActionForm的配置,创建ActionForm的实例并进行赋值,当做参数交给Action进行业务处理,返回ActionMapping对象。

4.ActionServlet根据struts.xml中action的配置,forward到指定的页面,把结果以JSP处理过的HTML返回给客户的浏览器。

5.可以继续谈一谈struts1和struts2的区别

它是ORM思想的一个实现,对JDBC进行了很好的封装,它通过配置使JavaBean对象和数据库表之间进行映射,并提供对增、删、改、查便利的操作方法,同时支持事务处理,它对数据库记录还提供了缓存机制,提高效率,它可以使程序员不用书写SQL,也不用关心数据库SQL之间的差异,它通过方言对数据库进行了很好的适配。

1.Hiberante的主配置文件为hibernate.cfg.xml,其中定义了数据源、连接池、缓存、事务、表生成策略等配置

2.通过*.hbm.xml映射配置文件,定义了JavaBean对象和数据库表之间的映射关系,还定了对象和对象之间的映射关系,包括:一对一、多对一、一对多、多对多

5.Hiberante从3版本后,支持JPA规范,可以不使用映射文件配置,而全部采用JPA注解方式进行对象和数据库表的映射,Hibernate还扩容了JPA规范。

6.Hibernate对常用的缓存技术做了封装,可以轻松的调用各种缓存框架

AOP是面向切面编程,主要应用在以下领域:

1.日志

2.安全

3.性能

4.事务

5.自定义场景,例如流程控制可以采用AOP+注解方式完成

Spring实质上讲就是一个Bean工厂,主要用来管理Bean的生命周期和框架集成。

Spring分为两个部分:

1.IOC控制反转(也叫DI依赖注入,此名由MardinFowler给出)。Spring的顶层容器为BeanFactory,常用的ApplicationContext为它的子接口,实现了工厂模式。Spring需要加载它的配置文件,通常配置文件名为applicationContext.xml或spring-config.xml,其中Bean的定义为

2.Spring容器负责根据配置文件创建Bean对象并进行对其的装载。Bean有懒加载,属性配置,自动装载,parentBean,abstractBean,FactoryBean(通常用于框架集成,需要了解BeanFactory和FactoryBean的区别),scope(singleton单例,prototype多例)。

3.Spring2.5后提供了对注释的支持,更加方便,在重构时作用巨大。

4.Spring的IOC解除了模块间的耦合,可以使项目多模块并行开发。

5.Spring还提供了AOP的支持,方便在切面级开发,例如事务控制、日志、性能、安全等。Spring的AOP有两种配置方式,都是通过动态代理技术实现的,一种是JDK自带的Proxy类的实现,一种是CGLIB动态代理实现,通过开关进行设置。

6.Spring的重要做用是集成其它框架。Spring官方提供了许多类库对其它框架进行了封装,例如通过的事务模块、JMS框架的调用模块、Email支持、调试器Scheduler、JNDI等,同时其它框架也提供了针对Spring的集成包,例如Hibernate、MyBatis、Struts等

见第一条

6、Struts优缺点

优点:

2.有丰富的tag可以用,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率

3.页面导航

使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。

4.提供Exception处理机制.

5.数据库链接池管理

6.支持I18N

缺点

一、转到展示层时,需要配置forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器

二、Struts的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。

三、测试不方便.Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现。不过有一个Junit的扩展工具StrutsTestCase可以实现它的单元测试。

四、类型的转换.Struts的FormBean把所有的数据都作为String类型,它可以使用工具Commons-Beanutils进行类型转化。但它的转化都是在Class级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。

五、对Servlet的依赖性过强.Struts处理Action时必需要依赖ServletRequest和ServletResponse,所有它摆脱不了Servlet容器。

六、前端表达式语言方面.Struts集成了JSTL,所以它主要使用JSTL的表达式语言来获取数据。可是JSTL的表达式语言在Collection和索引属性方面处理显得很弱。

七、对Action执行的控制困难.Struts创建一个Action,如果想控制它的执行顺序将会非常困难。甚至你要重新去写Servlet来实现你的这个功能需求。

八、对Action执行前和后的处理.Struts处理Action的时候是基于class的hierarchies,很难在action处理前和后进行操作。

九、对事件支持不够.在struts中,实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在Struts中实际是一个表单只能对应一个事件,struts这种事件方式称为applicationevent,applicationevent和componentevent相比是一种粗粒度的事件

Struts是采用JavaServlet/JavaServerPages技术,开发Web应用程序的开放源码的framework。采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。Struts有如下的主要功能:一.包含一个controllerservlet,能将用户的请求发送到相应的Action对象。二.JSP自由tag库,并且在controllerservlet中提供关联支持,帮助开发员创建交互式表单应用。三.提供了一系列实用对象:XML处理、通过JavareflectionAPIs自动处理JavaBeans属性、国际化的提示和消息。

1.Struts1是比较老的WEB框架,Struts2比较新,相对于Struts1功能更强

2.struts1的前端控制器是一个Servlet,名称为ActionServlet,struts2的前端控制器是一个filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPreparedAndExecuteFilter

3.struts1的action需要继承Action类,struts2的action可以不继承任何类;

4.struts1对同一个路径的所有请求共享一个Action实例,是单例,struts2对同一个路径的每个请求分别使用一个独立Action实例对象,所有对于struts2的Action不用考虑线程安全问题。

5.Struts2还添加了过滤器interceptor,用于拦截请求,比filter功能更强大

6.Struts2可以对字段进行类型自动转换。

7.Struts2是从WebWork框架上开发出来的,没有依赖Struts1,和Struts1区别比较大。

相同点:都是ORM框架,对jdbc进行了封装。

不同点:iBatis需要手写sql,hibernate不需要手写sql,因此iBatis对程序员的sql功底要求高,对数据库的操作也更加灵活。

iBatis可以对sql进行优化,提高性能,hibernate的sql为自动生成,在sql优化方面会很麻烦。

iBatis的sql是手写的对多表的查询更加方便,而hibernate的连表查询需要拼复杂的HQL语句。

iBatis还可以使用数据库特有的特性,hibernate只能用标准的sql。

ibatis的好处:屏蔽jdbcapi的底层访问细节;将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能,queryForList返回对象集合,用queryForObject返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。

Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,ibatis需要我们自己在xml配置文件中写sql语句,hibernate要比ibatis功能负责和强大很多。因为hibernate自动生成sql语句,我们无法控制该语句,我们就无法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候用ibatis就是不错的选择,因为ibatis还是由我们自己写sql语句。

多对一,在多的一方配置

一对多,在一的一方配置

把实体对象转换成数据库可识别的SQL,并执行,然后把数据库返回的结果,以对象的形式作为方法的返回值进行返回。

把对数据库的增、删、改、查进行封装,有关数据库的操作全部在DAO中执行,其它部分不会涉及数据库的任何操作。

DAO为上层的业务逻辑层提供数据操作支持。

方案一:定义DataSource的Bean和hibernate.cfg.xml配置,然后把这两个配置交由Spring的SessionFactoryBean进行初始化,再定义一个HibernateTemplate的Bean,注入到DAO中。

解决方案一,按照Object[]数据取出数据,然后自己组bean

解决方案二,对每个表的bean写构造函数,比如表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1filed1,type2field2),然后在hql里面就可以直接生成这个bean了。

对于多表查询的话,HQL需要进行连表查询,可以使用leftjoin等连表语句和where条件。

按照以下思路来回答:(1)首先说清楚什么是缓存,(2)再说有了hibernate的Session就是一级缓存,即有了一级缓存,为什么还要有二级缓存(3)最后再说如何配置Hibernate的二级缓存。

(1)缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。下面是缓存的伪代码:

(3)二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中。明白了二级缓存原理和有了这个思路后,很容易配置起Hibernate的二级缓存。扩展知识:一个SessionFactory可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用Hibernate的二级缓存后,注意不要有其他的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。

Spring的依赖注入,又称为IOC,还可以称为是DI,其实就是把对象之间的相互依赖由原来的手动写代码方式注入,改为由Spring容器进行自动注入,并把Bean的生命周期交由Spring进行管理。Spring支持的注入方式有两种:属性注入、构造器注入。Spring不支持接口注入。

AOP常用来做安全、日志、性能、事务、自定义的业务(例如表单重复提交)。

Spring是轻量级框架,不需要容器支持。

EJB(EnterpiseJavaBean)是JavaEE中的规范,分为BMP和CMP两种,需要容器支持。EJB有实体Bean(EntityBean)、会话Bean(SessionBean),状态Bean(StatusBean),消息驱动Bean(MessageDrivingBean)。EJB需要继承Remote接口,需要实现local和remote方法。

标准建模语言UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。

总共23种,分为三大类:创建型,结构型,行为型

我只记得其中常用的6、7种,分别是:

创建型(工厂、工厂方法、抽象工厂、单例)

结构型(包装、适配器,组合,代理)

行为(观察者,模版,策略)

然后再针对你熟悉的模式谈谈你的理解即可。

Java中的23种设计模式:

Factory(工厂模式),Builder(建造模式),FactoryMethod(工厂方法模式),

Prototype(原始模型模式),Singleton(单例模式),Facade(门面模式),

Adapter(适配器模式),Bridge(桥梁模式),Composite(合成模式),

Decorator(装饰模式),Flyweight(享元模式),Proxy(代理模式),

Command(命令模式),Interpreter(解释器模式),Visitor(访问者模式),

Iterator(迭代子模式),Mediator(调停者模式),Memento(备忘录模式),

Observer(观察者模式),State(状态模式),Strategy(策略模式),

TemplateMethod(模板方法模式),ChainOfResponsibleity(责任链模式)

工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或SQLServer。客户端需要安装专用的客户端软件。

B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如NetscapeNavigator或InternetExplorer,服务器安装Oracle、Sybase、InFORMix或SQLServer等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过WebServer同数据库进行数据交互。

C/S与B/S区别:

1.硬件环境不同:

C/S一般建立在专用的网络上,小范围里的网络环境,局域网之间再通过专门服务器提供连接和数据交换服务.

2.对安全要求不同

C/S一般面向相对固定的用户群,对信息安全的控制能力很强.一般高度机密的信息系统采用C/S结构适宜.可以通过B/S发布部分可公开信息.

B/S建立在广域网之上,对安全的控制能力相对弱,可能面向不可知的用户。

3.对程序架构不同

C/S程序可以更加注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑.

B/S对安全以及访问速度的多重的考虑,建立在需要更加优化的基础之上.比C/S有更高的要求B/S结构的程序架构是发展的趋势,从MS的.Net系列的BizTalk2000Exchange2000等,全面支持网络的构件搭建的系统.SUN和IBM推的JavaBean构件技术等,使B/S更加成熟.

4.软件重用不同

C/S程序可以不可避免的整体性考虑,构件的重用性不如在B/S要求下的构件的重用性好.

B/S对的多重结构,要求构件相对独立的功能.能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子

5.系统维护不同

C/S程序由于整体性,必须整体考察,处理出现的问题以及系统升级.升级难.可能是再做一个全新的系统

B/S构件组成,方面构件个别的更换,实现系统的无缝升级.系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.

6.处理问题不同

B/S建立在广域网上,面向不同的用户群,分散地域,这是C/S无法作到的.与操作系统平台关系最小.

7.用户接口不同

C/S多是建立的Window平台上,表现方法有限,对程序员普遍要求较高

B/S建立在浏览器上,有更加丰富和生动的表现方式与用户交流.并且大部分难度减低,减低开发成本.

8.信息流不同

C/S程序一般是典型的中央集权的机械式处理,交互性相对低

B/S信息流向可变化,B-BB-CB-G等信息、流向的变化,更像交易中心。

应用服务器:Weblogic、Tomcat、Jboss

WEBSERVER:IIS、Apache

BEAWebLogicServer,IBMWebSphereApplicationServer,Oracle9iApplicationServer,jBoss,Tomcat

答:Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterprieseapplicationmodel).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietntier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。

一个另类的回答:j2ee就是增删改查。

J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。

J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。

EJB容器:Enterprisejavabean容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。

JNDI:(JavaNaming&DirectoryInterface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。

JMS:(JavaMessageService)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。

JTA:(JavaTransactionAPI)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。

JAF:(JavaActionFrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。

RMI/IIOP:(RemoteMethodInvocation/internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

(这个问题不作具体回答,列出来只是告诉读者可能会遇到什么问题,你不需要面面俱到,什么都精通。)

在启动Weblogic的脚本中(位于所在Domian对应服务器目录下的startServerName),增加setMEM_ARGS=-Xms32m-Xmx200m,可以调整最小内存为32M,最大200M

可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者commenv文件,增加setPRODUCTION_MODE=true。

修改服务启动文件,增加WLS_USER和WLS_PW项。也可以在boot.properties文件中增加加密过的用户名和密码.

保存在此Domain的config.xml文件中,它是服务器的核心配置文件。

Domain目录服务器目录applications,将应用目录放在此目录下将可以作为应用访问,如果是Web应用,应用目录需要满足Web应用目录要求,jsp文件可以直接放在应用目录中,Javabean需要放在应用目录的WEB-INF目录的classes目录中,设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。

不同类型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP实体Bean一般还需要weblogic-cmp-rdbms-jar.xml

缺省安装中使用DemoIdentity.jks和DemoTrust.jksKeyStore实现SSL,需要配置服务器使用EnableSSL,配置其端口,在产品模式下需要从CA获取私有密钥和数字证书,创建identity和trustkeystore,装载获得的密钥和数字证书。可以配置此SSL连接是单向还是双向的。

可以使用管理控制台,在它的Deployment中可以查看所有已发布的EJB

THE END
1.小伙用废弃的瓶子自制一个小发明,简直太聪明了85年越南求和,中国不予回复,一个月后邓小平宣布:裁军100万 兰熊熊双胞胎 美军女飞行员驾驶F35战机”旱地拔葱“真实影像,太可怕了 大国洞察局 5510跟贴 讲真,是球网先动手的!!! 新媒体 论背景音乐的重要性!! 新媒体 旁边有个抢活的…怎么办?人都过去了? 新媒体 多喝热水,热水治百病! 新媒体 58跟...https://m.163.com/v/video/VHG3C35OT.html
2.创意训练的50个方法文末我也会分享几个 我个人创意的小方法 ^?_?^ 1、确立价值观 奇怪的是,关于创意训练的第一个训练却不是训练创意的,而是对价值观的确立。这项训练的目的,是让你更清醒自已人生的方向,知道自己的创意该向何处集中,创意该用在哪里。 这个训练有ABC三个步骤: ...https://www.niaogebiji.com/article-18612-1.html
3.英语作文假如让你来发明一样东西,你想发明什么?为什么?它的用处...英语作文 假如让你来发明一样东西,你想发明什么?为什么?它的用处是什么? 下载作业帮APP学习辅导没烦恼 答案解析 结果1 举报 i wish i would invent a kind of machine which can help to deal with the rubbish.Because the environment has been badly polluted.it is difficult for us to breathe fresh air...https://qb.zuoyebang.com/xfe-question/question/f634da96c677ad8dd39c812177a13a9f.html
1.假如我是发明家的作文500字想象以上为假如我是发明家的作文500字 篇1范文内容,仅供参考借鉴,请按实际需要修改。 假如我是发明家的作文500字 篇2 当发明家多好呀!可以发明许多新鲜、好玩和方便人们的生活的东西。如果我是发明家该多好呀! 果我是发明家,我回发明一个“随意门”。一听名字就知道:这是一个可以去任何地方的门。只要你在屏幕上输...https://www.anhui365.net/521-12486200.html
2.科技小发明手工简单DIY智慧:创造生活便利的10个简单手工科技小发明 在日常生活中,许多小问题往往被视为无可奈何的事实。然而,通过一些简单的手工操作和创新思维,我们可以将这些看似琐碎的问题转化为解决方案,从而提升我们的生活品质。 智能家居控制器 利用阿拉法尔微控制器(Arduino)和智能手机APP,可以创建一个简单的家庭自动化系统,让你通...https://www.vzern3xsg.cn/shu-ma/438856.html
3.能让生活更简单的科技小发明是什么能让生活更简单的科技小发明是什么? 在这个快速变化的时代,科技日新月异,每一个新的小发明都可能改变我们的生活方式。特别是那些手工制作、设计简洁的创新产品,它们不仅能够解决我们日常生活中的实际问题,还能带来便捷和乐趣。本文将探讨一些利用简单手工方法创造出具有科技感的小发明,以及它们如何帮助我们使生活更加简...https://www.zuenw.cn/shou-ji/503558.html
4.科技小发明手工简单我也能做总之,不管是在日常生活还是在工作中,我们都可以发现许多机会去创造自己的小科技革新。只要保持好奇心,不断探索,就可能会意外发现一个又一个简易却又有效的小发明。而且,这些小発明往往还能够激励我们的创新思维,使我们更加积极地参与到社会发展进程中去。所以,无论你是学生还是职场人士,都不要忽视这些看似微不足道...https://www.czhrmaurw.cn/ke-ji/413102.html
5.我想发明的东西作文(通用21篇)我想发明的东西作文 篇4 时间过得飞快,一转眼,30年过去了,我已经成为一位有名的科学家,专门发明一些奇妙的未来的运动鞋,它们就放在我的高科技柜里,现在让我给你介绍一下这些神奇的运动鞋吧,它们都很有用。 我的运动鞋有个很有用的功能,就是老人穿着它,也可以很飞快地走到他要去的地方,如果老人想走得慢一...https://www.unjs.com/zuowenku/161677.html
6.日常生活朋友圈文案100条沙雕又可爱发朋友圈短句婚礼纪37.判断一个男孩的品味好坏,就跟他谈恋爱,如果他不肯,说明品味还可以。 38.如果夜里十二点我还回你消息 那么意味着什么 意味着我是真的很喜欢玩手机 39.和大家认识也挺久了 也没给过大家什么福利 不如这样吧 评论里留下你最想要的东西 然后你们自己攒钱去买 我监督你们 ...https://www.hunliji.com/bai_ke/detail_55702
7.如果我是一个发明家作文(通用29篇)在日常学习、工作和生活中,大家都经常看到作文的身影吧,作文是从内部言语向外部言语的过渡,即从经过压缩的简要的、自己能明白的语言,向开展的、具有规范语法结构的、能为他人所理解的外部语言形式的转化。那么,怎么去写作文呢?以下是小编整理的如果我是一个发明家作文,希望能够帮助到大家。 https://www.fwsir.com/fanwen/html/fanwen_20230420125430_2729826.html
8.[书摘]精进2:解锁万物的心智进化法51CTO博客那些表面看来天经地义的事情其实是错的。就像一件东西的制作工艺,其中很可能包含了绝大多数人想象不到的机巧和智慧,它们很可能就来自长期实践历程中涌现出来的若干次灵光一闪。如果你学会以这样一种视角去观察事物,那么你所能得到的,一定比别人要更多。 先是细致的观察,然后找到某一个关键性的线索,再反向推导出...https://blog.51cto.com/isLinXu/5527489
9.omofun入站问答答案大全omofun入站问答答案汇总1、只要是活着的东西,就算是神是也杀给你看"出自哪部番? 空之境界 2、道歉时露出胸部是常识"出自于哪部番? 令人讨厌的松子的一生 3、___将休刊一个月,理由是? 236话的"刺激"畑健二郎 4、《碧蓝之海》中乌龙茶的配方是? 90%伏特加+10%威士忌 ...https://m.ali213.net/news/gl2405/1403085.html
10.我自己的发明作文(精选62篇)多功能书包还有一个功能,能辨别真伪的功能,只要身边有那个坏人,这个多功能书包就会立即变成一个机器人,来捉捕这些坏人。 将来,我要把这种未来书包变成我自己发明的,我一定会! 我自己的发明作文 篇4 什么?眼睛近视了?戴眼镜吧!眼镜戴上了。可眼镜虽然让人看清了东西,却给人带来了不少麻烦。眼镜起雾了,眼镜有灰...https://www.ruiwen.com/zuowen/ziji/1064358.html
11.2018年下半年全国事业单位联考E类《职业能力倾向测验》试题B.我向你借100元,你只借了50元给我,还欠50元。但既然借了50元给我,于是我也欠你50元。由于各欠对方50元,所以我们扯平了,谁也不欠谁 C.一个秃头的男人对理发师说:“如果能够让我的头发看起来像你的一样,我就付给你1000块钱。”“没问题。”理发师一边回答,一边飞快地给自己剃了个光头 ...https://xizang.jinbiaochi.com/xzsydw/news_79700.html
12.2023年4月10日新书推荐–吉隆坡中华独立中学资源中心一个孩子在梦中,来到一座宮殿,一个女孩出来迎接他,介绍自己叫王小零,要带他参观她的零王国。这儿的公民都剔光头,你可以放心地与他们握手,但不能和他们拥抱;握手就像加号,你还是你自己,拥抱则像相乘,你就变成零王国的公民…… 从来没有读到过这样生动有趣的数学童话,这次算是读到了。 https://www.chonghwakl.edu.my/library/?p=7445
13.15条中国人不熟悉的投资理念如果你和伯克希尔股东处在一个境地:公司表现依旧出色,但股东却经受了一连串自己招致的伤害,失去了很多本来应得的投资回报,那么你可以听听巴菲特的说法:假如你和你自己的钱之间隔着一帮顾问,你将付出重大代价。 ★为了理解这个费用是如何膨胀的,让我们假设,所有美国公司一直都由一个家庭拥有,姑且称之为“想不通”。各...https://blog.csdn.net/weixin_30387799/article/details/97069995
14.专访任正非:华为不会"死",胜利一定属于我们(完整版)记者:就在当年2004年甚至更早的时候,中美关系一切正常,而且国际供应链一切正常,为什么您会预想假如这个世界不正常怎么办? 任正非:这个东西我这么讲,我们曾经是准备用一百亿美金,把这个公司卖给一个美国公司,因为我们大家都知道,我们再发展下去就和美国要碰撞,一定要去碰撞,因为卖给人家的时候,合同也签订了,所有手续办...https://www.jfdaily.com/news/detail?id=153522
15.我的发明作文15篇我们几个就找到了一棵树,每人打一次,看谁打到的次数最多,只要我瞄准一射出去就稳稳的插在了树上,由此可见,我的这项发明威力是如此的巨大。 怎么样,我的发明厉不厉害! 我的发明作文3 我想发明一个喷水门。 在黑黑的夜里,主人不在家。小偷儿来了,偷偷的把门锁撬开,拿走了家里值钱的东西。虽然报了警,但也很...https://www.cnfla.com/zuowen/2405146.html
16.高效的沟通技巧如果你想要表达自己的看法,又不想留下任何机会让人回应、争论、反驳或阐发,写博客去。 有个很好的理由来说明我的谈话里为什么不允许有“专家说教”:因为真的很无聊。你肯定不希望那样。你需要在进入每一次交流时都假定自己可以学习到一些东西。著名的治疗师M.斯科特·派克说过,真正的倾听需要把自己放在一边。有时候...https://www.jy135.com/zhichang/633886.html
17.幼儿园谜语在现实生活或工作学习中,用到谜语的地方还是很多的,谜语来源于中国古代民间,是古人集体智慧创造的,无法把谜语的发明权落实到某一个人。你知道都有哪些经典谜语吗?下面是小编为大家整理的幼儿园谜语,欢迎大家分享。 幼儿园谜语1 分类 通常所说的谜语包括“灯谜”和“语谜”两类。前者是书面的,后者是“口头”的,...https://www.wenshubang.com/miyu/2464649.html
18.假如我是发明家四年级想象作文(通用48篇)我就是这样的一个小男孩,一个满脑子充满稀奇古怪念头的男孩,我总在梦想中度过,我正在向我那伟大发明家的梦想迈进! 假如我是发明家四年级想象作文 篇4 为什么我想成为一名发明家?让我告诉你一件事。 因为发明家可以发明各种各样的东西,例如,一件既防火又防水的衣服,可以变成夏天或冬天穿的衣服,可以长出翅膀飞向...https://www.yuwenmi.com/zw/718652.html