美文网首页
派派面试

派派面试

作者: 7i昂 | 来源:发表于2019-10-04 09:52 被阅读0次

笔试题

1.A Activity 跳转 B Activity的生命周期

答:A:onCreate-- onStart--onResume--onPause--->B:onCreate--onStart--onResume-->A:onStop

2.String a="abc";String b="abc";String c=new String(b);以上三句构造了几个对象,是哪三个,在内存中如何存储的?

答:说这个要说道字符串池的问题,也就是如何声明字符串会往字符串池中添加。直接以""好方式赋值的,原来字符串池没有的会添加,有则不添加new方式赋值的,每次都添加。了解到这点我们可以看出第一个String a = "abc";创建了一个对象第二个String b = "abc";因为字符串池中已有abc所以不会新创建第三个String c=new String("abc");创建了两个。首先new了一个String对象,我们说了new每次都会添加字符串池。即使abc在字符串池中也会新创建abc字符,所以它是创建两个对象这样1+0+2=3个对象

3.ArrayList LinkedList Vector的区别?

答:
ArrayList、Vector和LinkedList类均在java.util包下,均为可伸缩数组,即可以动态改变长度的数组
ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会在内存中开辟一块连续的空间
来存储,因为数据存储是连续的,所以它们支持用下标来访问元素,索引数据的速度比较快。
1)ArrayList和Vector都有一个初始化的容量大小,当里面存储的元素超过初始的大小时就需要动态地扩充
它们的存储空间,Vector默认扩充为原来的两倍(每次扩充空间的大小可以设置),ArrayList默认
扩充为原来的1.5倍(没有提供方法来设置空间扩充的方法)。
2)ArrayList和Vector最大的区别就是synchronization的使用,没有一个ArrayList的方法是同步的,而
Vector的绝大多数方法(如add,insert,remove,set,equals,hashcode)都是直接或间接同步的,所以Vector
是线程安全的,ArrayList不是线程安全的。正是由于Vector提供了线程安全的机制,其性能上也要稍逊于ArrayList

LinkedList是采用双向列表来实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问则效率比较低,
但是插入元素时不需要对数据进行移动,因此插入效率较高。同时,LinkedList是非线程安全的容器

对容器的选择:
当对数据的主要操作是索引或只在集合的末端增加、删除元素时,使用ArrayList或Vector效率比较高,
当对数据的操作主要为指定位置或删除操作时,使用LikedList效率比较高;当在多线程中使用容器时,
选用Vector较为安全

4.try cacth finally执行顺序

5.java中50十个人手拉手报出3的人出列最后一人是谁

import java.util.LinkedList;
 
import javax.swing.text.html.HTMLDocument.Iterator;
 
public class Circle50 {
    public static void main(String[] args) {
        LinkedList<Integer> a = new LinkedList<Integer>();
        for(int i = 1;i <= 50;++i)
            a.add(i);
        int w = 50;
        int i = 0;
        while(w != 1){
            java.util.Iterator<Integer> it = a.iterator();
            while(it.hasNext()){
                i++;
                it.next();
                if(i == 3){
                    it.remove();
                    w--;
                    i = 0;
                    }
            }
        }
        System.out.println(a.get(0));
    }
 
}//结果是第11个人

6.你让工人为你工作7天,报酬每天一付。如果你只有一根金条,并且只能将这根金条切割两次,你该怎么切?

我把金条分成1/7、2/7和4/7三份。这样,第1天我就可以给他1/7;第2天我给他2/7,让他找回我1/7;第3天我就再给他1/7,加上原先的2/7就是3/7;第4天我给他那块4/7,让他找回那两块1/7和2/7的金条;第5天,再给他1/7;第6天和第2天一样;第7天给他找回的那个1/7

面试官提问:

1.Object obj=new Object()的内存引用

Object obj=new Object();
一句很简单的代码,但是这里却设计Java栈,Java堆,java方法区三个最重要的内存区域之间的关联。

假设这句代码出现在方法体中。

1.Object obj将反映到Java栈的本地变量表,这是一个本地变量的定义。是一个引用类型。
2.new Object()将会反映在Java堆中。存储了Object类型的所有实例数据值(次内存是不固定大小的,因为谁也无法确定这是对象的大小)。
3.程序运行,类型信息已经加载到内存里,这些数据就在Java方法区中,包括:类型的父类型,实现的接口、包含的方法等类型信息。new Object(),根据这些信息建立对象。可以看到这些信息是线程共享的。

2.两个线程同时访问同一个变量会怎么样?

出现脏数据
每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化了。

3.Activity onCreate都做了些什么?

public void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

其中super.onCreate(savedInstanceState)的作用是调用其父类Activity的onCreate方法来实现对界面的图画绘制工作。
在实现自己定义的Activity子类的onCreate方法时一定要记得调用该方法,以确保能够绘制界面。

super.onCreate主要是加载一些组件。
第一件事情便是super.onCreate(savedInstanceState),其实这条语句放在子类中的onCreate方法中的任何位置都可,问题只是
super.onCreate(savedInstanceState)必须要被执行,所以,最好也就是放在第一行,看起来比较明确。

4.云同步两端同时修改会怎么样?

5.jvm垃圾回收机制?

5.JAVA中的栈和堆

相关文章

网友评论

      本文标题:派派面试

      本文链接:https://www.haomeiwen.com/subject/bzgqyctx.html