Android面试题知识点积累(0)
创建对象方式:
1.采用new 2.通过反射 3.采用clone 4.通过序列化机制
Object中有哪些公共方法?
equals()
clone()
getClass()
wait()
notify(),notifyAll()
toString()
finalize()
反射中,Class.forName和classloader的区别
class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容
throw与throws的比较
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
throw new NumberFormatException();
void function() throws NumberFormatException{}
JDK和JRE的区别是什么?
JRE(java运行环境)包括java虚拟机;
Jdk(java开发工具包)包括JRE和编译器等。可以开发、编译执行java程序。
static修饰方法能否被覆盖?
static方法不能被覆盖,因为方法覆盖是运行时动态绑定的,而static方法是编译时静态绑定的。static变量在Java中是属于类的,它在所有的实例中的值是一样的。
为什么Static方法用非static变量会报错?
Static编译时加载,此时非static变量还没有被创建。
为什么内部类调用的外部变量必须是final修饰的?
方法中的局部变量,方法结束后这个变量就要释放掉。然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中。为了解决:局部变量的生命周期与局部内部类的对象的生命周期的不一致性问题
Array数组可以包含基本类型和对象类型,ArrayList只能包含对象类型,如果要存基本数据类型,也要用它们的包装类才能通过。
System.gc()和Runtime.gc() 这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。
异常处理完成以后,Exception对象会发生什么变化?
答:Exception对象会在下一个垃圾回收过程中被回收掉。
Vector和ArrayList扩容是什么倍数扩容的?
Vector会将它的容量翻倍,ArrayList只增加50%的大小
浅拷贝和深拷贝
引用的拷贝
private static void copyReferenceObject(){
Person p = new Person(23, "zhang");
Person p1 = p;
System.out.println(p);
System.out.println(p1);
}
这里打印的结果:
com.yaolong.clone.Person@3654919e
com.yaolong.clone.Person@3654919e
可以看到,打印的结果是一样的,也就是说,二者的引用是同一个对象,并没有创建出一个新的对象。
浅拷贝
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址
深拷贝
深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。
Session与Cookie分别是什么
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
Session与Cookie的区别与联系
1、Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。
2、Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。
3、Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。
4、Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。
Java对象的生命周期
1.创建阶段(Created)
为对象分配内存空间,属性初始化
2.应用阶段(In Use)
对象至少被一个强引用持有着。
3.不可见阶段(Invisible)
当一个对象处于不可见阶段时,说明程序本身不再持有该对象的任何强引用,虽然该这些引用仍然是存在着的。
简单说就是程序的执行已经超出了该对象的作用域了。
4.不可达阶段(Unreachable)
指该对象不再被任何强引用所持有。
5.收集阶段(Collected)
当垃圾回收器发现该对象已经处于“不可达阶段”并且垃圾回收器已经对该对象的内存空间重新分配做好准备时,则对象进入了“收集阶段”。
6.终结阶段
当对象执行完finalize()方法后,则该对象进入终结阶段。
7.对象空间重新分配阶段
垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了
静态类的主要特性:
1:仅包含静态成员。
2:无法实例化。
3:是密封的。
4:不能包含实例构造函数。
非静态内部类能访问外部类的一切属性;静态内部类只能访问外部类的静态属性。
foreach与正常for循环效率对比
for循环在遍历集合时使用下标来定位集合中的元素,foreach来遍历集合时,集合必须实现Iterator接口,foreach就是使用Iterator接口来实现对集合的遍历的。foreach遍历集合是根据一个元素获取下一个元素遍历的。
所以for循环遍历ArrayList,底层是数组,地址下标是连续的,效率比foreach高。
for循环遍历LinkedList,地址下标不连续,效率比foreach低。
IPC通信的几种方式:
管道、信号量、共享内存、消息队列、套接字(socket)。
https://blog.csdn.net/kwame211/article/details/80225870
静态变量在什么时候加载?编译期还是运行期?静态代码块加载的时机呢?
答案:当类加载器将类加载到JVM中的时候就会创建静态变量,这跟对象是否创建无关。静态变量加载的时候就会分配内存空间。静态代码块的代码只会在类第一次初始化的时候执行一次。一个类可以有多个静态代码块,它并不是类的成员,也没有返回值,并且不能直接调用。它们通常被用初始化静态变量。
如果原地,不使用第三个变量交换两个变量的值
例如:int a=5,b=10;
第一种:两数的和减去b得到a的值,赋给b;两数的和再减b(此时实际是a的值),赋给a;
a=a+b; b=a-b; a=a-b;
第二种,用异或
a^=b;
b^=a;
a^=b;
java i+1
当用一个char、int、long等表示了一个该类型范围内的最大数,再增加1就会越界。比如:
int a = Integer.MAX_VALUE;
System.out.println(a);
int b = a+1;
System.out.println(b);
打印出来分别是 2147483647和-2147483648,即为2的31次方-1到-2的31次方。
i - 1 > i同理,-2^31 - 1 = 2^31 - 1。
堆是什么样的结构?
堆的存储是靠数组来存储。结构是二叉树一样的结构。
将不使用的引用对象置于null会加速回收吗?
不会。置空会变为可回收状态,JVM会智能地判断对象是否应该被回收,置于null对其没有影响。
String str=”aaa”,与String str=new String(“aaa”)一样吗?
不一样的。因为内存分配的方式不一样。
第一种,创建的”aaa”是常量,jvm都将其分配在常量池中。
第二种创建的是一个对象,jvm将其值分配在堆内存中。
抽象类必须要有抽象方法吗
不是必须。抽象类可以没有抽象方法。
HashSet和TreeSet有什么区别?
HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。
另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。
共有 0 条评论