基础整理 (一)

来源:互联网 发布:淘宝手机如何改差评 编辑:程序博客网 时间:2024/05/21 07:38
Java面向对象 
1. 面向对象的三大特性? 
答:1.封装性  对外不可见  2.多态性 方法的重载 3.扩展性 类的继承

2. 抽象类和接口的区别?(结构和功能) 
答: 接口是完全抽象的没有自己的实现   而抽象类 是可以有自己的实现的

3. 重载和重写的区别? 
答:
3.1 重载 方法名相同 参数类型或个数不同 在同一个类中代表不同的参数有不同的行为
3.2 重写 方法名相同 参数类型与个数相同 extends 是子类与父类(或父类的父类...) 的一个重写 代表自己的一个行为 

4. 多态的体现? 
答:同一个类中  方法名相同,参数类型或个数不同

5. 2<<3等于多少? 
答:16

6. 向上转型的含义?
答:向上转型是方便程序的可扩展性,java会自动识别调用相关子类的方法。有利于程序编程和扩展

7. Final,finally, finalize分别什么作用? 
答:Final 声明在类上为不可以继承 声明在变量上为常量
finally try{}catch{}finally{} 异常处理中必须执行的那部分
finalize 类中定义的方法finalize() 是gc垃圾回收时 释放内存前必须会执行的方法

8. 数组是否有length()方法? 
答:没有

9. String,stringBuffer,StringBuilder的区别?性能? 
答:做+-长度拼接的性能 String < stringBuffer < StringBuilder  

10. 访问修饰符public,private,protected,以及不写(默认)时的区别? 
答:public 公共的 谁都可以访问
    private 私有的 自由自己可以访问
protected 受保护的  只有直系可以使用
defalut 同一个包下可以互相访问 

11. String 是最基本的数据类型吗? 
答: 不是

12. float f=3.4;是否正确? 
答: 错误 在java里面,没小数点的默认是int,有小数点的默认是 double;

13. 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; 正确 += 运算符是自增 内部处理不涉及类型转换

14. Java有没有goto? 
答: 有goto 是保留字

15. int和Integer有什么区别? 
答: int 是基本数据类型
Integer 是int的包装类型

16. &和&&的区别? 
答:&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,
否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式

17. Math.round(11.5) 等于多少?Math.round(-11.5)等于多少? 
答:Math.round(11.5)==12 Math.round(-11.5)==-11  round方法表示向上取整 就是往大的取值

18. 用最有效率的方法计算2乘以8? 
答:2<<3

19. 构造器(constructor)是否可被重写(override)? 
答:不可以

20. 两个对象值相同(x.equals(y) == true),但却可有不同的hashcode,这句话对不对? 
答:不对 java规定 equals方法返回true hashcode必须相同

21. 比较两个对象是否相同时?为什么要重写equals和hashcode? 
答: equals方法比较相同 hashcode必须相同
反之 hashcode相同 equals未必相同  
因为 set 和 map key 必须用到hashCode 
比如你的对象想放到Set集合或者是想作为Map的key时,
那么你必须重写equals()方法,这样才能保证唯一性。
当然,在这种情况下,你不想重写hashCode()方法,也没有错。
但是,对于良好的编程风格而言,你应该在重写equals()方法的同时,也重写hashCode()方法。
 
22. 是否可以继承String类? 
答:不可以  String 声明是final 不可继承

23. char 型变量中能不能存贮一个中文汉字,为什么? 
答:java采用unicode,2个字节(16位)来表示一个字符, 无论是汉字还是数字字母,或其他语言。 char 在java中是2个字节。 所以可以存储中文

24. Java 中会存在内存泄漏吗,请简单描述? 
答:内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java中有垃圾回收机制,
它可以保证一对象不再被引用的时候,即对象变成了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。
由于Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,
只要它们和根进程不可达的,那么GC也是可以回收它们的
java中的内存泄露的情况:
1.长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,
 但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,
 以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况,
 例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。
 检查java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。
2.如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,
 即使那个外部类实例对象不再被使用,但由于内部类持久外部类的实例对象,
 这个外部类对象将不会被垃圾回收,这也会造成内存泄露。
3.当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,
 否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,
 即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,
 这也会导致无法从HashSet集合中单独删除当前对象,造成内存泄露


25. 抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰? 
答:
 1、abstract与static
     abstract:用来声明抽象方法,抽象方法没有方法体,不能被直接调用,必须在子类overriding后才能使用
     static:用来声明静态方法,静态方法可以被类及其对象调用
     static与abstract不能同时使用
     用static声明方法表明这个方法在不生成类的实例时可直接被类调用,而abstract方法不能被调用,两者矛盾。
 2、abstract与native
     native:用来声明本地方法,该方法的实现由非Java 语言实现,比如C。一般用于java与外环境交互,或与操作系统交互
     native 可以与所有其它的java 标识符连用,但是abstract除外。    
     因为native 暗示这些方法是有实现体的,只不过这些实现体
     是非java 的,但是abstract却显然的指明这些方法无实现体。
 3、abstract与synchronized
      synchronized:用于防止多个线程同时调用一个对象的该方法,与static连用可防止多个线程同时调用一个类的该方法
      abstract与synchronized不能同时使用
      从synchronized的功能也可以看出,用synchronized的前提是该方法可以被直接调用,显然和abstract连用

26. 阐述静态变量和实例变量的区别。 
答:静态变量 是类变量 存在方法区里的常量区 是共享的 访问方式是 类名.变量名
    实例变量 是成员变量 存在堆区  不是共享的 访问方式是 成员对象.变量名

27. GC是什么?为什么要有GC? 
答: GC是垃圾回收机制  是用于回收java内存中不被引用的对象。
 
28. String s = new String(“xyz”);创建了几个字符串对象? 
答:第一种情况  在常量区中 的String池 已经存在 xyz  因为用了new 所以在堆上需要创建一个对象  所以一个
        第二种情况  在常量区中 的String池 没有 xyz  那么常量区会创建一个 堆上也会new一个.

29. 接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)? 
答: 接口可以继承接口
     抽象类也可以实现接口
抽象类是否可继承具体类


30. 一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 
答  可以  但是只能有一个声明pulic的


31. Java 中的final关键字有哪些用法? 
答:Final 声明在类上为不可以继承 声明在变量上为常量


32. 如何实现字符串的反转及替换? 
答:可以构建一个StringBuilder  调用 reverse()方法实现反转
替换可以直接使用String 的 replace() 方法

33. Error和Exception有什么区别? 
答:Error :表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的严重错误 ,
导致 JVM 无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。
Exception : 表示可恢复的例外,这是可捕捉到的。
    Java 提供了两类主要的异常 :runtime exception 和 checked exception 。 
checked 异常也就是我们经常遇到的 IO 异常,以及 SQL 异常都是这种异常。 对于这种异常, 

JAVA 编译器强制要求我们必需对出现的这些异常进行 catch 。所以,面对这种异常不管我们是否愿意,

只能自己去写一大堆 catch 块去处理可能的异常


34. try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后? 
答:会执行,在return前执行

Java集合 
1. List、Set、Map是否继承自Collection接口? 
答:错误   只有List 和 Set 是   Map 没有继承

2. Java集合框架是什么?说出一些集合框架的优点? 
答:每种编程语言中都有集合,最初的Java版本包含几种集合类:
    Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。
    在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在 Java并发包中,阻塞接口以及它们的实现

(1)使用核心集合类降低开发成本,而非实现我们自己的集合类。
    (2)随着使用经过严格测试的集合框架类,代码质量会得到提高。
    (3)通过使用JDK附带的集合类,可以降低代码维护成本。

3. 阐述ArrayList、Vector、LinkedList的存储性能和特性。 
答:ArrayList 和Vector他们底层的实现都是一样的,都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,
    它们都允许直接按序号索引元素,但是插入 和删除元素要涉及数组元素移动等内存操作,所以索引数据快而插入 删除数据慢。
Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。
LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,
这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,
但是插入和删除数据时只需要记录本项的前后项即可,所以插入 删除速度较快。

4. Collection和Collections的区别? 
答:Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

5. List、Map、Set三个接口存取元素时,各有什么特点? 
答:List特点:元素有放入顺序,元素可重复 
    Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的) 
Map特点:元素按键值对存储,无放入顺序 (应该知道什么是键值对吧!

6. 集合框架中的泛型有什么优点? 
答:Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。泛型允许我们为集合提供一个可以容纳的对象类型,
因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,
因为你将会在编译时得到报错信息。泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符
它也给运行时带来好处,因为不会产生类型检查的字节码指令。

7. Java集合框架的基础接口有哪些? 
答:Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。
Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。
List是一个有序集合,可以包含重复元素你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。
Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。
一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。

8. Iterator是什么? 
答:Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获取迭代器实例。
迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者在迭代过程中移除元素。

9. Enumeration和Iterator接口的区别? 
答:Enumeration的速度是Iterator的两倍,也使用更少的内存。Enumeration是非常基础的,也满足了基础的需要
但是,与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。
迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者从集合中移除元素,而Enumeration不能做到。为了使它的功能更加清晰,
迭代器方法名已经经过改善

10. Iterator和ListIterator之间有什么区别? 
答:(1)我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List
    (2)Iterator只可以向前遍历,而LIstIterator可以双向遍历
    (3)ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置

11. Collections类是什么? 
答:Java.util.Collections是一个工具类仅包含静态方法,它们操作或返回集合。它包含操作集合的多态算法,返回一个由指定集合支持的新集合和其它一些内容。
这个类包含集合框架算法的方法,比如折半搜索、排序、混编和逆序等。

12. WeakHashMap类? 
答:WeakHashMap的key只保留对实际对象的弱引用,这意味着如果该HashMap对象所有key所引用的对象没有被其他强引用变量所引用,
则这些key所引用的对象可能被垃圾回收,HashMap也可能自动删除这些key所对应的key-value对象。

13.简述HashMap、HashSet、HashTable的区别。
答:Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。
HashMap类 HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key,null key只能有一个。
HashSet类 HashSet继承Set接口。Set是一种不包含重复的元素的Collection

14.为何Collection不从Cloneable和Serializable接口继承?
答:Collection接口指定一组对象,对象即为它的元素。如何维护这些元素由Collection的具体实现决定。
    例如,一些如List的 Collection实现允许重复的元素,而其它的如Set就不允许。很多Collection实现有一个公有的clone方法。然而,
    把它放到集合的所有实现中也是没有意义的。这是因为Collection是一个抽象表现。重要的是实现
    当与具体实现打交道的时候,克隆或序列化的语义和含义才发挥作用
    所以,具体实现应该决定如何对它进行克隆或序列化,或它是否可以被克隆或序列化。
    在所有的实现中授权克隆和序列化,最终导致更少的灵活性和更多的限制。特定的实现应该决定它是否可以被克隆和序列化。

15. 为何Map接口不继承Collection接口
答:尽管Map接口和它的实现也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map继承Collection毫无意义,反之亦然。
    如果Map继承Collection接口,那么元素去哪儿?Map包含key-value对,它提供抽取key或value列表集合的方法,但是它不适合 一组对象 规范。

16.Comparable和Comparator接口是什么?
答:如果我们想使用Array或Collection的排序方法时,需要在自定义类里实现Java提供Comparable接口。Comparable接口有compareTo(T OBJ)方法,
它被排序方法所使用。我们应该重写这个方法,如果“this”对象比传递的对象参数更小、相等或更大时,它返回一个负整数、0或正整数。
但是,在大多数实际情况下,我们想根据不同参数进行排序。比如,作为一个CEO,我想对雇员基于薪资进行排序,一个HR想基于年龄对他们进行排序。
这就是我们需要使用Comparator接口的情景,因为Comparable.compareTo(Object o)方法实现只能基于一个字段进行排序,
我们不能根据对象排序的需要选择字段。Comparator接口的compare(Object o1, Object o2)方法的实现需要传递两个对象参数,
若第一个参数比第二个小,返回负整数;若第一个等于第二个,返回0;若第一个比第二个大,返回正整数。

17.Comparable和Comparator接口有何区别?
答:Comparable和Comparator接口被用来对对象集合或者数组进行排序。Comparable接口被用来提供对象的自然排序,我们可以使用它来提供基于单个逻辑的排序。
    Comparator接口被用来提供不同的排序算法,我们可以选择需要使用的Comparator来对给定的对象集合进行排序。

18.我们如何对一组对象进行排序?
答:如果我们需要对一个对象数组进行排序,我们可以使用Arrays.sort()方法。如果我们需要排序一个对象列表,
我们可以使用Collection.sort()方法。两个类都有用于自然排序(使用Comparable)或基于标准的排序(使用Comparator)的重载方法sort()。
Collections内部使用数组排序方法,所有它们两者都有相同的性能,只是Collections需要花时间将列表转换为数组。

19.当一个集合被作为参数传递给一个函数时,如何才可以确保函数不能修改它?
答:在作为参数传递之前,我们可以使用Collections.unmodifiableCollection(Collection c)方法创建一个只读集合,
这将确保改变集合的任何操作都会抛出UnsupportedOperationException。

20.我们如何从给定集合那里创建一个synchronized的集合?
答:我们可以使用Collections.synchronizedCollection(Collection c)根据指定集合来获取一个synchronized(线程安全的)集合。









0 0
原创粉丝点击