趋势科技面试题汇总

1,479 阅读20分钟

着重准备计算机网络和操作系统

1.要暂停一个线程,可以使用哪些方法?怎么终止他们?

暂停:wait、sleep。

  • yiled是让步,会使当前线程由运行状态进入到就绪状态,让其他优先级高线程先执行,但是如果是同一优先级的线程,那么谁先执行就不确定了.它不会释放锁

  • wailt等待,会使当前线程进入阻塞状态,并且会释放锁

  • sleep()休眠,会使当前线程进入休眠阻塞状态,但不会释放锁

终止:

1、使用 volatile 关键字修饰变量的方式终止

2、使用 interrupt() 方式终止

3、Stop 方法终止(强制关机可能有不安全)

2.mysql的连接(内连接、左连接、右连接,mysql没有全连接)

内连接需要两个表查询结果的交集,都有才显示 左连接以左表为主表,查询结果添加进来

3.说一下git常用命令

4.linux的目录结构是什么样,动态库一般放在哪个目录?

5.Mybatis中接收参数有哪些?"#"和"$"常用哪个,为什么?

  • 1.sql注入 2.参数值是表名 3.排序的时候
  • #{}是以预编译sql语句的形式(PreparedStatement)设置了占位符?可以防止sql注入,而${}会直接将参数封装在sql语句里面,会有sql注入的安全问题。
  • ${args}一般用于传入数据库对象,使用用最多的方式是动态传入表名;
  • mybatis排序时用{args},select * from table order by{字段}.
  • 大多数情况下,我们取参数的值都应该去使用#{}。

6.Mybatis怎么返回一个自增主键的值?

  • 在xml中定义useGeneratedKeystrue,返回主键id的值,keyProperty和keyColumn分别代表数据库记录主键字段和java对象成员属性名
 <!-- 插入数据:返回记录主键id值 -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id"  keyColumn="id">
	insert  into stu (name,age) values (#{name},#{age})
</insert>
  • 在接口映射器中通过注解@Options分别设置参数useGeneratedKeys,keyProperty,keyColumn值
// 返回主键字段id值
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert  into stu (name,age) values (#{name},#{age})")
void insert(Student stu);

获取主键id需要读取Java对象的主键属性即可。

7.FTP传文件的两种模式

主动模式和被动模式

8.http和https相比不安全在哪。两者默认端口是多少

http的默认端口是 80
https的默认端口是443

HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。

HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密

  • 对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等;

  • 非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。

9.a++与a+1有什么区别,效率如何

10.进程与线程的区别,进程与线程的通信方式

线程是调度和分配的基本单位 ,进程是资源拥有的基本单位 。 线程是进程划分成的更小的运行单位,一个进程在其执行的过程中可以产生多个线程。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。

进程通信方式:

  • 管道/匿名管道(Pipes):用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。
  • 有名管道(Names Pipes) : 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
  • 信号(Signal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
  • 消息队列(Message Queuing) :消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比 FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺。
  • 信号量(Semaphores) :信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。
  • 共享内存(Shared memory) :使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式
  • 套接字(Sockets) : 此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。可以支持不同IP地址主机的进程通信。

线程间的同步方式

  • 互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。
  • 信号量(Semphares) :它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量
  • 事件(Event) :Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操

11.OSI中,路由器处于哪一层(网络层)

物理层:网线,集线器,中继器,调制解调器

数据链路层:网卡、网桥,交换机

网络层:路由器

层:物联网淑慧试用

12.如何确定两个局域网内的主机之间可以实现数据互通(ping)?ping是怎么实现的?

Ping发送一个ICMP(Internet Control Messages Protocol),即因特网信报控制协议;接收端回声消息给目的地并报告是否收到所希望的ICMPecho (ICMP回声应答)。它的原理是:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,通过对方回复的数据包来确定两台网络机器是否连接相通,时延是多少 。ping是端对端连通

PING是应用层直接使用网络层ICMP的一个例子,它没有通过运输层的TCP或UDP。ICMP报文封装在ip包里,所以ICMP属于网络层协议。

13.问了如何实现一个式子的求和操作,逆波兰表达式的实现?

14.ICMP协议以及应用

ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 ICMP使用IP的基本支持,就像它是一个更高级别的协议,但是**,ICMP实际上是IP的一个组成部分**,必须由每个IP模块实现。

  • 两种应用pingtracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径

15.如果使用TCP连接,传输一个很大的数据,那么tcp是如何传输的?

16.Java中Socket编程使用到的方法的名称及流程。

服务器端1.new ServerSocket,2.serversocket.accept等待连接进入阻塞状态。 客户端1.new Socket,2.开始写入读取数据。

17.TCP建立连接具体过程

  • 三次握手
  • 客户端向服务器发送syn,客户端进入SYN_SEND状态
  • 服务器端收到SYN报文,回应一个SYN (SEQ=2032)ACK(ACK=1022+1)报文,服务器段进入SYN_RECV状态。注意:服务器根据syn=1判断客户端请求建立连接,返回ack=1
  • 客户端收到服务器端的SYN报文,回应一个ACK(ACK=2032+1)报文,进入Established状态。

注意:确认ack number是否与第一次发送(seq number+1)相等,并ack=1。正确,发送ack number = seq number(服务器顺序编号)+1

18.浏览一个网页的过程、依次用到了哪些协议。

  • 1.DNS解析
  • 2.TCP连接
  • 3.发送HTTP请求
  • 4.服务器处理请求并返回HTTP报文
  • 5.浏览器解析渲染页面
  • 6.连接结束

19.socket通信建立过程,connect对应于TCP链接的哪个过程

  • 1.服务器创建ServerSocket,bind绑定端口,listen、accept开始接受socket连接。
  • 2.客户端创建Socket,执行connect。

1.客户端socket对象connect调用之后进行阻塞,此过程发送了一个syn。

2.服务器内核完成三次握手,即发送syn和ack应答。

3.客户端socket对象收到服务端发送的应答之后,再发送一个ack给服务器,并返回connect调用,建立连接。

4.服务器socket对象接受客户端最后一次握手确定ack建立连接。

5.此时服务端调用accept,则从连接队列中将之前建立的连接取出返回。

20.Linux线程模型有哪些

  • 一对一:内核态和用户态切换频繁。并发性能差。
  • 多对一:并发性能好,但是如果其中一个用户线程阻塞,那么该其他用户线程也无法执行。
  • 多对多:一个用户线程阻塞时,其他用户线程仍然可以执行。并发性能好。

21.springboot和spring有什么区别,详细说说

1、Spring Boot提供极其快速和简化的操作,让 Spring 开发者快速上手。回

2、Spring Boot提供了 Spring 运行的默认配置。

3、Spring Boot为通用 Spring项目提供了很多非功能性特性,嵌入 Tomcat , Jetty Undertow 而且不需要部署他们。

22.redis有哪些数据结构,你为什么要用redis,哪里用到了,为什么说redis快,多路io复用详细原理可以说说嘛?

  • redis有五种数据结构。string,list,hash,set,sortedset。
  • 多路 I/O 复用模型

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量。

epoll 优点:

epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一般来说这个数目和系统内存关系很大 ,具体数目可以 cat /proc/sys/fs/file-max 察看。   2. 效率提升, Epoll 最大的优点就在于它只管你“活跃”的连接 ,而跟连接总数无关,因此在实际的网络环境中, Epoll 的效率就会远远高于 select 和 poll 。   3. 内存拷贝, Epoll 在这点上使用了“共享内存 ”,这个内存拷贝也省略了 当调用epoll_wait检查是否有事件发生时,只需要检查eventpoll对象中的rdlist双链表中是否有epitem元素即可。如果rdlist不为空,则把发生的事件复制到用户态,同时将事件数量返回给用户

23.手写堆排序,快排,归并排序

24.数据库分库分表是怎样的,实践过么,隔离级别,已提交读和未提交读什么区别?数据库内连接外连接?

25.jdk8的新特性知道哪些,lamda表达式写一个例子?并行流可以写一下吗?

  • Lambda 表达式
  • 函数式接口(@FunctionalInterface)
  • 接口可以实现默认方法
  • Stream流
    //串行流
    count = strings.stream().filter(string->string.isEmpty()).count();
      System.out.println("空字符串数量为: " + count);
    // 并行流
      count = strings.parallelStream().filter(string -> string.isEmpty()).count();
      System.out.println("空字符串的数量为: " + count);
    //Collectors使用
     filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());
      System.out.println("筛选后的列表: " + filtered);

26.hashmap和concurrenthashmap有什么区别,你说hashmap不安全,哪里不安全,形成环状?怎么形成的?

  • HashMap是线程不安全的,ConcurrentHashmap是线程安全的。
  • HashMap不安全的原因在于扩容的时候多线程的参与会造成前后节点之间相互引用,造成链环。

27.synchronize关键字用在方法上锁住的是什么?那锁住了对象的什么?

如果是静态方法锁住的是当前类对象,如果是非静态方法锁住的是当前对象。 一个类的对象锁和另一个类的对象锁是没有关联的

28.jvm的gc算法有哪些,分别用在什么时候什么场景,你知道的垃圾收集器用了什么gc算法?

1、引用计数算法(Reference counting) 每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,该对象死亡,计数器为0,这时就应该对这个对象进行垃圾回收操作。

2、标记–清除算法(Mark-Sweep) 为每个对象存储一个标记位,记录对象的状态(活着或是死亡)。 分为两个阶段,一个是标记阶段,这个阶段内,为每个对象更新标记位,检查对象是否死亡;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行 GC 操作。

3、标记–整理算法 标记-整理法是标记-清除法的一个改进版。同样,在标记阶段,该算法也将所有对象标记为存活和死亡两种状态;不同的是,在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存活的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。这样就达到了标记-整理的目的。

4、复制算法 该算法将内存平均分成两部分,然后每次只使用其中的一部分,当这部分内存满的时候,将内存中所有存活的对象复制到另一个内存中,然后将之前的内存清空,只使用这部分内存,循环下去。

这个算法与标记-整理算法的区别在于,该算法不是在同一个区域复制,而是将所有存活的对象复制到另一个区域内。

5、JVM不同的版本垃圾回收机制不一样,jdk1.7和1.8新版本和老版本区别 jdk1.7和1.8旧版本Parallel Old,(老年代) jdk1.7和1.8新版本Parallel Scavenge,(新生代)

  • Parallel Old 收集器 Parallel Scavenge收集器的老年代版,使用多线程与标记–整理算法。这个收集器在jdk1.6中才开始提供的,直到Parallel Old 收集器出现后,“吞吐量优先”收集器终于有了比较名副其实的应用组合,在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加 Parallel Old收集器

  • Parallel Scavenge收集器 Parallel Scavenge收集器是一个新生代的手机器,使用的是复制算法的收集器,而且也是多线程的收集器。。Parallel Scavenge收集器,目标达到一个可控制的吞吐量,使用-XX:MaxGCPauseMillus参数控制垃圾停顿时间,使用-XX:GCTimeRatio参数控制吞吐量。Parallel Scavenge收集器设置-XX:UseAdaptiveSizePolicy参数,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大吞吐量(GC自使用的调节策略)。 自适应调节策略也是Parallel Scavenge收集器和ParNew收集器一个重要的区别。

29.匿名内部类类知道么,说一说?静态内部类和非静态内部类的区别?

  • 匿名内部类是一种没有类名的内部类,他必须继承其他类或实现其他接口,比如当我们重写集合的compare方法时,就可以采用匿名内部类。
  • 静态内部类被声明为static,他可以不依赖于外部类实例而被实例化。非静态内部类需要再外部类实例化后才能实例化。
  • 静态内部类不能与外部类有相同的名字,只能访问外部类中的静态成员和静态方法。非静态内部类可以自由的引用外部类的静态或者非静态成员和方法,非静态内部类中不能有静态成员

30.drop,truncate,delete 三者的区别

  • drop:删除内容和定义,释放空间。(表结构和数据一同删除)
  • truncate:删除内容,释放空间,但不删除定义。(表结构还在,数据删除)
  • delete:删除内容,不删除定义,也不释放空间。

30.git中的push和commit的区别

  • git commit操作的是本地库,git push操作的是远程库。
  • git commit是将本地修改过的文件提交到本地库中。
  • git push是将本地库中的最新信息发送给远程库。

31.TCP和UDP的区别

1、连接方面区别

  • TCP面向连接(如打电话要先拨号建立连接)。 UDP是无连接的,即发送数据之前不需要建立连接。

2、安全方面的区度别

  • TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢问失,不重复,且按序到达。UDP尽最大努力交付,即不保证可靠交付。

3、传输效率的区别

  • TCP传输效率相对较低。 UDP传输效率高,适用答于对高速传输和实时性有较高的通信或广专播通信。

4、连接对象数量的区别

  • TCP连接只能是点到点、一对一的。 UDP支持一对一,一属对多,多对一和多对多的交互通信。

32.tcp释放连接timewait发生在什么时候

当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,又称2MSL状态

timewait维持2MSL(报文最大生存时间)的作用

  • 等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。

33.为什么连接的时候是三次握手,关闭的时候却是四次握手?

  • 因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时**,很可能并不会立即关闭SOCKET**,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

34.ARP协议是哪一层的(一般说网络层)?

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

35.TCP数据包一般多大?

由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bits=6Bytes+SMAC源MAC地址48bits=6Bytes+Type域2Bytes)14Bytes和帧尾CRC校验部分4Bytes那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU

UDP 包的大小就应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes)

TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)

如果我们定义的TCP和UDP包没有超过范围,那么我们的包在IP层就不用分包了,这样传输过程中就避免了在IP层组包发生的错误;

如果超过范围,即IP数据报大于1500字节,发送方IP层就需要将数据包分成若干片,而接收方IP层就需要进行数据报的重组。更严重的是,如果使用UDP协议,当IP层组包发生错误,那么包就会被丢弃。接收方无法重组数据报,将导致丢弃整个IP数据报。UDP不保证可靠传输;但是TCP发生组包错误时,该包会被重传,保证可靠传输。

36.子网掩码的作用

  • 它有两个主要作用:一是屏蔽部分IP地址,区分网络标识和主机标识,解释IP地址是在局域网上还是在远程网络上;
  • 其次将一个大的IP网络划分为几个小的子网络。