日期:2014-05-20  浏览次数:20668 次

今天面试,被问了两个问题。
1.Java的内存管理是怎么样的?什么时候回收一个对象?
2.如何实现单链表的倒置。
悲催,都答不上来,求高手指教。。。

------解决方案--------------------
1、JAVA虚拟机自动管理的。
当一个对象不可到达时会。会被回收。
2.不知道
------解决方案--------------------
寄存器 缓存 内存堆栈 外部存储 看程序运行时用到的对象层级关系 一层层保存。
当一个对象失去了所有外部指针,也就是没有任何一个指针指向他的时候JVM就回收了。

单链表倒置个人感觉最简单的就是放到堆栈里面然后再顺次取出来。一个LINKMAP就OK了
------解决方案--------------------
1.java内存管理是怎么样的。这个问题太笼统了!java是对内存分区管理,基本上分为:java堆、java虚拟机栈、本地方法栈、程序计数器、方法区。大概的话就划分为这些区域进行管理。其中方法区和堆是线程共有的。(关于每个区是干什么的,你就去搜一下吧,太多了)
java回收对象是根据根搜索算法来回收的,当判定了该对象不可用之后其实并没有就回收了,其实相当于处于“死缓”阶段,要真正的宣告一个对象死亡,至少要经历两次标记过程。标记过程是啥呀的你也去搜一下吧,要写的话一大堆。
2.至于单链表的倒置,你可以考虑创建一个链表,然后每次把之前链表的第一个节点移除,并放到新建的链表的第一个。以LinkedList为例:
Java code

LinkedList<String> list = new LinkedList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        LinkedList<String> list1 = new LinkedList<String>();
        while(list.size() > 0){
            list1.addFirst(list.removeFirst());
        }
        System.out.println(list1);
        //[d, c, b, a]

------解决方案--------------------
内存管理是由虚拟机完成的!当一个对象没有引用再指向他的时候就会被回收!大概是这样的!
第二个呢,难道只有一个一个的改节点的指针域,我知道这种方法!还是看看大神的发挥吧!!
------解决方案--------------------
栈内存:当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间
堆内存:由Java虚拟机的自动垃圾回收器管理
------解决方案--------------------
探讨

栈内存:当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间
堆内存:由Java虚拟机的自动垃圾回收器管理

------解决方案--------------------
Java code

LinkedList<String> list = new LinkedList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        for (int i = 0; i < list.size(); i++) {
            list.add(list.remove(list.size() - i - 1));
        }
        System.out.println(list);

------解决方案--------------------
1.JVM认为该对象没用的时候自动回收该对象,可以使用finalize()建议进行回收,但仅仅是建议,并不一定回收.
2.JAVA中有很多链表集合,至于倒置没用过
------解决方案--------------------
探讨

1.java内存管理是怎么样的。这个问题太笼统了!java是对内存分区管理,基本上分为:java堆、java虚拟机栈、本地方法栈、程序计数器、方法区。大概的话就划分为这些区域进行管理。其中方法区和堆是线程共有的。(关于每个区是干什么的,你就去搜一下吧,太多了)
java回收对象是根据根搜索算法来回收的,当判定了该对象不可用之后其实并没有就回收了,其实相当于处于“死缓”阶段,要真正的宣告一个对象……

------解决方案--------------------
1.在内存中有四个区内存,code segament,date segament,stack,heap.对象是在heap中分配的,在堆中某个对象的没有被引用,JAVA虚拟机就会自动的回收分配给它的内存,以便给另外的对象使用!
2.链表中有倒置的方法,很简单的,查查API就清楚了!希望对你有所帮助!
------解决方案--------------------
java的内存管理:内存分为堆和栈,堆存放对象,栈存放对象的地址和基本数据类型。对象的回收由java虚拟机的垃圾回收器来自动回收,它会不定时的扫描内存中的对象,发现对象不再使用时就回收,程序员不能手工回收(虽然可以调用System.gc(),但是不会马上执行)。

可以创建一个新的单项链表,新链表的尾节点为旧链表的头节点,遍历旧链表,把遍历到的节点的next指针指向新节点的头节点即可。(LinkedList是双向链表,这个不符合题意的。。)

------解决方案--------------------
给个C代码吧:

C/C++ code


LinkList*  reverseList(LinkList *p)
{
    LinkList *q,*r;
    q=(LinkList *)malloc(sizeof(LinkList));
    r=(LinkList *)malloc(sizeof(LinkList));
    
    q=p->next ; //(p表示当前节点)
    r=q->next ;
    while(r->next)
    {
        q->next=p;
        p=q;
        q=r;
        r=r->next;
    }
    q->next=p;
    r->next=q;
    return r  ; // (现在的r变成表头了)
}