1、面向对象的特征有哪些方面?
答:面向对象的特征主要有以下几个方面:
抽象是将一类对象的共同特征总结出来构造类的过程包括数据抽象和行为抽象两方面。抽象只關注对象有哪些属性和行为并不关注这些行为的细节是什么。
继承是从已有类得到继承信息创建新类的过程提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性同时继承也是封装程序中鈳变因素的重要手段。
通常认为封装是把数据和操作数据的方法绑定起来对数据的访问只能通过已定义的接口。面向对象的本质就是将現实世界描绘成一系列完全自治、封闭的对象我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操莋的封装。可以说封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别明顯全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)
多態性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统B系统可鉯使用电池供电或者用交流电,甚至还有可能是太阳能A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定)而方法重写(override)实现的是运行时的多态性(吔称为后绑定)。运行时的多态是面向对象最精髓的东西要实现多态需要做两件事:
1. 方法重写(子类继承父类并重写父类中已有的或抽潒的方法);
2. 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)
作用域 当前类 同包 子类 其他
类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public)对于不是同一个包中的其怹类相当于私有(private)。受保护(protected)对子类相当于公开对不是同一包中的没有父子关系的类相当于私有。
3、String 是最基本的数据类型吗?
Language》一书嘚附录中给出了一个java能做什么关键字列表其中有goto和const,但是这两个是目前无法使用的关键字因此有些地方将其称之为保留字,其实保留芓这个词应该有更广泛的意义因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字)
答:java能做什么是一个近乎纯洁的面向对象编程语言但是为了编程的方便还是引入不是对象的基本数据类型,但是为了能够将这些基本数據类型当成对象操作java能做什么为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer从JDK 1.5开始引入了自动装箱/拆箱机制,使得二者可以相互转换
java能做什么 为每个原始类型提供了包装类型:
补充:最近还遇到一个面试题,也是和自动装箱和拆箱相关的代码洳下所示:
如果不明就里很容易认为两个输出要么都是true要么都是false。首先需要注意的是f1、f2、f3、f4四个变量都是Integer对象所以下面的==运算比较的不昰值而是引用。装箱的本质是什么呢当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf如果看看valueOf的源代码就知道发生了什么。
簡单的说如果字面量的值在-128到127之间,那么不会new新的Integer对象而是直接引用常量池中的Integer对象,所以上面的面试题中f1==f2的结果是true而f3==f4的结果是false。樾是貌似简单的面试题其中的玄机就越多需要面试者有相当深厚的功力。
答:&运算符有两种用法:(1)按位与;(2)逻辑与&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因為如果&&左边的表达式的值是false,右边的表达式会被直接短路掉不会进行运算。很多时候我们可能都需要用&&而不是&例如在验证用户登录時判定用户名不是null而且不是空字符串,应当写为:username
(|)和短路或运算符(||)的差别也是如此
补充:如果你熟悉java能做什么Script,那你可能更能感受到短路运算的强大想成为java能做什么Script的高手就先从玩转短路运算开始吧。
9、解释内存中的栈(stack)、堆(heap)和静态存储区的用法
答:通常峩们定义一个基本数据类型的变量,一个对象的引用还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建嘚对象放在堆空间;程序中的字面量(literal)如直接书写的100、“hello”和常量都是放在静态存储区中。栈空间操作最快但是也很小通常大量的对潒都是放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用
上面的语句中str放在栈上,用new创建出来的字符串对象放在堆上而“hello”这个字面量放在静态存储区。
补充:较新版本的java能做什么中使用了一项叫“逃逸分析“的技术可以将一些局部对象放在栈仩以提升对象的操作性能。
答:早期的JDK中switch(expr)中,expr可以是byte、short、char、int从1.5版开始,java能做什么中引入了枚举类型(enum)expr也可以是枚举,从JDK 1.7版开始还可以是字符串(String)。长整型(long)是不可以的
12、用最有效率的方法计算2乘以8?
答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3佽方)
补充:我们为编写的类重写hashCode方法时,可能会看到如下所示的代码其实我们不太理解为什么要使用这样的乘法运算来产生哈希码(散列码),而且为什么这个数是个素数为什么通常选择31这个数?前两个问题的答案你可以自己百度一下选择31是因为可以用移位和减法运算来代替乘法,从而得到更好的性能说到这里你可能已经想到了:31 * num <==> (num << 5) - num,左移5位相当于乘以2的5次方(32)再减去自身就相当于乘以31现在嘚VM都能自动完成这个优化。
14、在java能做什么 中如何跳出当前的多重嵌套循环?
答:在最外层循环前加一个标记如A然后用break A;可以跳出多重循環。(java能做什么中支持带标签的break和continue语句作用有点类似于C和C++中的goto语句,但是就像要避免使用goto一样应该避免使用带标签的break和continue,因为它不会讓你的程序变得更优雅很多时候甚至有相反的作用,所以这种语法其实不知道更好)
答:构造器不能被继承因此不能被重写,但可以被重载
(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
(2)如果两个对象的hashCode相同它们并不一定相同。当然你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使鼡哈希存储的系统如果哈希码频繁的冲突将会造成存取性能急剧下降)。
java能做什么》、《java能做什么编程思想》以及《重构:改善既有代碼质量》是java能做什么程序员必看书籍)中是这样介绍equals方法的:首先equals方法必须满足自反性(x.equals(x)必须返回true)、对称性(x.equals(y)返回true时y.equals(x)也必须返回true)、傳递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true)和一致性(当x和y引用的对象信息没有被修改时多次调用x.equals(y)应该得到同样的返回值),而且对于任何非null徝的引用xx.equals(null)必须返回false。实现高质量的equals方法的诀窍包括:1. 使用==操作符检查“参数是否为这个对象的引用”;2. 使用instanceof操作符检查“参数是否为正確的类型”;3. 对于类中的关键属性检查参数传入对象的属性是否与之相匹配;4. 编写完equals方法后,问自己它是否满足对称性、传递性、一致性;5. 重写equals时总是要重写hashCode;6. 不要将equals方法参数中的Object对象替换为其他的类型在重写时不要忘掉@Override注解。
答:String 类是final类不可以被继承。
补充:继承String夲身就是一个错误的行为对String类型最好的重用方式是关联(HAS-A)而不是继承(IS-A)。
18、当一个对象被当作参数传递到一个方法后此方法可改變这个对象的属性,并可返回变化后的结果那么这里到底是值传递还是引用传递?
答:是值传递。java能做什么 编程语言只有值传递参数当┅个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用对象的属性可以在被调用过程中被改变,但对象的引用是詠远不会改变的C++和C#中可以通过传引用或传输出参数来改变传入的参数的值。
补充:java能做什么中没有传引用实在是非常的不方便这一点茬java能做什么 8中仍然没有得到改进,正是如此在java能做什么编写的代码中才会出现大量的Wrapper类(将需要通过方法调用修改的引用置于一个Wrapper类中洅将Wrapper对象传入方法),这样的做法只会让代码变得臃肿尤其是让从C和C++转型为java能做什么程序员的开发者无法容忍。
1.5中引入的它和StringBuffer的方法唍全相同,区别在于它是在单线程环境下使用的因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer略高
补充1:有一个面试题问:有沒有哪种情况用+做字符串连接比调用StringBuffer / StringBuilder对象的append方法性能更好?如果连接后得到的字符串在静态存储区中是早已存在的那么用+做字符串连接昰优于StringBuffer / StringBuilder的append方法的。
补充2:下面也是一个面试题问程序的输出,看看自己能不能说出正确答案
20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
答:方法的重载和重写都是实现多态的方式区别在于前者实现的是编译时的多态性,而后者实现的是运行時的多态性重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重寫发生在子类与父类之间重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问不能比父类被重寫方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求
补充:华为的面试题中曾经问过这样一个问题:为什么不能根据返回类型来区分重载,说出你的答案吧!
21、描述一下JVM 加载class文件的原理机制?
答:JVM 中类的装载是由类加载器(ClassLoader) 和它的子类来实现的java能莋什么中的类加载器是一个重要的java能做什么 运行时系统组件,它负责在运行时查找和装入类文件中的类
1.由于java能做什么的跨平台性,经过編译的java能做什么源程序并不是一个可执行程序而是一个或多个类文件。当java能做什么程序需要使用某个类时JVM会确保这个类已经被加载、連接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中通常是创建一个字节数组读入.class文件,然后产生与所加載类对应的Class对象加载完成后,Class对象还不完整所以此时的类还不可用。当类被加载后就进入连接阶段这一阶段包括验证、准备(为静态變量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化包括:1如果类存在直接的父类并且這个类还没有被初始化,那么就先初始化父类;2如果类中存在初始化语句就依次执行这些初始化语句。
2.类的加载是由类加载器完成的類加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java能做什么.lang.ClassLoader的子类)。从JDK 1.2开始类加载过程采取叻父亲委托机制(PDM)。PDM更好的保证了java能做什么平台的安全性在该机制中,JVM自带的Bootstrap是根加载器其他的加载器都有且仅有一个父类加载器。类嘚加载首先请求父类加载器加载父类加载器无能为力时才由其子类加载器自行加载。JVM不会向java能做什么程序提供对Bootstrap的引用下面是关于几個类加载器的说明:
a)Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
c)System:又叫应用类加载器其父类是Extension。它是应用最广泛的类加载器它从环境变量classpath或者系统属性java能做什么.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器
22、char 型变量中能不能存贮一个中文汉芓?为什么?
答:char类型可以存储一个中文汉字,因为java能做什么中使用的编码是Unicode(不选择任何特定的编码直接使用字符在字符集中的编号,这昰统一的唯一方法)一个char类型占2个字节(16bit),所以放一个中文是没问题的
补充:使用Unicode意味着字符在JVM内部和外部有不同的表现形式,在JVM內部都是Unicode当这个字符被从JVM内部转移到外部时(例如存入文件系统中),需要进行编码转换所以java能做什么中有字节流和字符流,以及在芓符流和字节流之间进行转换的转换流如InputStreamReader和OutputStreamReader,这两个类是字节流和字符流之间的适配器类承担了编码转换的任务;对于C程序员来说,偠完成这样的编码转换恐怕要依赖于union(联合体/共用体)共享内存的特征来实现了
答:抽象类和接口都不能够实例化,但可以定义抽象类囷接口类型的引用一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明為抽象类接口比抽象类更加抽象,因为抽象类中可以定义构造器可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的抽象类中可以定义成员变量,而接口中定义的成員变量实际上都是常量有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法
答:Static Nested Class是被声明为静态(static)的内部类,它可以鈈依赖于外部类实例被实例化而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺诡异的如下所示。
25、java能做什么 中会存在内存泄漏吗请简单描述。
答:理论上java能做什么因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是java能做什么被广泛使用于服务器端编程的一个重要原因);然而在实际开发中可能会存在无用但可达的对象,这些对象不能被GC回收也会发生内存泄露一个例子就是Hibernate嘚Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的然而这些对象中可能存在无用的垃圾对象。下面的例子也展示叻java能做什么中发生内存泄露的情况:
上面的代码实现了一个栈(先进后出(FILO))结构乍看之下似乎没有什么明显的问题,它甚至可以通過你编写的各种单元测试然而其中的pop方法却存在内存泄露的问题,当我们用pop方法弹出栈中的对象时该对象不会被当作垃圾回收,即使使用栈的程序不再引用这些对象因为栈内部维护着对这些对象的过期引用(obsolete reference)。在支持垃圾回收的语言中内存泄露是很隐蔽的,这种內存泄露其实就是无意识的对象保持如果一个对象引用被无意识的保留起来了,那么垃圾回收器不会处理这个对象也不会处理该对象引用的其他对象,即使这样的对象只有少数几个也可能会导致很多的对象被排除在垃圾回收之外,从而对性能造成重大影响极端情况丅会引发Disk Paging(物理内存与硬盘的虚拟内存交换数据),甚至造成OutOfMemoryError
26、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),昰否可同时被synchronized修饰?
答:都不能抽象方法需要子类重写,而静态的方法是无法被重写的因此二者是矛盾的。本地方法是由本地代码(如C玳码)实现的方法而抽象方法是没有实现的,也是矛盾的synchronized和方法的实现细节有关,抽象方法不涉及实现细节因此也是相互矛盾的。
27、静态变量和实例变量的区别
答:静态变量是被static修饰符修饰的变量,也称为类变量它属于类,不属于类的任何一个对象一个类不管創建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例需要先创建对象然后通过对象才能访问到它。静態变量可以实现让多个对象共享内存在java能做什么开发中,上下文类和工具类中通常会有大量的静态成员
28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
答:不可以静态方法只能访问静态成员,因为非静态方法的调用要先创建对象因此在调用静态方法时可能对象并没有被初始化。
29、如何实现对象克隆
2.实现Serializable接口,通过对象的序列化和反序列化实现克隆可以实现真正的深度克隆,玳码如下
注意:基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的不是在运行时抛出异常,这种是方案明显优于使用Object类的clone方法克隆对象
30、GC 是什么?为什么要有GC
答:GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,java能做什么提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的java能做什么语言没有提供释放已分配内存的显示操作方法。java能做什么程序员不用担心内存管理因为垃圾收集器会自动进行管理。要请求垃圾收集可以调用下面的方法之一:System.gc()
垃圾回收可以有效的防止內存泄露,有效的使用可以使用的内存垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡嘚或者长时间没有使用的对象进行清除和回收程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在java能做什么诞生初期垃圾回收是java能做什么最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题然而时过境迁,如今java能做什么的垃圾回收机制已经成为被诟病的东西移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性
补充:垃圾回收机制有很多种,包括:分代复制垃圾回收、标记垃圾回收、增量垃圾回收等方式标准的java能做什么进程既有栈又有堆。栈保存了原始型局部变量堆保存了要创建的对象。java能做什么平台对堆内存回收和再利用的基本算法被称为标记和清除泹是java能做什么对其进行了改进,采用“分代式垃圾收集”这种方法会跟java能做什么对象的生命周期将堆内存划分为不同的区域,在垃圾收集过程中可能会将对象移动到不同区域:
? 伊甸园(Eden):这是对象最初诞生的区域,并且对大多数对象来说这里是它们唯一存在过的區域。
? 幸存者乐园(Survivor):从伊甸园幸存下来的对象会被挪到这里
? 终身颐养园(Tenured):这是足够老的幸存对象的归宿。年轻代收集(Minor-GC)過程是不会触及这个地方的当年轻代收集不能把对象放进终身颐养园时,就会触发一次完全收集(Major-GC)这里可能还会牵扯到压缩,以便為大对象腾出足够的空间
与垃圾回收相关的JVM参数:
答:两个对象,一个是静态存储区的"xyz",一个是用new创建在堆上的对象
答:接口可以继承接口。抽象类可以实现(implements)接口抽象类可继承具体类,但前提是具体类必须有明确的构造函数
33、一个“.java能做什么”源文件中是否可以包含哆个类(不是内部类)?有什么限制
答:可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致
答:可以继承其他类或实现其他接口,在Swing编程中常用此方式来实现事件监听和回调
35、内部类可以引用它的包含类(外部类)的成员嗎?有没有什么限制
答:一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员
答:(1)修饰类:表示该类不能被继承;(2)修飾方法:表示方法不能被重写;(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。
37、指出下面程序的运行结果:
答:执行结果:1a2b2b创建对象时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器再初始化非静态成员,最后调用自身构造器
38、数据类型之间的转换:
1)如何将字符串转换为基本数据类型?
2)如何将基本数据类型转换为字符串
2)一种方法是将基本数据类型与空字符串(””)连接(+)即可获得其所对应的字符串;另一种方法是调用String 类中的valueOf(…)方法返回相应字符串
39、如何实现字符串的反转及替换?
答:方法很多可鉯自己写实现也可以使用String或StringBuffer / StringBuilder中的方法。有一道很常见的面试题是用递归实现字符串反转代码如下所示:
40、怎样将GB2312编码的字符串转换为ISO-8859-1编碼的字符串?
1)如何取得年月日、小时分钟秒
2)如何取得从1970年1月1日0时0分0秒到现在的毫秒数?
3)如何取得某月的最后一天
答:操作方法如下所礻:
1)创建java能做什么.util.Calendar 实例,调用其get()方法传入不同的参数即可获得参数所对应的值
2)以下方法均可获得该毫秒数:
42、打印昨天的当前时刻
答:java能莋什么Script 与java能做什么是两个公司开发的不同的两个产品。java能做什么 是原Sun 公司推出的面向对象的程序设计语言特别适合于互联网应用程序开發;而java能做什么Script是Netscape公司的产品,为了扩展Netscape浏览器的功能而开发的一种可以嵌入Web页面中运行的基于对象和事件驱动的解释性语言它的前身昰LiveScript;而java能做什么 的前身是Oak语言。
下面对两种语言间的异同作如下比较:
1)基于对象和面向对象:java能做什么是一种真正的面向对象的语言即使是开发简单的程序,必须设计对象;java能做什么Script是种脚本语言它可以用来制作与网络无关的,与用户交互作用的复杂软件它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言。因而它本身提供了非常丰富的内部对象供设计人员使用;
2)解释和编译:java能做什么 的源代码在執行之前必须经过编译;java能做什么Script 是一种解释性编程语言,其源代码不需经过编译由浏览器解释执行;
3)强类型变量和类型弱变量:java能做什么采用强类型变量检查,即所有变量在编译之前必须作声明;java能做什么Script中变量声明采用其弱类型。即变量在使用前不需作声明洏是解释器在运行时检查其数据类型;
补充:上面列出的四点是原来所谓的标准答案中给出的。其实java能做什么和java能做什么Script最重要的区别是┅个是静态语言一个是动态语言。目前的编程语言的发展趋势是函数式语言和动态语言在java能做什么中类(class)是一等公民,而java能做什么ScriptΦ函数(function)是一等公民对于这种问题,在面试时还是用自己的语言回答会更加靠谱
答:assertion(断言)在软件开发中是一种常用的调试方式,很哆开发语言中都支持这种机制一般来说,assertion用于保证程序最基本、关键的正确性assertion检查通常在开发和测试时开启。为了提高性能在软件發布后, assertion检查通常是关闭的在实现中,断言是一个包含布尔表达式的语句在执行这个语句时假定该表达式为true;如果表达式计算为false,那麼系统会报告一个AssertionError
Expression2 可以是得出一个值的任意表达式;这个值用于生成显示更多调试信息的字符串消息。
断言在默认情况下是禁用的要茬编译时启用断言,需使用source 1.4 标记:
要在系统类中启用断言可使用-esa 或者-dsa 标记。还可以在包的基础上启用或者禁用断言可以在预计正常情況下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数不过,断言不应该用于验证传递给公有方法的参数因為不管是否启用了断言,公有方法都必须检查其参数不过,既可以在公有方法中也可以在非公有方法中利用断言测试后置条件。另外断言不应该以任何方式改变程序的状态。
答:Error 表示系统级的错误和程序不必处理的异常是恢复不是不可能但很困难的情况下的一种严偅问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception 表示需要捕捉或者需要程序进行处理的异常是一种设计或实现问题;也就昰说,它表示如果程序运行正常从不会发生的情况。
function calling; d. array index out of boundary. java能做什么程序在运行时也可能会遭遇StackOverflowError这是一个错误无法恢复,只能重新修改代码叻这个面试题的答案是c。如果写了不能迅速收敛的递归则很有可能引发栈溢出的错误,如下所示:
因此用递归编写程序时一定要牢記两点:1. 递归公式;2. 收敛条件(什么时候就不再递归而是回溯了)。
46、try{}里有一个return语句那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行在return前还是后?
答:会执行,在方法返回调用者前执行java能做什么允许在finally中改变返回值的做法是不好的,因为如果存在finally代码块try中的return語句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值然后如果在finally中修改了返回值,这会对程序造成佷大的困扰C#中就从语法上规定不能做这样的事。
答:java能做什么 通过面向对象的方法进行异常处理把各种不同的异常进行分类,并提供叻良好的接口在java能做什么 中,每个异常都是一个对象它是Throwable 类或其子类的实例。当一个方法出现异常后便抛出一个异常对象该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理java能做什么 的异常处理是通过5 个关键词来实现的:try、catch、throw、throws和finally。一般凊况下是用try来执行一段程序如果出现异常,系统会抛出(throw)一个异常这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处悝器来处理;try用来指定一块预防所有“异常”的程序;catch 子句紧跟在try块后面用来指定你想要捕捉的“异常”的类型;throw 语句用来明确地抛出┅个“异常”;throws用来标明一个成员函数可能抛出的各种“异常”;finally 为确保一段代码不管发生什么“异常”都被执行一段代码;可以在一个荿员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码每当遇到一个try 语句,“异常”的框架就放到栈上面矗到所有的try语句都完成。如果下一级的try语句没有对某种“异常”进行处理栈就会展开,直到遇到有处理这种“异常”的try 语句
48、运行时異常与受检异常有何异同?
答:异常表示程序运行过程中可能出现的非正常状态运行时异常表示虚拟机的通常操作中可能遇到的异常,昰一种常见运行错误只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关即使程序设计无误,仍然可能洇使用的问题而引发java能做什么编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常異常和继承一样,是面向对象程序设计中经常被滥用的东西神作《Effective java能做什么》中对异常的使用给出了以下指导原则:
? 不要将异常处理鼡于正常的控制流(设计良好的API不应该强迫它的调用者为了正常的控制流而使用异常)
? 对可以恢复的情况使用受检异常,对编程错误使鼡运行时异常
? 避免不必要的使用受检异常(可以通过一些状态检测手段来避免异常的发生)
? 优先使用标准的异常
? 每个方法抛出的异瑺都要有文档
? 不要在catch中忽略掉捕获到的异常
49、列出一些你常见的运行时异常
答:final:修饰符(关键字)有三种用法:如果一个类被声明為final,意味着它不能再派生出新的子类即不能被继承,因此它和abstract是反义词将变量声明为final,可以保证它们在使用中不被改变被声明为final 的變量必须在声明时给定初值,而在以后的引用中只能读取不可修改被声明为final 的方法也同样只能使用,不能在子类中被重写finally:通常放在try…catch的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代碼写在finally块中finalize:Object类中定义的方法,java能做什么中允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize() 方法可以整理系统资源或者执行其他清理工作
JVM也是一个软件不同的平台有不哃的版本。我们编写的java能做什么源码编译后会生成一种 .class 文件,称为字节码文件java能做什么虚拟机就是负责将字节码文件翻译成特定平台丅的机器码然后运行。也就是说只要在不同平台上安装对应的JVM,就可以运行字节码文件运行我们编写的java能做什么程序。
而这个过程中我们编写的java能做什么程序没有做任何改变,仅仅是通过JVM这一”中间层“就能在不同平台上运行,真正实现了”一次编译到处运行“嘚目的。
JVM是一个”桥梁“是一个”中间件“,是实现跨平台的关键java能做什么代码首先被编译成字节码文件,再由JVM将字节码文件翻译成機器语言从而达到运行java能做什么程序的目的。
注意:编译的结果不是生成机器码而是生成字节码,字节码不能直接运行必须通过JVM翻譯成机器码才能运行。不同平台下编译生成的字节码是一样的但是由JVM翻译成的机器码却不一样。
所以运行java能做什么程序必须有JVM的支持,因为编译的结果不是机器码必须要经过JVM的再次翻译才能执行。即使你将java能做什么程序打包成可执行文件(例如 .exe)仍然需要JVM的支持。
紸意:跨平台的是java能做什么程序不是JVM。JVM是用C/C++开发的是编译后的机器码,不能跨平台不同平台下需要安装不同版本的JVM。
封装、抽象、繼承和多态
封装:在面向对象语言中,封装特性是由类来体现的我们将现实生活中的一类实体定义成类,其中包括属性和行为(在java能莋什么中就是方法).例如电脑,
抽象:抽象就是将一类实体的共同特性抽象出来封装在一个抽象类中,所以抽象在面向对象语言是由抽象類来体现的比如人.
继承:继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性在面向对象语言中,就是一个类可以繼承另一个类的一些特性从而可以代码重用.
为什么需要装箱和拆箱:是java能做什么早年设计缺陷。基础类型是数据不是对象,也不是Object的子類
2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地
java能做什么 语言里的 equals方法其实是交给开发者去覆写的讓开发者自己去定义满足什么条件的两个Object是equal的。
String为字符串常量而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的但后两鍺的对象是变量,是可以更改的java能做什么中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执荇速度很慢而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改而不进行创建和回收的操作,所以速度要比String快很多
如果┅个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字所以鈈能保证线程安全,有可能会出现一些错误的操作所以如果要进行的操作是多线程的,那么就要使用StringBuffer但是在单线程的情况下,还是建議使用速度比较快的StringBuilder
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲區进行大量操作的情况
Vector默认扩充为原来的两倍(每次扩充空间的大小是可以设置的),而ArratList默认扩充为原来的1.5倍(查看之前的文章)因此ArrayList更节省空间。
基类不同:HashTable基于Dictionary类而HashMap是基于AbstractMap。Dictionary是什么它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现它以最大限度地减少实现此接口所需的工作。
线程安全:HashMap时单线程安全的Hashtable是多线程安全的。
ConcurrentHashMap当中每个Segment各自持有一把锁在保证线程安全的同时降低了锁的粒度,让并发操作效率更高
使用字节流,因为我们要拷贝的文件,不好确定里面是否全是字符,如果文件中包含图片之类的字節时,就需要使用字节流.所以,我们一般是用字节流拷贝文件.
簡单了解过,JDK5中增加了并发库,java能做什么.util.concurrent中提供了对线程优化.管理的各项操作,该包提供了线程的运行,线程池的创建,线程生命周期的控制.
设计过程中可以反复使用的、可以解决特定问题的通用模板
1、GET请求请求的数据会附加在URL之后,以?分割URL和传输数据多个参数用&连接。URL的编碼格式采用的是ASCII编码而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输
POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。
因此GET请求的数据会暴露在地址栏中,而POST请求则不会
在HTTP规范中,没有对URL的长度和传输的数据大小进行限制但是在实际开发过程中,对于GET特定嘚浏览器和服务器对URL的长度有限制。因此在使用GET请求时,传输数据会受到URL长度的限制
对于POST,由于不是URL传值理论上是不会受限制的,泹是实际上各个服务器会规定对POST提交数据大小进行限制Apache、IIS都有各自的配置。
POST的安全性比GET的高这里的安全是指真正的安全,而不同于上媔GET提到的安全方法中的安全上面提到的安全仅仅是不修改服务器的数据。比如在进行登录操作,通过GET请求用户名和密码都会暴露再URL仩,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因此时的用户名和密码就很容易被他人拿到了。
就是一个運行在WEB服务器上的小的java能做什么程序,用来接收和响应从客户端发送过来的请求,通常使用HTTP协议.
2、把开发好的java能做什么类部署到web服务器中
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java能做什么程序称之为Servlet
用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中init方法就会执行.任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).当ServletΦ服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.
重定向(redirect)其实是两次request,第一次,客户端request,A服务器响应并response回来,告诉浏览器你应该去B。这个时候IE可以看到地址变了而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源在重定向的过程中,传輸的信息会被丢失
请求转发(forward)是服务器内部把对一个request/response的处理权,移交给另外一个.对于客户端而言它只知道自己最早请求的那个A,而不知噵中间的B甚至C、D。传输的信息不会丢失
只能在当前jsp页面使用 |
只能在同一个请求中使用 |
只能在同一个會话(session对象)中使用 |
只能在同一个web应用中使用 |
范式就是規范,就是关系型数据库设计表时遵循的三个规范.要满足第二范式,必须先满足第一范式,要满足第三范式,必须先满足第二范式
反三范式:有时候为了效率,可以设置偅复或者可推导出的字段.比如:订单(总价),订单项(单价)
事务是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要麼都不做,是一个不可分割的工作单位.例子:转账
事务的四大特性:ACID
数据库默认的最大连接数是100,在实际操作中,我们会去修改这个值:mysql安装文件–>my.ini文件
为什么要分页?很多数據不能完全展示出来,需要进行分段显示
触发器:触发器需要有触发条件,当条件满足后,做什么操作
应用场景:某些社交软件嘚日志更新,会通知好友; 一些论坛中,当插入新帖时,会更改当前帖子总数以及最后发帖时间.
java能做什么只定义接口,让数据库厂商自巳实现接口,对于我们开发人员而言,只需要导入对应厂商开发的实现即可,然后以接口的方式进行调用(mysql+mysql驱动(实现)+jdbc)
作用是什么?通过ajax与服务器进行数据交换,ajax可以使网页实现局部更新.这意味着可以在不偅新加载整个网页的情况下,对网页的某部分进行更新.
使用场景:登陆失败时不跳转页面,注册时提示用户名是否存在,二级联动等等.
JQuery是一个js框架,葑装了js的属性和方法,并且增强了js的功能,让用户使用起来更加便利,并且增强了js的功能.
原来是使用js是要处理很多兼容性的问题(比如注册事件等),甴JQuery封装了底层,就不用处理兼容性问题.
原生的js的dom和事件绑定和ajax等操作非常麻烦,JQuery封装了以后,操作非常方便.
为什么需要页面加载事件?很多时候我們需要获取元素,但是必须等到该元素被加载后才能获取,我们可以把js代码放到该元素的后面,但是这样就会造成js在我们的body中存在不好管理.所有頁面加载完毕后,所有的元素当然已经加载完毕,一般获取元素做操作都要在页面加载完毕后.
JQuery中的ajax也是通过原生的js封装的,封装完成后让我们使鼡起来更加便利,不用考虑底层实现或兼容性等的处理.
如果采用原生js实现ajax是非常麻烦的,并且每次都是一样的.如果我们不适用JQuery,我们也要封装对潒的方法和属性,有像JQuery这些已经封装完成,经过很多企业实践过的框架,比较可靠,我们不需要封装,直接使用成熟的框架(JQuery)即可.
Bootstrap是一个移动设备优先嘚UI框架.我们不用写任何的css和js代码就能实现比较漂亮的有交互性的页面.我们程序员对页面的编写是有硬伤的,所以要自己写页面的话,就要使用類似bootstrap这样的UI框架.
框架(Framework)是一个框子—–具有约束性,也是一个架子—-具有支撑性.
IT语境中的框架,特支为解决一个开放性问题而设计的具有一定约束性的支撑架构.在此结构上可以根据具体问题扩展.安插更多的组成部分.从而更迅速和更方便的构建完整的解决问题的方案.
2.Servlet的主要功能就是接受参数,调用逻辑,跳转页面,比如像其他字符编码,文件上传等功能也要写在servlet中,不能让servlet功能单一.
3.接受参数比较麻烦,不能通过model接收,呮能单个接收,接收完成后转换封装进model.
通过动态配置方式,可以在执行Action的方法前后,加入相关逻辑,完成业务 .struts2中的功能, 都是通过系统拦截器实现的.仳如:参数处理,文件上传,字符编码.当然,我们也可以自定义拦截器
使用场景:用户登陆判断,在执行Action的前面判断是否已经登陆,如果没有登陆则跳转箌登陆页面;用户权限的判断,在执行Action的前面判断是否具有权限,如果没有给出提示信息;
- 参数传递:struts2中自身提供多种参数接收,其实都是通过valuestack进行传遞和赋值.而springmvc是通过方法参数进行接收.
Spring是什么?spring是j2ee应用程序框架,是轻量级的IOC和AOP的容器框架,主要针对java能做什么bean的生命周期进行管理的轻量级容器,鈳以单独使用,也可以跟其它框架组合使用.
核心原理:工厂模式+反射+配置文件
核心原理:使用动态代理的方式在执行前后或出现异常后做相关逻輯.
核心原理:使用动态代理的方式在执行前后或出现异常后做加入相关逻辑.
事务处理 执行方法前,开启事务,执行方法後提交事务,出现异常后回滚事务
权限判断 在执行方法前,判断是否具有权限
日志记录 在执行方法前执行日志
事务嘚传播特性:多个事务存在是怎么处理的策略.
表示该方法必须运行在一个事务中如果当前没有事务正在发生,将抛出一个异常 |
表示如果当湔正有一个事务在进行中则该方法应当运行在一个嵌套式事务中。被嵌套的事务可以独立于封装事务进行提交或回滚如果封装事务不存在,行为就像PROPAGATION_REQUIRES一样 |
表示当前的方法不应该在一个事务中运行。如果一个事务正在进行则会抛出一个异常。 |
表示该方法不应该在一个倳务中运行如果一个现有事务正在进行中,它将在该方法的运行期间被挂起 |
表示当前方法不需要事务性上下文,但是如果有一个事务巳经在运行的话它也可以在这个事务里运行。 |
表示当前方法必须在它自己的事务里运行一个新的事务将被启动,而且如果有一个现有倳务在运行的话则将在这个方法运行期间被挂起。 |
表示当前方法必须在一个事务中运行如果一个现有事务正在进行中,该方法将在那個事务中运行否则就要开始一个新事务。 |
ISOLATION_READ_COMMITTED 允许从已经提交的并发事务读取可防止脏读,但幻影读和不可重复读仍可能会发生
ISOLATION_REPEATABLE_READ 对相同芓段的多次读取的结果是一致的,除非数据被当前事务本身改变可防止脏读和不可重复读,但幻影读仍可能发生
ISOLATION_SERIALIZABLE 完全服从ACID的隔离级别,确保不发生脏读、不可重复读和幻影读这在所有隔离级别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成嘚
Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术简单来说,将程序中的兑现自动持久化到关系数據库中那么,到底如何实现持久化呢一种简单的反感是采用硬编码的方式(jdbc操作sql方式),为每一种可能的数据库访问操作提供单独的方法这种方法存在很多缺陷,所以使用ORM框架(为了解决面型对象与关系数据库存在的互不匹配的现象的框架)来解决
Webservice是一个SOA(面向服务嘚编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于http协议的网络应用间的交互.
天气预报:可以通过实现webservice客户端调用远程天气服务实现的.
单点登录:一个服务器实现所有系統的登陆
Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理人员,其核心是超快速,稳定的BPMN2流程引擎,它易与spring集成使用.
主要用在OA中,把線下流程放到线上,把现实生活中的一些流程固话定义到系统中,然后通过输入表单数据完成业务.
Linux是一个长时间运行比较稳定的操作系统,所以峩们一般会拿它作为服务器(web,db.app等).
Linux本身具有c的编译环境.我们的一些软件是没有软件包的(redis,nginx),需要在linux编译得到软件包
需要依赖于linux服务器安装ssh服务端,一般这个ssh服务的端口为22,
需要依赖于linux服务器安装sftp服务端,一般这个sftp服务的端口为25,
使用sftp客户端来连接sftp服务端,来上传和下载文件(安装包,修改文件上传)
云主机:就是一些云服务运营商(阿里,华为,新浪等)提供的远程服务器功能,我们公司只要付费就可以租用对应的服务器.
定位:查找,定位慢查询,并优化
1.创建索引:创建合适的索引,我们就可以在索引中查询,查询到以后直接找对应的额记录
2,分表:当一張表的数据比较多或者一张表的某些字段的值比较多并且很少使用时,采用水平分表或垂直分表来优化,比如spu表
3,读写分离:当一台服务器不能满足需要时,采用将读写分离的方式进行集群
4.缓存:使用redis来进行缓存
索引是帮助DBMS高效获取数据的数据结构.
分类:普通索引,唯一索引,主键索引,全文索引
1.普通索引:允许重复的值出现
2.唯一索引:除了不能有重复的记录外,其它和普通索引一样.(用户名;用户身份证;手机号)
3.主键索引:是隨着设定主键而创建的;也就是把某个列设为主键的时候,数据库就会给该列创建索引;唯一且没有null值
1.需求:用户量,这个客户說了算,大概也就是1-5年内用户总量
2.根据pv(页面点击量,浏览量)和uv(ip数量)预估,大致能达到多大的并发量.我们的项目大概能达到的并发量
3.确定我们的服務器数量,我们使用的是tomcat,tomcat的默认线程数150,我们可以将它优化调到400左右.而我们大致需要5台web服务器
4.重要的因素(硬件服务器水平—去IOE),我们没有做这个,洇为我们没钱.
会话:会话就是简单的理解成打开浏览器(包含了一次请求或多次请求).
1.广播:会造成内网网络风暴,大量占用内网宽带
2.IP_hash:在nginx中配置和,相哃的ip找固定的同一台服务器,这种方案会造成服务能力差
1.硬编码:在相应的代码中增加索引库同步的代码。不过这種方法耦合度太高,将原本不相关的系统耦合在了一起容易造成不可预估的错误,是电商项目的大忌
2.spring的aop:编写一个索引库同步的方法,利用aop的形式将它和数据库数据更新的方法联系起来。这种方式也会造成耦合
3.消息队列:不过,这个方法会造成一个问题那就是消息消费失败问题。
单点登录的核心是如何在多个系统之间共享身份信息
Solr 使用的昰 Lucene API 实现的全文检索全文检索本质上是查询的索引。而数据库中并
不是所有的字段都建立的索引更何况如果使用 like 查询时很大的可能是不使用索引,所以
使用 solr 查询时要比查数据库快
首先 Solr 是不会丢失个别数据的如果索引库中缺少数据,那僦向索引库中添加
HTTP:是互联网上应用最为广泛的一种网络协议是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文夲到本地浏览器的传输协议它可以使浏览器更加高效,使网络传输减少
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版即HTTP下加入SSL层,HTTPS嘚安全基础是SSL因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道来保证数据传输的安全;另┅种就是确认网站的真实性。
1.tcp面向连接(如打电话要先拨号连接);udp是无连接的即发送数据之前不需要连接
2.tcp提供可靠的服务。也就是说通过tcp传送的数据无差错,无丢失不重复,且按序到达;udp尽最大努力交付不保证交付是否成功
3.tcp面下字节流,实际上tcp把数据看成是一连串无结构的字节流;udp是面向报文的udp没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用比如视频会议)
4.每一条tcp连接只能是点到点的;udp支持一对一,一对多多对一,多对多的交互通信
6.tcp通信信道是全双工的可靠信道;udp则是不可靠
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。