刷题2022年5月14日

171 阅读12分钟

1、关于inline函数的使用,以下哪些选项的描述是正确的()

inline函数应该简洁,如果语句较多,不适合定义为内联函数
 inline函数中,一般不建议有循环、ifswitch语句,否则,
 函数定义时即使有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());
  1. HashMap,TreeMap 未进行同步考虑,是线程不安全的。

  2. HashTable 和 ConcurrentHashMap 都是线程安全的。区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。

  3. 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。