重新启程

导航

细节(一)

1.每个进程都是一个独立运行的程序,拥有自己的变量,且不同进程间的变量不能共享,不同的线程之间可以在进程范围内共享数据。进程有自己独立的存储空间,而线程是和它所属的进程内的其他线程共享一个存储空间。


2.多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。


3.当用start()开始一个线程后,线程就进入就绪状态。当cpu分配给它时间时,才开始执行run()方法。START()是方法,它调用RUN()方法.而RUN()方法是你必须重写的. run()方法中包含的是线程的主体。


4,如果我们采用的是继承Thread类的方式,那么这个target就是线程对象自身,如果我们采用的是实现Runnable接口的方式,那么这个target就是实现了Runnable接口的类的实例。


5.线程同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字。


6.synchronized的目的是使同一个对象的多个线程,在某个时刻只有其中的一个线程可以访问这个对象的synchronized 数据。


7.如果一个方法声明为synchornized的,则等同于在此方法上调用synchornized(this).如果一个静态方法被声明为synchornized,则等同于在此方法上调用synchornized(类.class).


8.使用synchronized关键字实现的同步,会把一个对象的所有同步方法和同步块看做一个整体,只要有一个被某个线程调用了,其他的就无法被别的线程执行,即使这些方法或同步块与被调用的代码之间没有任何逻辑关系,这显然降低了程序的运行效率。
而使用Lock,当一个同步块被执行时,这个线程只会锁定与当前运行代码相关的其他代码最小集合,而并不影响其他线程对其余同步代码的调用执行。


9.wait(),notify(),notifyAll()这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized 语句块内使用这三个方法。


10.不推荐使用notify():因为这是随机地从等待队列中取一个线程执行,我们不能通过设定优先级进行控制,如果,随机抽取的线程不能往前执行,这就有可能产生死锁,所以,建议使用notifyall()。


11.需要进行多个线程之间进行通信,则使用同步机制;如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal。


12.交换机一般用于LAN-WAN的连接,交换机归于网桥,是数据链路层设备。
路由器用于LAN-WAN的连接,可以解决异性网络之间转发分组,作用于网络层。


13.8086是16位微处理器。


14.解释堆和栈的区别:栈上分配的内存,由系统自动分配,系统会自动收回。
如果需要动态分配内存,则只能通过mallcc/new在堆上分配的内存,使用完毕后,通过free/delete来释放内存。


15.简述ISO OSI的物理层Layer1,链路层Layer2,网络层Layer3的任务。
物理层:a.数据端设备提供传送数据的通路,数据通路可以是一个物理媒体,也可以是多个物理媒体链接而成。
链路层:链路层是为网络层提供数据传送服务的,这种服务要依靠本层具备的功能来实现。
(1)  链路链接的建立、拆除、分离。
(2) 帧定界和帧同步.链路层的数据传输单元是帧,协议不同,帧的长短和界面也有差别,但无论如何必须对帧进行定界.
(3) 顺序控制,指对帧的收发顺序的控制.
(4) 差错检测和恢复
网络层为建立网络连接和为上层提供服务

16.软件开发五个主要step是什么?

需求分析(30%)、系统设计(15%)、系统编码(40%)、测试运行5%、升级维护10%

 

17.makefile文件的作用是什么?

makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).创建程序(make程序)首先读取makefile文件,然后再激活编译器,汇编器,资源编译器和连接器以便产生最后的输出,最后输出并生成的通常是可执行文件.创建程序利用内置的推理规则来激活编译器,以便通过对特定CPP文件的编译来产生特定的OBJ文件.

 

18、UNIX显示文件夹中,文件名的命令是什么?能使文件内容显示在屏幕的命令是什么 ?

(1) l、lc、ls这三个命令都可以显示文件名,只是显示方式不同

(2) cat、more、vi都能显示文件内容,也是显示方式不同

 

19.一般数据库出现日志满了,会出现什么情况,是否还能使用?

只能执行查询等读操作,不能执行更改,备份等操作,原因是任何写操作都要记录日志,也就是说基本上处于不能用的状态。

 

20.SQL Server支持行级锁,设立封锁机制是为了对并发操作进行控制,对干扰进行封锁,保证数据的一致性和准确性。行级锁确保在用户取得被更新的行到该行进行更新这段时间不被其他用户所修改。因而保证数据的一致性又能提高数据操作的并发性。

 

21.强制执行垃圾回收:System.gc()。Runtime.getRuntime().gc()。 静态类:static的是属于类的,而不是属于对象的,相当于是全局的,不可能被回收 静态变量本身不会被回收,但是它所引用的对象应该是可以回收的。 gc只回收heap里的对象,对象都是一样的,只要没有对它的引用,就可以被回收(但是不一定被回收). 对象的回收和是否static没有什么关系!

 

22.Java中长生命周期的对象持有它的引用而导致不能回收,这就是java中内存泄露发生的场景。

 

23.几种垃圾回收机制:

(1)标记-清除回收器(2)标记-压缩回收器(3)复制收集器(4)增量收集器(5)分代收集器:存放不同寿命的对象(6)并发收集器(7)并行收集器

 

24.A a=new A(),a的空间是怎么样的?

首先在栈中定义了A类型的应用变量a,并在堆中实例化了一个A对象,然后让a指向A对象的首地址。  

若B继承A,A c=new B();c的空间是怎么样的? 这将属于动态绑定,或者执行期绑定或者后期绑定。

 

25.heap是由malloc之类的函数分配的空间所在地,地址是由低向高增长的。 stack是自动分配变量,以及函数调用的时候所使用的一些空间,地址是由高向低减少的。

 

26.Java类加载器分成:启动类加载器,标准扩展类加载器,路径类加载器和网络类加载器。 启动类加载器从本地系统中加载原始的JavaAPI类,用来启动java虚拟机。 其他三种加载器是在运行时加载用户定义的类。 标准扩展类加载器加载的是不同虚拟机提供商扩展的标准java类。 路径类加载器加载在classpath中的类。 网络加载器加载通过网络下载得到的类文件。 每种类加载器在加载类的时候建一个加载器实例。 类加载器采用双亲委派链模式:除了启动类加载器以外,每个类加载器都有自己的“双亲”。 在加载过程中,当发出加载请求的时候,加载器首先询问它的“双亲”——路径类加载器——来查找并加载这个类,而这个加载器也向他的双亲请求加载,一层一层请求上去,直到启动加载器获得请求,来查找并加载这个类。如果这个类没有被加载并且查找不到,返回结果给他的子加载器,由子加载器加载,知道请求返回给原来的加载器,这是如果还没有加载成功,由网络加载器试图存网络中寻找并下载,如果还不成功将跑出NoClassDefFoundError异常。 这个过程保证了:启动类加载器可以抢在标准类加载器之前加载类,而标准扩展类加载器又可以抢在路径类加载器之前加载类,最后才由网络类加载器加载。

 

27.java平台提供的原始安全模型是沙箱模型。沙箱模型的实质在于信任本地代码,使其可以完全访问重要的系统资源(例如文件系统);而对于下载的远程代码则不被信任,因此只能访问沙箱提供的有限资源。 Java沙箱是运行java小应用程序的一个软件单元,对java小应用程序的访问权限加以限制,防止它访问计算机的关键部分,如磁盘驱动器,网络套接层和内存区。 java沙箱由三部分组成:字节码检验器,类装载器和安全管理器。 类装载器:a.防止恶意代码干涉善意代码b.守护了被信任的类库边界c.将代码归入保护域,确定了代码可以进行哪些操作。

 

28. C++与java区别 Java:目标是安全性、可移植性和快速开发。被编译成字节码。Java去除了易出错的功能,垃圾回收取代内存管理,放弃了运算符重载和多继承。Java不能自动类型转换,有类型检查;对基本类型有规定的字节大小。 C++:更多关注性能,以及与c的兼容。被编译成本地机器码。保留了C的很多功能,如内存管理、指针和预处理。C++没有类型检查,基本类型的字节大小取决于C++(和C)的实现。

 

29.事件编程步骤: a.实现某一监听器接口(定义事件处理类并事件监听器接口) b.在事件处理类中重写其事件处理的函数体。 c.在创建AWT组件时注册时间处理代码以指定该监听器(响应者)是谁。

 

30.Java程序运行过程:

访问main(),加载器开始启动并找出相应类的编译代码(即.class文件),在根基础类执行static初始化,再在下一个衍生类执行,以此类推。必要的类装载完毕后,可以创建对象。这个对象中所有的基础数据都会被设置成默认值,而将对象句柄设置为null,随后调用基础类构建器。之后实例变量会按本来的顺序得以初始化。最后执行构建器剩余的主体部分。

 

31.局部变量前不能防止任何访问修饰符,final可以用来修饰局部变量。 abstract的methods不能以private,final修饰。 final的实例变量(或称成员变量)没有默认值,必须在constructor(构造器)结束之前被赋予一个明确的值。 如果两个method都在一个class中,一个是static的,另一个不是static的。则static method不能直接call non-static method。要用实例化的对象应用该方法。同样,static method 不能访问non-static instant variable. 从来没有人说过java的class名字必须和其文件名相同,但是 public class的名字必须和文件名相同。 若class C extends B implements A,其中B和A中都有x,两个x都匹配。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为public static final.所以可以通过A.x来明确。 一个接口继承另外一个接口用extends, 任何在interface中声明的interface variable(接口变量),默认为public static final。

 

32.int:原始类型   Integer:引用类型 java中包含三种引用类型即为数组,类,接口。储存在引用类型的类型变量中的值是该变量表示的值的地址。 注意:值类型的变量存放在栈里,引用类型的数据存放在堆中。

具体区别:

(1)值类型继承自ValueType(注意:而System.ValueType又继承自System.Object);而引用类型继承自System.Object。

(2)值类型的内存不由GC(垃圾回收,Gabage Collection)控制,作用域结束时,值类型会自行释放,减少了托管堆的压力,因此具有性能上的优势。例如,通常struct比class更高效;而引用类型的内存回收,由GC来完成。

(3)值类型是密封的(sealed),因此值类型不能作为其他任何类型的基类,但是可以单继承或者多继承接口;而引用类型一般都有继承性。

(4)值类型不具有多态性;而引用类型有多态性。

 

33.si +=a(a为任意数字)的定义为s1=((T)(s1+a)),T为a的类型。

float f=3.4不正确,精度不准确。float f=(float)3.4

switch(exp)中,exp是一个整数表达式(整形或字符型变量),因此传递给switch和case语句的参数应该是int,short,char,byte.

注意:long,string都不能用于exp.

1.byte字节数组,字符串在网络传输或存储前需要转换为byte数组,在从网络接收或从存储设备读取后需要将byte转换成String。

char是UNICODE字符,为16位的整数。

String是一个类,一般用来表示字符串的。

String和char为内存形式,byte是网络传输或存储的序列化形式。

运算符instanceof,如v1 instanceof v2。检查对象v1是否为class v2的一个实例。

将char数组转换成一个String对象:

char[] = data = {'s','t','r','i','n','g'};

String str = new String(data);

StringBuffer无法像String对象一样直接将字符串指定给StringBuffer对象,例如StringBuffer myString3="this is worong"。必须使用new生成StringBuffer对象。

StringBuffer对象有容量和长度之分,容量是不变的,长度是可变的。长度小于等于容量,表示实际存储的字符数目。 当存储的字符串长度超过其容量,容量会改为原来容量的两倍加上2。预先指定足够的容量效率较高。

将整数int转换成字符串String 三种方法:

String s = String.valueOf(i);

String s = Integer.toString(i);

String s = "" + i;

.低精度向高精度转换: byte,short,int,long,float,double,char

 

34.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

Math.round()方法是先将参数加上0.5然后去取它的Math.floor()值,Math.floor()可以获得一个数的整数部分,

Math.floor求最大的整数但不大于本身,而不是四舍五入

 

35.最常用的编程风格:

(1)类名首字母应该大写。

(2)为了常规用途而创建一个类时,请采取"经典形式",并包含下列元素的定义:equals();hashCode();toString();clone()(implement Cloneable)implement Serializable

(3) 对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。

(4) 应将方法设计成简要的、功能性单元。

(5) 让一切东西都尽可能地“私有”——private。只有private字段才能在非同步使用的情况下受到保护。

(6) 任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作.

(7) 尽可能细致地加上注释,并用javadoc注释文档语法生成自己的程序文档。

(8) 在一个特定的作用域内,若一个对象必须清除(非由垃圾收集机制处理),请采用下述方法:初始化对象;若成功,则立即进入一个含有finally从句的try块,开始清除工作。

(9) 尽量使用interfaces,不要使用abstract类。接口主要描述了客户希望做什么事情,而一个类则致力于(或允许)具体的实施细节。

(10) 在构建器内部,只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法,因为那些方法可能被其他人覆盖或取消,从而在构建过程中产生不可预知的结果。

(11) 请记住,阅读代码的时间比写代码的时间多得多。

posted on 2013-08-08 20:07  peggy89321  阅读(209)  评论(0编辑  收藏  举报