问题解答

(后续还会添加)

集合类:

● ArrayList和Array的区别?
答:ArrayList大小是动态的,有丰富的方法和特征,只能包含(包装)对象类型
Array大小固定(自定义大小),可以包含的类型有基本类型和对象类型
● ArrayList和LinkedList的异同点?各自优势
答:相同点:1、继承关系:List接口下的实现类,具有list提供的方法
2、有序性:按照有序插入
3、重复性:元素都可以重复
4、null值:都可以存储null值
5、安全性:都是非线程安全的集合
不同点:1、数据结构:ArrayList底层是数组,LinkedList底层双向链表,
2、特色方法:LinkedList具有特有的方法,列如:addFirst、addLast……(实现Deque接口)
3、效率:ArrayList查询效率高(时间复杂度:O(1)),LinkedList添加(时间复杂度趋近于O(1),就是在不扩容情况下)、删除效率高
4、应用场景:ArrayList在查询较多时优先考虑,LinkedList在修改、添加等操作较多时优先考虑
● HashTable和HashMap的异同点?
答:相同点: 底层数据结构相同,键不能重复,插入无序,哈希过程通过key进行哈希,
不同点:线程安全:在多个访问时(并发情况下)HashTable是安全的,HashMap是不安全的
继承关系:HashTable继承自Dictionary,HashMap继承自AbstractMap
null值问题:HashTable键值对不能为空,HashMap键值对能为空
数组默认值:HashTable默认值为11,HashMap默认值16
扩容方式不同:HashTable是右移一位加一,HashMap是右移一位
效率不同:HashTable在单线程下效率低 HashMap在单线程下效率高
哈希算法不同
● HashTable能保证线程安全?
答:HashTable对相应的方法添加synchronized关键字 ,该关键字是一个互斥锁,目的是同一时刻只能有一个线程对资源进行访问,在HashMap中,对put,get,等一般方法添synchronized关键字修饰的是类对象,该对象调用put操作,即为该对象添加一个底层操作系统提供的数组机制,从用户态切换到内核态,当前的线程被阻塞住
● HashMap在JDK1.7和JDK1.8的区别???
答:1、JDK1.7用的是头插法,用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。JDK1.8及之后使用的都是尾插法,因为加入了红黑树使用尾插法,能够避免出现
逆序且环形链表死循环问题
2、JDK1.7用的是数组加单链表的数据结构。 JDK1.8用的是数组加链表加红黑树(当链表的深度达到8的时候,也就是默认阈值,就会自动扩容把链表转成红黑树的数据结构来把时间复杂度从O(n)变成O(nlogN))
● HashMap不具有线程安全性,如何让其在多线程下具有安全性?
答:使用集合工具类Collections使HashMap具有线程安全性,Collections.synchronizedMap
● 只有HashTable和Vector在自身上可以实现多线程并发的线程安全
● synchronized加锁解决并发性问题
答:底层操作系统提供的锁机制,要从用户态切换到内核态,在内核态运行,当前的线程就会被阻塞

理解:

● Java可以跨所有平台吗?
答:只有提供安装了相应的虚拟机,就可以跨该平台。
● C和Java哪一个速度快?
答:C快,因为C语言是直接执行机器码,Java是先将class文件解释成机器码在执行
在这里插入图片描述

其他的:

● Java中implement和extends的区别?
答: 1.implements可以实现多个接口,但extends只能继承一个抽象类。类与类之间称为继承关系: 因为该类无论是抽象的还是非抽象的,它的内部都可以定义非抽象方法,这个方法可以直接被子类使用,子类继承即可。
2.implements实现接口,必须实现接口里面所有的抽象方法,extends则不用重写所有的方法。类与接口之间是实现关系:因为接口中的方法都是抽象的,必须由子类实现才可以实例化。可以单实现,也可以多实现;还可以在继承一个类的同时实现多个接口。
3.extends继承父类,也可以调用父类初始化方法,implements实现父类,子类不可以覆盖父类的方法或变量。接口与接口之间是继承关系:一个接口可以继承另一个接口,并添加新的属性和抽象方法,并且接口可以多继承。
● System.arrayCopy()和Arrays.copyof()两者的异同,效率高低?
答:1.System.arrayCopy()需要目标数组,将原数组拷贝到自己定义的数组里, 而且可以选择拷贝的起点和长度以及放入新数组中的位置只是拷贝已经存在的数组元素,用了native关键字,说明调用的是其他语言写的底层函数(效率较高,底层用的C++写的)
2.Arrays.copyof()内部调用了System.arrayCopy()方法,不仅仅只是拷贝数组中的元素,在拷贝元素时,系统自动在内部建一个数组(效率低)
● 数组的拷贝方式:4种拷贝方式,深拷贝(两个引用,同时指向同一块内存),浅拷贝:简单类型拷贝前后,前者数值不变;引用类型拷贝前后,前者数值变化(连同前者地址改变)

  1. for 浅拷贝(引用类型)
  2. clone,会产生新的对象,快 浅拷贝(引用类型)可以深拷贝,要用接口
    例子: int[] a2 = a .clone();
  3. System.arrayCopy()底层调用了native(底层用C/C++实现)的方法 浅拷贝(引用类型)
  4. Arrays.copyof()底层调用System.arrayCopy()会产生新的对象 浅拷贝(引用类型)

● 不能做switch的参数类型有些什么?
答:int byte char short 可以 ,对应的包装类也可以。
long float double 不可以。
● String StringBuffer StringBuilder的区别和联系?
答:1、StringBuffer 和 StringBuilder的拼接使用append方法不会产生新的对象
2、StringBuffer中的方法都会有synchronized修饰,线程安全,适合多线程情况下
3、StringBuilder和String都比较适合用于单线程情况下
4、String在底层被优化为StringBuilder,如果是拼接
a.生成一个StringBuilder对象。
b.调用append方法进行拼接
c.调用StringBuilder.toString方法,返回String对象。
● String 和 StringBuilder 的区别? StringBuffer 和 StringBuilder 的区别是什么?
答:String+String:非循环情况下是优化为StringBuilder
String+String:循环情况下是每次都会产生StringBuilder对象
String:适用于少量的字符串操作的情况,单线程
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
● this.name为当前对象
答:this为当对象的地址(内存)引用,必须放在第一行。
● 对象的创建:new();
答: 1、为它分配内存
2、调用合适的构造函数
● 对象的初始化顺序
答:静态的初始化(只初始化一次)——>实例代码块初始化——>构造函数初始化
● 构造函数能不能发生重载(函数名相同,参数列表不同,返回值没要求)
答:可以发生重载
● 重写和重载?
答:重写override:函数名相同,参数列表相同,返回值相同(必须是继承的)
重载overload:函数名相同,参数列表不同,返回值没要求(可以是一个类内部,也可以是继承)
● 静态内部类如何访问外部类的非静态数据成员
答:给静态内部类的构造函数传入外部类对象。
● 派生类继承了基类,继承了基类的什么?构造函数是否被继承?
答:除了构造函数之外所有的都被继承了
● 构造函数内能否发生多态?
答:可以
???栈的增长方向?堆的增长方向?
● 快速排序方式?
选取基准的方法:
1、固定选取基准
2、随机选取基准:用于部分有序的序列,效率较高
3、三分取中法
优化方法:(可以与排序方式结合起来用)
1、当待排序数值小于一定范围时,使用直接插入排序
2、聚集相同基准元素法
● final, finally, finalize 的区别?
答:final修饰符。用来修饰类、方法、属性。对应的类不可悲继承,对应的方法不可被覆盖。对应的属性不可被修改。
Finally修饰符后面的语句一定会会被执行,长用在try catch 后面。
Finalize()方法是在垃圾收集器对无用对象进行清理时对该对象进行调用的。
● 抽象类和接口的区别是什么?抽象类是否可以实现接口?抽象类是否可继承实体类?
答:a.一个抽象类可以继承一个抽象父类,但是一个接口可以使用关键字extends继承多个接口
b.抽象类是对类整体的抽象 而接口是对行为进行抽象
c. 在接口中的成员变量和成员方法默认为public static final和public abstract
d.抽象类当中的方法和成员变量没用明确要求。
抽象类可以实现接口,抽象类可以继承实体类
● 简述 “双亲委派模型” (画图出来更好,结合图进行叙述),为什么要使用这种机制??好处是什么? loadClass() findClass() defineClass() 这几个函数分别做了什么工作?如果自己实现这个类加载器,应该重写哪个方法???
答:双亲委派模型的好处可以用一句话总结,即防止内存中出现多份同样的字节码,就不是每个类加载器对应一份字节码文件了。
好处是安全。
loadClass:负责以双亲委托方式去加载类
findClass:就根据类的包路径找到class文件
defineClass:负责从class字节码中加载Class对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值