java面试题6

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/strivenoend/article/details/84757752

1.数组和链表数据结构描述,各自的时间复杂度。

  ● 数组:是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少插入和删除元素,就应该用数组。数组从栈中分配空间, 对于程序员方便快速,但自由度小。数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。
  ● 链表:中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表。链表从堆中分配空间, 自由度大但申请管理比较麻烦。链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。
  ● 时间复杂度:按序号查找时,数组可以随机访问,时间复杂度为O(1)。链表不支持随机访问,平均需要O(n)。按值查找时,若数组无序,数组和链表时间复杂度均为O(1),但是当数组有序时,可以采用折半查找将时间复杂度降为O(logn);插入和删除时,数组平均需要移动n/2个元素,而链表只需修改指针即可;

2.深拷贝和浅拷贝的关系

     浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间。
  ● 深拷贝(.clone())不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。

3.请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用。

            同一个类    同一个包    不同包的子类    不同包的非子类
Private    √               
Default    √    √          
Protected    √    √    √     
Public    √    √    √    √
  ● Public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。 
  ● Private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
  ● Protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
  ● default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。
4.final的用途。
   final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。
   ● final变量:凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量。final变量经常和static关键字一起使用,作为常量。
   ● final方法:方法前面加上final关键字,代表这个方法不可以被子类的方法重写。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。
   ● final类:final修饰的类通常功能是完整的,它不能被继承。Java中有许多类是final的,譬如String, Interger以及其他包装类。

5.继承和聚合的区别在哪。
● 继承:指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性;
● 聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
6.、JAVA中的几种基本数据类型是什么,各自占用多少字节。

7.ArrayList、Vector和LinkedList有什么区别。

  ArrayList、Vecotr、LinkedList类均为java.util包中,均为可伸缩数据,既可以动态改变长度的数组。
☞ ArrayList和Vector都是基于存储的Object[] array来实现的,它们会在内存中开辟一块连续的空间来存储,由于数据村粗时连续的,因此,它们支持用序号(下标)来访问元素,同时索引数据的速度比较快。但是在插入元素时需要移动容器中的元素,所以对数据的插入操作执行比较慢。ArrayList和Vector都是一个初始化的容量的大小,当存储的元素超过分配内存大小时就需要动态地扩展它们的存储空间。为了提高效率,每次扩充容量时,不是简单的扩充一个存储单位,而是一次增加多个存储单元,Vector默认扩充为原来的2倍(每次扩充的大小是可以设置的),而ArrayList默认扩充1.5倍(没有提供方法来设置空间扩充大小)
☞ ArrayList与Vector最大的区别就是synchronization(同步)的使用,没有一个ArrayList的方法是同步,而Vector的绝大数方法(add、insert、remove、set、equals、hashcode等)都是直接或者间接同步的,所以Vector是线程安全的,ArrayList不是线程安全的。正是由于Vector是线程安全的,所以性能上也略逊于ArrayList。
☞ LinkedList是采用双向列表来实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问效率比较低,但是插入元素时不需要对数据进行移动,因此插入效率高。同时LinkedList是非线程安全的容器。
☞ 那么,在实际使用时,当对数据主要操作为索引或只是集合的未端增加、删除元素时,使用ArralyList或Vector效率比较高;当对数据的操作主要是指位置的插入或者删除操作时,使用LinkedList效率比较高;当在线程中使用容器时(既多线程同时访问该容器),选用Vector较为安全。
 

猜你喜欢

转载自blog.csdn.net/strivenoend/article/details/84757752