首页 > 编程 > Java > 正文

A电面_JAVA_Hong

2019-11-06 06:35:06
字体:
来源:转载
供稿:网友

1、内存分配

简单通俗的讲,一个完整的java程序运行过程会涉及以下内存区域:

寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。

栈:保存局部变量的值,包括:1.用来保存基本数据类型的值;2.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。

堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。

常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中

代码段:用来存放从硬盘上读取的源程序代码。

数据段:用来存放static定义的静态成员。

2、函数的参数在哪里分配,怎么分配

JAVA语言只有值传递。 

函数的参数分配,需要分情况讨论。

1、如果参数类型是原始类型,比如 public void func(int a) , 那么程序执行这个func方法的时候,会在栈中开辟空间,存放a的值。但是这样的操作并不会改变栈中另一块内存存在的a的值。栈内存之间互相不影响。

2、如果参数类型是引用类型,比如public void func(String a),那么开始程序执行String a="hello"的时候,在栈中开辟了空间,放a,a指向堆内存中常量池“hello”。 当a作为参数传入func的时候,内存在栈中重新开辟空间,这个空间也指向a指向的那块常量“hello”,这个时候如果函数里面改变了这个string,那么所有指向这个常量的引用的值都变了。

【http://www.cnblogs.com/lixiaolun/p/4311863.html】

3、用伪代码实现单链表

【http://www.cnblogs.com/_popc/p/4025684.html】

具体的思路是:

1、首先定义一个Node节点类。成员变量1是next指针,指向后一个元素的指针。成员变量2是data,保存该节点的数据。

2、定义一个单连边。首先Node一个头节点。然后定义一个position来指明该节点的位置。

3、定义链表的相关方法。首先是初始化头节点,this.first=null。 然后是插入和删除头节点。然后是一般节点的增删查。

4、如何把链表反转(你的算法,算法的缺点,时间复杂度,能否改进)

链接:https://www.nowcoder.com/questionTerminal/75e878df47f24fdc9dc3e400ec6058ca来源:牛客网

public class Solution { publicstatic ListNode ReverseList(ListNode head) { if(head==null) returnnull; ListNode reversedHead=null; ListNode current=head; ListNode tmp=null; ListNode PRe=null; while(current!=null){ tmp=current.next; current.next=pre; if(tmp==null) reversedHead=current;            pre=current; current=tmp;   } returnreversedHead; }}链表的反转操作很多,上面这个是典型的递归思想。

递归的方法是,利用递归走到链表的末端,然后更新每一个node的next值,实现链表的反转,而newhead的值没有发生变化,为尾节点。

链表的反转还有非递归思想的,三指针的,利用栈的。。。。

5、了解操作系统吗?

http://blog.csdn.net/youngchang06hpu/article/details/8009947

6、讲一下你理解的进程

进程:一个程序在一个数据集合上的一次运行过程。

http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

假设CPU是一座工厂,假设CPU是单核的,一次只能运行一个任务的那种。 那就进程就像是工厂里的一个车间,单核的CPU一个确切的时间只允许一个车间工作,其他车间休息。一个车间里可以有很多工人,这些工人就叫线程。工人们在同一个车间里工作,所以进程的内存空间是被线程共享的。

因此,操作系统可以总结为:

1、以多进程的形式,允许多个任务同时运行。

2、以多线程的形式,允许单个任务分成不同的部分运行。

3、提供协调机制,防止进程间的冲突,允许线程之间共享数据。

7、进程之间是如何通信的

http://jingyan.baidu.com/article/3a2f7c2e17e12b26afd611cb.html

进程之间有8种通信方式:

1、信号sinal :信号处理器

2、信号量 semophore :本质上是一个计数器。P、V操作

3、消息队列 message queue :一个消息队列可以被多个进程共享。 本质上是消息的链接表。

4、共享内存 shared memory :多个进程可以访问同一块内存。

5、套接字 socket: 可用于不同机器之间的进程间通信。

6、管道 pipe 只能在父子进程中使用,是一种半双工的通信方式。

7、高级管道 popen :将一个程序当做一个新的进程在当前程序进程中启动。

8、有名管道 named pipe :允许无亲缘关系的进程间半双工通信。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表