字符串
1.去除字符串首尾空格
首先,String类中提供了trim()方法来去除字符串的首尾空格,但是如果我们只想去除头部,或者只想去除尾部的空格,该怎么办呢?
如果想去除头部的空格,可以在尾部拼接一个字符串,然后对新字符串调用trim()方法,然后再使用subString()方法,去掉拼接的字符串
String str = " a bbbdd ";
//去掉前面的空格
String temp = (str + "a").trim();
String temp2 = temp.substring(0, temp.length()-1);
System.out.println(temp2);
//去掉后面的空格
String tempR = ("a" + str).trim();
String tempR2 = tempR.substring(1);
System.out.println(tempR2);
线程
1.什么是进程,线程?
进程是资源分配的基本单位,比如我们打开qq,打开微信,就是开启了一个进程
线程是cpu执行和调度的基本单位,单核下cpu一次只能执行一个线程
区别在于
1.进程拥有独立的地址空间和资源,不同进程之间相互独立;而同一个进程下的线程共享地址空间和资源
2.进程之间相互独立,所以进程间的通信比较困难,而多个线程可以通过全局变量等形式来完成通信
3.线程由于共享资源,所以上下文切换的时候比进程快
2.为什么wait(),notify(),notifyAll()等方法都定义在Object类中?
首先这几个方法都是用于多线程同步时的方法,而多线程的同步是通过锁对象来完成的,同步中锁对象可以是任意对象,当然一般我们惯例上会用当前类或者当前类的运行时类,但是也可以是其他类,所以只能把这些方法定义在Object类中,因为Object类是所有类直接或者间接的父类,这样才能保证任意的类都可以作为锁对象。
3.java中线程如何实现交互?
线程之间的交互主要是通过同步中的wait(),notify(),notifyAll()这几个方法来实现的,当然wait还有有两个重载方法。这几个方法都只能在同步中使用(原因是因为这几个方法是Object类中的方法),wait()是使当前线程进入等待状态,同时释放锁对象,直到其他线程调用notify()或者notify()方法后,才能从等待阻塞状态中进入就绪状态;notify(),notifyAll()是唤醒此对象监视器下的单个和全部线程,但是仅仅使得被唤醒线程进入就绪状态,哪个线程能获得执行权还是随机的。
对象监视器是一个计数器,用synchronized上锁可以使记数器+1,释放锁使记数器-1。
计算机网路基础
1.tcp为什么3次握手,4次挥手
1.三次握手的目的是为了防止已经失效了的连接请求报文段突然又连接到了客户端,因而产生错误。比如出现这种情况,client发出的第一个连接请求报文段并没有丢失,而是在某个网络节点长时间的滞留了,导致延误到连接释放后的某个时间才到达server。这本来是一个已经失效的报文段,但是server接收到此失效的请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不是采用三次握手而是两次握手,那么只要sever发出确认,新的连接就建立了,由于现在client并没有发出建立连接的请求,所以不会理睬server的确认,也不会向server发出数据,但是sever却以为新的运输连接已经建立了,所以一直在等待client发来数据,这样server的很多资源就被浪费了。采用三次握手可以防止这种现象的发生,client不会向server的确认发出确认,server由于没有收到确认,就知道client没有要求建立连接,说白了主要目的是为了防止server端一直等待,浪费资源。