1、关于inline函数的使用,以下哪些选项的描述是正确的()
inline函数应该简洁,如果语句较多,不适合定义为内联函数
inline函数中,一般不建议有循环、if或switch语句,否则,
函数定义时即使有inline关键字,编译器也可能会把该函数作为非内联函数处理。
inline函数要在函数被调用之前声明。
2、关于以下说法中,错误的有:()
某软件有学生优惠,我借用师弟师妹的学生证购买,可以获得正版授权
个人版的某软件可以免费获得授权,我可以把它拷到公司使用
发现跳过某软件激活的方法,去论坛发帖,公布下教程
某软件太贵了,找找开源替代方案,这样就不会侵权问题了
3、假设有一个栈,元素依次进栈的顺序是A,B,C,D,E。下列不可能的出栈顺序是( )
正确答案: D 你的答案: B (错误)
E,D,C,B,A
A,B,C,D,E
B,C,D,E,A
E,A,B,C,D
↓代表进栈,↑代表出栈。
A选项:A↓,B↓,C↓,D↓,E↓,E↑, D↑, C↑, B↑, A↑
B选项:A↓, A↑,B↓, B↑,C↓, C↑,D↓, D↑,E↓, E↑
C选项:A↓, B↓, B↑, C↓, C↑,D↓, D↑,E↓, E↑, A↑
D选项:无法实现
4、以下关于死锁,描述正确的有? ( )
有序分配锁资源可以预防死锁
剥夺死锁进程的所有资源可以解除死锁
银行家算法是用来预防死锁的
5、关于主键,描述正确的是()
主键不可以为空
建立主键的同时也会建立一个唯一性索引
主键可以包含多个属性,如联合主键
一个表只能有一个主键,不能有多个主键。 主键不能为空,以确保表的数据是唯一的。 联合主键也是一个主键。
6、在对信号的进样采样过程中,当采样频率至少大于()时,才可能完整地保留原始信号中的信息。
最高频率的2倍
7、下面对于进程和线程的叙述正确的是
地址空间:进程至少有一个线程,线程共享进程的地址空间,而进程有自己独立的地址空间
进程是资源分配和拥有的单位,同一进程内的线程共享进程的资源
两者均可并发执行
进程和线程的区别
地址空间:
线程共享本进程的地址空间,而进程之间是独立的地址空间。
资源:
线程共享本进程的资源如内存、I/O、cpu等,不利于资源的管理和保护,而进程之间的资源是独立的,能很好的进行资源管理和保护。
健壮性:
多进程要比多线程健壮,一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。
执行过程:
每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口,执行开销大。
但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,执行开销小。
可并发性:两者均可并发执行。
切换时的资源消耗:
进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
基本单位:
线程是处理器调度的基本单位,进程是系统进行资源分配和调度的基本单位。
8、下面哪种方法可以避免编译器对结构体进行对齐优化?
struct {
unsigned char head;
unsigned char sector;
unsigned char cylinder;
}__attribute__((packed));
struct {
unsigned char head;
unsigned char sector;
unsigned char cylinder;
}__attribute__((aligned(0)));
加上__attribute__((packed)),可以防止编译器对结构进行字节对齐优化。
使用__attribute__((aligned(0)))(0为对齐字节数),强制编译器按照0字节对齐。
9、下面关于构造函数和析构函数说法正确的是( )
delete 只会调用一次析构函数,而delete[]会调用每一个成员的析构函数
析构函数的调用次序:先派生类的析构后基类的析构
构造函数的调用次序:先基类的构造后派生类的构造
构造函数:先有基类构造,再有派生类构造。派生类可以对基类构造函数进行重载。 析构函数:从派生类先开始析构,再析构基类。因为派生类构造函数是重载的,所以要先析构。 二者的过程是相反的。
10、关于Java 中的垃圾回收,下列说法错误的是:()
正确答案: A B
可以使用System.gc()来显式进行垃圾回收,但是不保证能够执行
因为有垃圾回收机制,所以java 不会存在内存泄漏问题
GC 是 JVM内部的一个线程,回收无效对象的内存用于将来的分配
创建对象时,GC就开始监控这个对象的地址,大小及使用情况
调用了System.gc()只是告诉虚拟机要回收,但究竟什么时候回收又虚拟机说了算,java垃圾回收机制就是这样,一般等到内存快不够用了才回收。
11、在Java 的 switch(expression) 语句中, expression 的数据类型可以是( )
byte short int char 枚举
12、请你说一下抽象类和接口的区别
- 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其它类实现和继承
- 接口和抽象类都可以有抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法 在用法上,接口和抽象类也有如下差异:
- 接口里只能包含抽象方法和默认方法,不能为普通方法提供方法实现;抽象类则可以包含普通方法。
- 接口里只能定义静态常量,不能定义普通成员变量;抽象类里既可以定义普通成员变量,也可以定义静态常量
- 接口里不包含构造器;抽象类可以包含构造器,但抽象类的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作
- 接口里不能包含初始化块,抽象类则可以包含初始化块
- 一个类最多只能有一个父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足 总之,接口通常是定义允许多个实现的类型的最佳途径,但当演变的容易性比灵活性和功能更加重要时,应该使用抽象类来定义类型。
加分回答 :
在二者的设计目的上,接口作为系统与外界交互的窗口,体现了一种规范。对于接口的实现者来说,接口规定了实现者必须向外提供哪些服务;对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务。当在一个程序中使用接口时,接口是多个模块间的耦合标准;当在多个应用程序之间使用接口时,接口是多个程序之间的通信标准
抽象类则不一样,抽象类作为系统中多个子类的共同父类,它体现的是一种模板式设计。抽象类作为多个子类的父类,它可以被当作系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能,但这个产品依然不能当作最终产品,必须要有更进一步的完善。这种完善可能有几种不同方式。
1.抽象类多用于在同类事物中有无法具体描述的方法的场景,而接口多用于不同类之间,定义不同类之间的通信规则。
2.接口只有定义,而抽象类可以有定义和实现。
3.接口需要实现implement,抽象类只能被继承extends,一个类可以实现多个接口,但一个类只能继承一个抽象类。
4.抽象类倾向于充当公共类的角色,当功能需要累积时,用抽象类;接口被运用于实现比较常用的功能,功能不需要累积时,用接口。
13、线程安全的map在JDK 1.5及其更高版本环境 有哪几种方法可以实现?
正确答案: C D 你的答案: A B C D (错误)
Map map = new HashMap()
Map map = new TreeMap()
Map map = new ConcurrentHashMap();
Map map = Collections.synchronizedMap(new HashMap());
-
HashMap,TreeMap 未进行同步考虑,是线程不安全的。
-
HashTable 和 ConcurrentHashMap 都是线程安全的。区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。
-
Collections 类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合。比如,
List list = Collections.synchronizedList(new ArrayList());
Set set = Collections.synchronizedSet(new HashSet());
14、在Java中,HashMap中是用哪些方法来解决哈希冲突的?
链地址法
常见的哈希冲突解决方法:
1.开放地址法
2.链地址法(拉链法)
3.再散列
4.建立一个公共溢出区
以上方法都是解决哈希填冲突的策略,但是在java.util.HashMap中,总体来说是使用的链地址法来解决冲突的。
当然了,使用链地址***导致get的效率从o(1)降至o(n),所以在Java8中,使用的是平衡树来解决提高效率的。
解决哈希冲突常用的两种方法是:开放定址法和链地址法\
开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的 地址则表明表中无待查的关键字,即查找失败。 \
链地址法:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。
15、java中将ISO8859-1字符串转成GB2312编码,语句为
new String("字符串".getBytes("ISO8859-1"),"GB2312")
16、在jdk 1.7中,以下说法正确的是
Java中所有的非抽象方法都必须在类内定义
1.8接口可以定义default方法和static方法;1.9接口中可以定义私有方法。
因此在JDK1.7中,接口只能定义抽象方法,既Java中所有的非抽象方法都必须在类内定义。
17、java中下面哪些是Object类的方法
- protected Object clone()创建并返回此对象的一个副本。
- boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
- protected void finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
- class getClass()返回此 Object 的运行时类。
- int hashCode()返回该对象的哈希码值。
- void notify()唤醒在此对象监视器上等待的单个线程。
- void notifyAll()唤醒在此对象监视器上等待的所有线程。
- String toString()返回该对象的字符串表示。
- void wait()在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
- void wait(long timeout)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
- void wait(long timeout, int nanos)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。
18、在使用super和this关键字
在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过
1、super()表示调用父类构造函数、this()调用自己的构造函数,而自己的构造函数第一行要使用super()调用父类的构造函数,所以这俩不能在一个构造函数中会出现重复引用的情况
2、super()和this()必须在构造函数第一行,所以这一点也表明他俩不能在一个构造函数中
3、this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块(里面不能使用非static类型的)。
19、Java的特点和优点
1.面向对象(封装、继承、多态)
2.跨平台运行
3.安全性
4.多线程
5.支持网络编程
6.强大的生态社区
Java为什么可以跨平台
JVM(Java虚拟机)是Java跨平台的关键。 在运行程序之前,Java源代码(.java)需要经过编译器,将源代码翻译成字节码(.class),但字节码不能直接运行,所以必须通过JVM将字节码翻译成特定平台的机器码运行程序。但跨平台的是Java程序、而不是JVM,所以需要在不同平台下安装不同版本的JVM。