java葵花宝典中的宝典!

葵花宝典之java

   一:面向对象的特征有哪些方面  

 

1. 抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

2. 继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

3. 封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

4. 多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

二:int 和 Integer 有什么区别

Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。

原始类型封装类booleanBoolean  charCharacter  byteByte  shortShort  intInteger  longLong  floatFloat  doubleDouble

引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。

break continue的区别:

break:跳出循环,不再执行剩余部分。

continue:停止当次循环,回到循环起始处,进入下一次循环操作。continue语句之后的语句将不在执行。

三:说出ArrayList,Vector, LinkedList的存储性能和特性

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

四:HashMap和Hashtable的区别。  

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

五:Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型  

六:abstract class和interface有什么区别?

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽象类的变体

在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

七:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型,这样子才可以正确的编译)  short s1 = 1; s1 += 1;(可以正确编译)

八:Math.round(11.5)等於多少? Math.round(-11.5)等於多少?  Math.round(11.5)==12  Math.round(-11.5)==-11  round方法返回与参数最接近的长整数,参数加1/2后求其floor.

九:String s = new String("xyz");创建了几个String Object?   

 两个一个是xyz,一个是sxyz的引用

十:接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。

十一:数组有没有length()这个方法? String有没有length()这个方法?数组没有length()这个方法,有length的属性。String有length()这个方法

十二:请说出你所知道的线程同步的方法。

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

十三:你所知道的集合类都有哪些?主要方法?

最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。 Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。

十四:char型变量中能不能存贮一个中文汉字?为什么? 

能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的

可能的解释为一个中文占16位,两个字节

十五:覆盖和重载

   覆盖:覆盖一个方法并对其重写,以求达到不同的做用!覆盖要注意一下几点:

1) 覆盖的方法标识必须要和被覆盖的方法标志完全匹配!

2) 覆盖方法的返回值必须和被覆盖方法的返回值一致!

3) 覆盖方法所抛得异常必须和被覆盖方法所抛得异常一致或者是其子类!

4) 被覆盖的方法不能为private,否则其子类只是定义了一个方法,并没有对其覆盖!

重写:定义一些名称相同的方法,通过传入参数的不同来区分这些方法,再调用                 时,会根据不同的参数样式来选择合适的方法执行!重载要注意一下几点:

1)在使用重载时只能通过不同的参数样式,如:不同参数类型、不同参数个数、不同参数顺序!

2)不能通过访问权限、返回类型、抛出异常来进行重载!

3)方法的异常类型和数目不会对重载构成影响!

4)对于继承来说,如果父类方法访问权限为private,那么就不能再子类对其重载,如果定义的话也只是定义一个新方法,而不会达到重载的效果

十六:java中的常用包

1)  java.applet:包含一些用于创建Java小应用程序的类。

2)  java.awt:包含一些用于编写与平台无关的图形界面(GUI)应用程序的类。

3)  java.io:包含一些用作输入输出(I/O)处理的类。

4)  java.lang:包含一些Java语言的基本类与核心类,如String、Math、Integer、System和Runtime,提供常用的功能,这个包中的所有类是被隐式导入的。

5)  java.net:包含用于建立网络连接的类,与java.io同时使用完成与网络有关的读写。

6)  java.util:包含一些实用工具类和数据结构类。

十七:String 和StringBuffer的区别

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。

十八:运行时异常与一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

十九:说出Servlet的生命周期,并说出Servlet和CGI的区别。

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

二十:EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。

    EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。

SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。

EntityBean被用来代表应用系统中用到的数据。

对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。

对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。

Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。

二十一:&和&&的区别。

 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。

二十二:Collection 和 Collections的区别。 

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

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

二十三:final, finally, finalize的区别。 

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

二十四:sleep() 和 wait() 有什么区别? 

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

二十五:error和exception有什么区别?

error 表示恢复不是不可能,但很困难的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

二十六:heap和stack有什么区别。

栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素

二十七:forward 和redirect的区别?

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。

二十八:forward 和redirect的区别

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。

二十九:EJB与JAVA BEAN的区别?

Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问EJB容器是EJB组件的代理EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。

三十:GC是什么? 为什么要有GC? 

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

三十一:Java有没有goto? 

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

三十二:启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须有退出的标志来停止的一个线程。

三十三:应用服务器有那些?

BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,jBossTomcat

三十五:接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。

三十六:说出数据连接池的工作机制是什么?

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

当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

三十八:数组有没有length()这个方法? String有没有length()这个方法?

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

三十九:是否可以继承String类?

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

四十:swtich是否能作用在long上,是否能作用在String上?

switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char byte。long,string 都不能作用于swtich

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

四十二:编程题: 用最有效率的方法算出2乘以8等於几? 2 << 3

在VC++中运行这个就可得到16,最好的方法

#include<stdio.h>

void main(){

printf("%d",2<<3);

}

2<<3移位,也可在JAVA正确的运行

四十三:两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

不对,有相同的hash code。

如果两个值相等,那么equals()方法相等,表示两个方法的对像相等,这表示,引用的对像的地址相等,这样就有相同的hashcode

四十四:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 

是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

四十五:Java中的异常处理机制的简单原理和应用。

当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况 一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Throwable的子类

四十六:垃圾回收的优点和原理。并考虑2种回收机制

Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收标记垃圾回收增量垃圾回收

四十七:char型变量中能不能存贮一个中文汉字?为什么? 

能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的

可能的解释为一个中文占16位,两个字节

四十八:多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 ,同步的实现方面有两种,分别是synchronized,waitnotify

四十九:线程的基本概念、线程的基本状态以及状态之间的关系:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。Java中的线程有四种状态分别是:就绪,运行、挂起、结束。 

五十:简述synchronized和java.util.concurrent.locks.Lock的异同 ?

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

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

五十一:EJB的角色和三个对象

一个完整的基于EJB的分布式计算结构由六个角色组成,这六个角色可以由不同的开发商提供,每个角色所作的工作必须遵循Sun公司提供的EJB规范,以保证彼此之间的兼容性。这六个角色分别是EJB组件开发者(Enterprise Bean Provider) 、应用组合者(Application Assembler)、部署者(Deployer)、EJB 服务器提供者(EJB Server Provider)、EJB 容器提供者(EJB Container Provider)、系统管理员(System Administrator)。

三个对象是Remote(Local)接口、Home(LocalHome)接口,Bean类

五十二:请对以下在J2EE中常用的名词进行解释(或简单描述)

web容器:

给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。

EJB容器:

Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口获得系统级别的服务。例如邮件服务事务管理JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

五十三:JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,final分别代表什么意义?在try块中可以抛出异常吗?

Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口

在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,

调用这个对象的方法可以捕获到这个异常并进行处理。

Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。

一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,

这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。

用try来指定一块预防所有“异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的“异常”的类型。

throw语句用来明确地抛出一个“异常”。throws用来标明一个成员函数可能抛出的各种“异常”

Finally为确保一段代码不管发生什么“异常”都被执行一段代码。可以在一个成员函数调用的外面写一个try语句,

在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,“异常”的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种“异常”进行处理,堆栈就会展开,直到遇到有处理这种“异常”的try语句。

五十四:排序都有哪几种方法?请列举。用JAVA实现一个快速排序。

排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)

快速排序的伪代码。/ /使用快速排序方法对a[ 0 :n- 1 ]排序,从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点,

把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点,递归地使用快速排序方法对left 进行排序,递归地使用快速排序方法对right 进行排序,所得结果为l e f t + m i d d l e + r i g h t。

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

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

五十六:MVC的各个部分都有那些技术来实现?如何实现? 

MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用

五十七:java中实现多态的机制是什么?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。

五十八:什么是java序列化,如何实现java序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。

可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。

序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,

implements Serializable只是为了标注该对象是可被序列化的,

然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,

接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

五十九:说出一些常用的类,包,接口,请各举5个

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

常用的包:java.lang  java.awt  java.io  java.util  java.sql;

常用的接口:Remote  List  Map  Document  NodeList 

六十: 编写 java文件的注意事项?

在记事本中编写java文件,在保存时一定要把文件名和扩展名用双引号括起来,否则将默认保存为文本文件,如果要保存的java 文件名为Program1.java,则在保存时在文件名文本框中一定要输入”Program1.java”

六十一:如何编译java程序?

单击开始|运行命令,在命令行上输入cmd,按回车键(在 window98中输入command,按回车键),即可打开一个命令窗口,将目录转换到编写java源程序所在的目录,输入javac filename.java

六十二:如何执行java程序?

同样在命令窗口中输入java filename

六十三:什么是类与对象?

所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。

类是具备某些共同特征的实体的集合,它是一种抽象的概念,用程序设计的语言来说,类是一种抽象的数据类型,它是对所具有相同特征实体的抽象。

六十四:属性与方法?

不同对象具有相同特点,就可能抽象为一定的类,那么这些特点基本上可以分为两类,一类是描述对象静态状态的,就是对象的属性,在程序设计中,可以称之为变量;另一类是描述对象的动作,就是对象的方法,在程序设计中我们称之为函数。属性和方法是一个对象所具备的两大基本要素,也是我们后面编程工作的核心。

六十五:什么是封装?

只要有足够的方法,就没必要直接去操作对象属性,只要调用这些方法就可以实现要完成的任务,这种现象称为封装,它通过对象方法对其属性的操作把对象属性封装在一个对象内部,对象与外界打交道全部通过其自身的方法来实现,有效的把对象属性隐藏在对象内部。

葵花宝典之jsp

Servlet的生命周期

Servlet的生命周期就是Servlet从创建出实例对象到其销毁的过程。

Servlet是一个容器,它负责创建实例来接受客户端的请求,并且以多线程的方式响应给客户。

Servlet生命周期之中一共经历了5各阶段:

类的加载

     2 实例化(创建servlet实例对象)

     3 初始化(调用init()方法)         

4服务(调用service()方法,根据客户请求方式选择用doGet()doPost()方法)            5 Servlet销毁(调用destroy()方法)

注意: Servlet在其整个生命周期中只创建了一个对象!!!

ServletJSP的区别:

JSP是 Servlet的扩展

由于JSP转译之后才变成Servlet,所以Servlet的速度比JSP

(3)JSP的本质还是Servlet

HTTP协议:

1.HTTP协议(Hypertext Transfer Protocol)超级文本传输协议;

2.HTTP的请求格式:

总共分为三部分:

请求方法,URL,HTTP协议的版本

请求头(request Header

请求正文(request Content

3.HTTP的请求方式

1get

2post

一:JavaBean的标准动作

<jsp:usebean>创建JavaBean的对象

<jsp:setProperty>设置对象的属性

<jsp:getProperty>获得对象的属性的值

<jsp:include>把另一个jsp页面嵌入到本页面

<jsp:forward>把用户请求转发到其它页面

二:静态包含<%@ include>与动态包含<jsp:include>的区别

<%@ include  file=”date.jsp” %>

include编译指令是在jsp程序的转换时候将file属性所指定的内容嵌入,然后再编译

只生成一个class文件

Include不能带参数

同一个request对象

<jsp:include  page=”date.jsp” flush=”true”>

include指令在转换时候不会被编译,只有在客户端请求时才会被动态的编译载入

<jsp:include>可带参数

不同的request对象,可以取得包含它的页面的参数并添加了自己的参数

三:Sendredirect 和forward的区别

Sendredirect 

Forward 

是不同的request

虽是不同对象,但是可取到上个页面的内容

Send后的语句可以执行,除非return

Forward后的内容不会继续发送给客户端

需要到客户端的往返,可以转到任何页面

服务器内部转换

地址栏有变化

地址栏没有变化

可以传参数,直接跟在URL后面

不可传参

四:JavaBean的优点

可被多个页面重用

可以在多个应用程序中使用

可以跨平台

五:JavaBean的范围

 JavaBeanscope属性,scope属性决定了JavaBean对象存在的范围

page:表示页面的范围;它是scope属性的默认值

request:表示请求范围:(服务器端响应一次客户请求的过程,从servlet容器接受一个客户请求开始,到返回响应结果结束)

session:表示会话范围(session的生命的周期及会话范围)

application:表示在web应用范围

六:web.xml顺序

<WEB-APP>:web应用的根元素

<display-name>web应用的名字

<discription>:对web应用的描述

<filter>:定义过滤器

<filter-mapping>为过滤器指定URL映射

<servlet>定义servlet

<sevlet-mapping>servlet指定URL映射

<session-config>配置http会话

<welcome-file-list>设置web应用的welcome文件清单

<taglib>声明引用标签

<resource-ref>声明引用的jndi资源

<security-constraint>配置安全约束

<login-config>配置安全验证登陆

<security-role>配置安全角色

七:EL表达式

1EL表达式语言中隐含的对象

applicationScope:把web应用范围内的属性名和属性值进行映射

cookie:把客户请求中的cookie名和cookie对象进行映射

headerHTTP请求头部的项目名和项目值进行映射

headerValues:把HTTP请求头部的项目名和所有匹配的项目值的数组进行映射

initparam:把web应用的初始化参数名和参数值进行映射

pageContext:表示javax.servlet .jsp.PageContext对象

pageScope:把页面范围内的属性名和属性值进行映射

param:把客户请求中的请求参数名和参数值进行映射

paramValues:把客户请求中的请求参数名和所匹配的参数值数组进行映射

requestScope:把请求范围的属性名和属性值进行映射

sessionScope:把会话范围内的属性名和属性值进行映射

2EL中的表示特定范围

pageScoperequestScopesessionScopeapplicationScope

3)表示HTTP请求中的特定数据

HeaderheaderValuesparamparamValues

表示pageContext对象

${pageContext.servletContext}

${pageContext.request}

${pagecontext.response}

${pagecontext.session}

表示web应用的初始化参数的集合

${initParam.driver}

EL表达式里面无法直接访问jsp文件中的隐含对象必须例如${pageContext.request.requestURL}

八:自定义jsp标签

1.Servlet容器得到了Tag对象后会通过下面的步骤

Servlet容器调用Tag对象的setPageContext()setParent()方法,把当前jsp页面的PageContext对象及父标签处理对象传给当前Tag。如果不存在父标签,把父标签处理对象设为null

Servlet容器调用Tag对象的一系列set方法,设置Tag对象的属性。如果标签没有属性,则不需要这个步骤

Servlet容器调用Tag对象的doStartTag()方法

如果doStartTag()方法返回Tag.skip_body就不执行标签主体内容,如果doStartTag()方法返回Tag.EVAL_BODY_INCLUDE,就执行标签主体内容

Servlet容器调用Tag对象的doEndTag()方法

如果doEndTag方法返回Tag.SKIP_PAGE,就不执行标签后面的jsp代码。如果doEndTag方法返回Tag.EVAL_PAGE

2.Servlet容器得到IterationTag对象后,会调用下面的方法

1)Servlet容器调用IterationTag对象的setPageContext()setParent()方法,把当前的jsp页面的PageContext对象及父标签处理对象传给当前IterationTag对象,如果不存在父标签,则把父标签处理对象设为NULL

2)servlet容器调用IterationTag对象一系列的set方法,设置IterationTag对象的属性。如果没有标签,则没有这个步骤

3)Servlet容器调用IterationTag对象的doStartTag方法;

4)如果doStartTag()方法返回Tag.skip_body就不执行标签主体内容,如果doStartTag()方法返回Tag.EVAL_BODY_INCLUDE,就执行标签主体内

5)如果执行了标签主体的内容,那么就调用doAfterBody方法

6)如果doAfterBody放回Tag.SKIP_BODY,就不再执行标签的主体内容如果返回Tag.EVAL_BODY_AGAIN,就继续重复执行标签的主体的内容

7)Servlet容器调用IterationTag对象的doEndTag()方法

8) 如果doEndTag方法返回Tag.SKIP_PAGE,就不执行标签后面的jsp代码。如果doEndTag方法返回Tag.EVAL_PAGE

九:JSTL语言:

JSTL标签库包含五个不同的标签库

标签库名

前缀

URL

描    述

Core

c

http://java.sun.com/jsp/jstl/core

核心标签库,包括一般用途,条件,迭代和URL相关的标签

I18N

fmt

http://java.sun.com/jsp/jstl/fmt

国际化web应用标签,以及日期,时间,数字格式化的标签

Sql

sql

http://java.sun.com/jsp/jstl/sql

访问关系数据库

Xml

x

http://java.sun.com/jsp/jstl/xml

包含对xml文档进行操作的标签

Function

fn

http://java.sun.com/jsp/jstl/function

包含一组通用的el函数,el表达式中可以应用这些el函数

十:JSTL Core标签库

1.一般用途的标签

<c:out>:把一个表达式的结果打印到网页上

<c:set>:设置命名变量的值。如果命名变量为JavaBean,还可以设置JavaBean的属性的值;如果命名变量为map类型,还可以设置与其中的key对应的值

<c:remove>:删除一个命名变量

<c:catch>:用于捕获异常,并把异常对象放在指定的命名变量中

2.条件标签

<c:if>:相当于java中的if语句

<c:choose>,<c:when><c:otherwise>相当于java中的if-alse语句

<c:choose>

<c:when>IF

</c:when>

<c:when>ELSE IF

</c:when>

<c:otherwise>ALSE

</c:otherwise>

</c:choose>

3.迭代标签

<c:foreach>:用于遍历集合对象,并且能重复执行标签主体

<c:forTokens>:用于遍历字符串中用特定分隔符分割的子字符串,并且能重复执行标签主体

4.URL相关标签

<c:import>包含其他web资源相当于<jsp:include>指令的作用

<c:url>按照特定的重写规则重新构造url

<c:redirect>:负责重定向

5.JSTL 国际化标签

<fmt:setLocale>设置locale,把locale保存到特定的范围内

<fmt:setBundle>设置ResourceBundle,把ResourceBundle保存到特定范围内

<fmt:bundle>设置标签主体使用的ResourceBundle

<fmt:message>根据属性key返回ResourceBundle中匹配的消息文本

<fmt:param>为消息文本中的消息参数设置值

<fmt:requestEncoding>:设置Http请求正文使用的字符编码

6.JSTL 格式化标签

<fmt:setTimeZone>:设置时区,把时区保存到特定的范围

<fmt:timeZone>:设置标签主体使用的时区

<fmt:formartNumber>:格式化数字

<fmt:parseNumber>解析被格式化的字符串类型的数字

<fmt:formartDate>格式化日期和时间

<fmt:parseDate>解析被格式化的字符串类型的日期和时间

7.SQL标签库

<sql:setDateSource>设置数据源

<sql:query>执行SQL select语句

<sql:param>SQL语句中的?表示的参数赋值

<sql:dateparam>SQL语句中的?表示的日期或时间类型参数赋值

<sql:update>执行SQL insertupdatedelete语句,以及执行SQL DDL

<sql:transaction>:声名数据库事务

              会话跟踪机制

十一:会话跟踪技术主要包括:Cooike、session、影藏表单域、重写url。

Cookie会话:

创建Cookie:

Cookie cookie = new Cookie(“name”,”Tom”);

Cookie对象添加到HTTP响应中:

Response.addCookie(cookie);

读取客户端Cookie:

Cookie[] cookies = request.getCookie();

例子:

Cookie cookie = new Cookie("name","value");

response.addCookie(cookie);

Cookie cookie = null;

Cookie[] cookies = request.getCookies();

if (cookies != null)

{

    out.println(“<h2>找到的每个 cookie 的名称和值</h2>");

    for (int i = 0; i < cookies.length; i++)

    {

        cookie = cookies[i];

        cookie.getName();

        cookie.getValue();

    }

Session会话:

获取session:

HttpSession session = request.getSession();

添加:

Session.setAttribute(“name”,”tom”);

   RequestDispatcher rd= request.getRequestDispatcher(“/跳转的路径”);

rd.forword(request,response);

然后在跳转的页面上通过:

session.getAttribute(“name”);来获得值。

十二:隐藏表单域

将会话跟踪字段的隐藏表单域添加到 HTML 页面,但是不会

显示在客户端浏览器中。如:

<form action = “/firsthtml.jsp” method=”POST”>

<input type = hidden” name=“userid” value=“zhangsan”>

</form>

十三:.URL重写

URL(统一资源定位) 重写技术将一个唯一的会话 ID 添加到 

URL 结尾,以标识该会话。例如,重写以下 URL 传递会话 ID:10

原始 URLhttp://server:post/servlet/Rewritten

用附加信息重写的 URL

http://server:post/servlet/Rewritten/10

用添加的参数重写的 URL

http://server:post/servlet/Rewritten?sessionid=10

用自定义修改重写的 URL

http://server:post/servlet/Rewritten;$sessionid$10

十四:Jsp页面的构成元素

(1)静态模版:静态模版由HTML,CSS,JavaScript等静态网页元素组成;

(2)指令:指令主要用来提供整个Jsp网页相关的信息,并且用来设定Jsp页面的相关属性。如:<%@......%>中的内容就是Jsp指令。

在Jsp中两个最重要的指令是:page指令,include指令

page 指令用于设置 JSP 页面的属性,主要属性有:language(声明脚本语言的种类,目前只能为java);import(用于导入一个或多个包,同时导入多个java包时中间用“,”隔开);session(表示是否允许session会话,其值默认为true),buffer(设置缓冲区大小,默认是8kb);autoFlush(是否刷新缓冲区);isThreadSafe(设置Jsp文件是否能多线程使用);errorPage(指定接收Exception对象的Jsp页面的URL);isErrorPage(设置当前页面是否是一个error页面,是否接受一个Exception对象);contentType(设置页面类型和字符集,默认是”text/html;charset=ISO-8859-1”)。

include 指令用于在运行时将 HTML文件或 JSP页面嵌入到另一个 JSP页面, include 指令语法<%@ include file = ”文件名” %>

(3)表达式:表达式元素表示的事一个在脚本语言中被定义的表达式,在运行后被自动转化为字符串,然后插入到这个表达式在Jsp文件的位置显示。如<%=java表达式%>

(4)也叫Java Scriptlet,就是在Jsp中写在<%与%>之间的Java代码

(5)声明:在Jsp中声明函数或者方法。如<%!......%>

(6)动作: Jsp动作利用XML语法格式的标记来控制web服务器引擎的行为。利用Jsp动作可以动态地插入文件,重用JavaBean组件,把用户重定向到另外的页面,为java插件生成HTML代码。

(7)注释:就是Jsp页面中的注释

(a):由于Jsp页面中可以写入java代码,那么在java代码中的注释遵循java注释规范://表示单行注释;/*…*/表示多行注释

在Jsp的非JavaScript中,注释有分为两种

    (b):在HTML中的注释为<!--注释-->

(c):Jsp 服务器端注释:<%--注释--%>

(二)请求转发和重定向

请求转发:request.getRequestDispatcher(“/xx.jsp”).forward(request,response); 其特点是:地址栏无变化,始终是一个请求,转发的对象可以使本工程内的任何页面。

重定向:就相当于客户端向服务器请求时,服务器响应给客户端一个新的URL浏览器就把请求传递个一个新的页面

特点是:地址发生了变化,重定向的范围没有限制。

十五:JDBC

1.JDBC编程涉及的三个部分

1)应用程序: 开发人员编写的客户端程序。在应用程序中调用JDBC API,将SQL语句发送到数据库并检索结果。

2)驱动程序管理器 :JDBC将驱动程序管理器负责使用正确的JDBC驱动程序和连接信息访问数据库,在Java应用程序和数据库系统之间建立连接。

3)驱动程序:驱动程序由数据库厂商提供,实现数据库驱动接口,能够把SQL指令正确的发送的数据库服务器。

2JDBC的使用步骤

   注册:DriverManager.registerDriver(driver);一般不使用。

加载:Class.forName(driver); driver:有效JDBC驱动程序名称。

   连接:Connection con = DriverManager.getConnection(URL,login_name, login_password)

          url:连接路径,login_name:数据库登陆账户名,login_passwoer:登陆密码。

3.关于JDBC编程的重要类和接口

DriverManager类,Connection接口,Statement接口,PreparedStatement接口,ResultSet接口,SQLException

一, DriverManager类  管理一组 JDBC 驱动程序的基本服务。

          最常用的方法

getConnection(String urlString user,String password) 试图建立到给定数据库 URL 的连接。

二,Connection 接口

与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。 

Connection 对象的数据库能够提供描述其表、所支持的 SQL 语法、存储过程、此连接功能等等的信息。

常用的方法

1createStatement()创建一个 Statement 对象来将 SQL 语句发送到数据库。

2prepareStatement(String sql) 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。

3close() 立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。

三,Statement接口定义了一组数据库操作的方法,可以通过这个接口的实现类对象执行指定的SQL命令,Connection.createStatement()方法可以得到Statement类型的对象。

Statement方法常用的方法有:

1)executeUpdate(sql) 返回Int类型,执行给定 SQL 语句,该语句可能为 INSERTUPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句。

2)executeQuery(sql) 返回单个 ResultSet 对象,执行给定的 SQL 语句,通常为静态 SQL SELECT 语句。

例如ResultSet rs =

 DriverManager.getConnection(url,name,pwd).createStatemet.executeQuery(sql);

(3)execute();执行SQL语句,返回Boolean类型,可能返回多个结果。execute 方法执行 SQL 语句并指示第一个结果的形式。然后,必须使用方法 getResultSet 或 getUpdateCount 来获取结果,使用 getMoreResults 来移动后续结果。

 (4)close() 立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。

四,PreparedStatement接口是Statement的子接口,扩展了Statement的功能,通过Connection.preparedStatament()方法获得PreparedStatement对象。

PreparedStatement接口使我们可以使用占位符(?)作为参数定义一条SQL语句,占位符是在SQL语句中出现的标记符,在SQL语句执行之前会被替换成实际的值。

常用方法:

(1) int executeUpdate(sql) 执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation LanguageDML)语句,比如 INSERTUPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句。

(2) ResultSet executeQuery()并返回该查询生成的 ResultSet 对象

(3) boolean execute()在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。(4) setString(int parameterIndex, String x) 将指定参数设置为给定 Java String 值。

(5) setInt(int parameterIndex, int x)将指定参数设置为给定 Java int 值。

五, ResultSet接口 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

       ResultSet接口的常用方法:

(1) close()立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。

(2) next()将光标从当前位置向前移一行。

(3) first()将光标移动到此 ResultSet 对象的第一行。

(4)last()将光标移动到此 ResultSet 对象的最后一行。

(5)getMetaData()获取此 ResultSet 对象的列的编号、类型和属性。

(6)getMetaData().getColumnCount()得到元素个数

(7)getMetaData().getColumnName(i)得到元素名称

(8)getString(int columnIndex) Java 编程语言中 String 的形式获取此 ResultSet 对象的当前行中指定列的值。

        (9)getInt(int columnIndex) 以 Java 编程语言中 int 的形式获取此 ResultSet 对象的当前行中指定列的值。

……….等等。

六,SQLException

如果发生数据库访问错误,或者是已经关闭的对象上使用一些方法就会产生异常,此时需要使用try/catch进行处理或者是将其thow掉。

4DriverManagerConnectionStatementPreparedStatementResultSet之间的关系???

DriverManeger类通过getConnection()方法获得Connection对象,

Connecton接口通过CreateStatement()方法获得Statement对象,

通过preparedStatement()方法获得PreparedStatement对象,

StatementPreparedStatement接口通过executeQuery()方法获得ResultSet对象。

5JDBC调用数据库的基本步骤

导入必要的类,装入JDBC驱动程序,识别数据源,分配一个Connection对象,分配一个Statement对象,使用Statement执行一个查询,从返回的ResultSet对象中检索数据,关闭ResultSet,关闭Statement对象,关闭Connection对象

十六:Servlet接口中的方法

1public void init(ServletConfig config) throws ServletException;

Servlet引擎会在Servlet实例化之后,置入服务之前精确地调用init方法。在调用service方法之前,init方法必须成功退出。

2public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException;

Servlet引擎调用这个方法以允许Servlet响应请求。这个方法在Servlet未成功初始化之前无法调用。在Servlet被初始化之前,Servlet引擎能够封锁未决的请求。

3public void destroy();当一个Servlet被从服务中去除时,Servlet引擎调用这个方法。

4public ServletConfig getServletConfig()

返回一个ServletConfig对象,作为一个Servlet的开发者,你应该通过init方法存储ServletConfig对象以便这个方法能返回这个对象。为了你的便利,GenericServlet在执行这个接口时,已经这样做了。

5public String getServletInfo();

允许Servlet向主机的Servlet运行者提供有关它本身的信息。返回的字符串应该是纯文本格式而不应有任何标志(例如HTMLXML等)。

十七:Servlet与CGI的区别?

cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。在功能上,ServletCGINSAPI有点类似,但是,与他们不同的是:Servlet具有平台无关性。

Servlet具有平台无关性。

十八:Servlet与applets不同的地方是

它不运行在

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值