1.ASCLL码、GB2312、UTF-8、Unicode
Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案
ASCLL码是最早的一种字符编码方案,在计算机里,用字符表示26个字符的大小写、数字加上其他常用符号,加起来不到100个,一次使用7个bite位就可以高效的存储和处理ascll码,剩下的最高1比特用于一些通讯系统的奇偶校验。(字节代表系统能够处理的最小单位,不一定是8比特。只是现代计算机的事实标准就是用8比特来代表一个字节。)
GB2312是中文字符集,涵盖了所有简体字符以及一部分其他字符;GBK(K即扩展的意思)则在GB2312的基础上加入了对繁体字符等其他非简体字符。
在Unicode出现之前,所有的字符集都是和具体编码方案绑定在一起的,都是直接将字符和最终字节流绑定死了,例如ASCII编码系统规定使用7比特来编码ASCII字符集;GB2312以及GBK字符集,限定了使用最多2个字节来编码所有字符,并且规定了字节序。这样的编码系统通常用简单的查表,也就是通过代码页就可以直接将字符映射为存储设备上的字节流了。 差,因此,可扩展性差
Unicode:希望在一份文档中显示所有字符。为了解决这个问题,我们需要一个全人类达成共识的巨大的字符集,这就是Unicode字符集。Unicode将字符集和字符编码方案分离开。
2.段、堆和栈的区别和联系
一个程序一般分为三段:text段、data段和bss段
text存放代码,编译时确定,只读
data存放在编译阶段,而不是运行时,就能确定的数据,可读可写,就是常说的静态存储区,赋值了大小的全局变量、静态变量以及常量存放在这个地方;
bss段,存放没有赋值的全局变量和静态变量
以上是段,下面分析堆和栈的区别和联系,这个也是经常会考到的题目,做过好多遍,每次都记不住,这里再做总结
栈:由编译器自动分配释放,存放函数的参数值,局部的变量等,具体操作方式类似于栈;
堆:一般由程序猿分配释放,若未释放则会被OS收回。具体结构区别于数据结构中的堆;需要程序员自己申请,并指明大小,在c中malloc函数
全局变量区(静态区):存放全局变量和静态变量等,初始化和未初始化的会分开存放;
文字常量区:常量字符放在该区域。程序结束后由系统释放;
下面给出例子:
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
3.进程和线程的区别
这个题目也是必考题了,但还是会弄混,怪自己没有理解透彻了- -
本质:是否共享地址空间
进程是不共享地址空间的,而线程是共享地址空间的
进程是资源分配的基本单元,而线程是内存分配的基本单元
一个进程可以分为多个线程,而一个线程只能属于一个进程;
只由一个线程组成的进程又称单线程。一个进程里面的多个线程可以共享资源,因此可能会产生资源的竞争等
4.
已知String类定义如下:
class String
{
public:
String(const char *str = NULL); // 通用构造函数
String(const String &another); // 拷贝构造函数
~ String(); // 析构函数
String & operater =(const String &rhs); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
尝试写出类的成员函数的实现。
String::String(const char *str=NULL)
{
if(str==NULL)//代码中一些基本的异常输入必须先排除
{
m_data = new char[1] ;
m_data[0] = '\0' ;
}
else
{
m_data=new char[strlen(str)+1];
strcpy(m_data,str);
}
}
String::String(const String &another)//有参数
{
m_data=new char(strlen(another)+1);
strcpy(m_data,other.m_data);
}
String ::String &operator=(const String &rhs)
{
if(this.m_data==rhs.m_data)
return this;
delete[]m_data;//为什么要是数组形式的删除?
m_data=new char[strlen(rhs)+1];
strcpy(this.m_data,rhs.m_data);
return *this;
}
String::~String()
{
delete m_data;
}
5.类的加载过程
java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序如下:1.首先加载要创建类以及直接与间接的父类
2.在类被加载的时候会将静态变量也加载,主要包括静态变量的初始化,静态语句的执行,在加载时按照代码的先后顺序执行
3.需要的类加载完成后,开始创建对象,首先会创建非静态成员,主要包括非静态变量的初始化,非静态语句的执行,在加载时按照代码的想顺序执行
4.最后执行构造器,构造器执行完毕,对象生成
6.java捕获异常的方式
java语言提供两种异常处理机制:捕获异常和声明抛弃异常;
1)捕获异常:在Java程序运行过程中系统得到一个异常对象是,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这种类型异常的方法后,运行时系统把当前异常交给这个方法处理;如果找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。捕获异常是通过try-catch-finally语句实现的。语法为:
try{
...
}catch(ExceptionName1 e){
...
}catch(ExceptionName2 e){
...
}
...
}finally{
...
}
2)声明抛弃异常:当Java程序运行时系统得到一个异常对象时,如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛弃异常。声明抛弃异常是在一个方法声明中的throws子句中指明的。如:
public int read() throws IOException{
...
}
其中throws IOException就是声明抛弃异常,throws后可以跟多个异常类型。
7.iframe的缺点
*iframe会阻塞主页面的Onload事件;
*iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载。
使用iframe之前需要考虑这两个缺点。如果需要使用iframe,最好是通过javascript
动态给iframe添加src属性值,这样可以可以绕开以上两个问题。
8.statement与preparedstatement有什么区别,哪个性能更好?
preparedStatement性能更好,
b。sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法
c.wait.notifyhe notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
d.wait.notifyhe notifyAll不需要捕获异常,而sleep需要捕获异常
10.try里面有return了,后面的finally还执行吗,如果执行,那么实在return之前还是之后执行?
后面的finally还执行,在return之前执行
在try语句中,要返回的语句已经准备好了,就在此时,程序转到执行finally,在转去之前先把要返回的值存于局部变量中,执行完finally后,再将该值取出,return。