目录
1. 作用域public,private,protected,以及不写时的区别?
2,说说String、StringBuilder、StringBuffer区别?
4,线程相关?调度线程使其运行的是.start(),run()
6,谈谈final, finally, finalize的区别
10,说说TCP三次握手?(管道。内存共享。消息队列。信号量)进程通信
1. 作用域public,private,protected,以及不写时的区别?
作用域与可见性 | 当前类 | 同一package | (同包和不同包)子类 | 其他package |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
当前类private---同一个包default-----子类protected-----其他包public 主要是作用域不同!
2,说说String、StringBuilder、StringBuffer区别?
- String 字符串常量、StringBuffer 字符串变量(线程安全)、StringBuilder 字符串变量(非线程安全)
他们三者的区别,总的来说就是String是不可变的,是一个字符串常量,而StringBuffer和StringBuilder都是一个变量,对于StringBuffer则是线程安全的,而StringBuilder则是非线程安全的,其他的两者几乎一样。根据这三者的区别用法如下:
当操作数据量较小可采用String
数据量比较大且需要修改字符串的话最好使用StringBuffer或者StringBuilder
在单线程中使用StringBuilder
在多线程中使用StringBuffer
总的来说StringBuffer线程安全但是效率低,而StringBilder非线程安全但是效率高
3,关于overload(重载)和override(重写)
4,线程相关?调度线程使其运行的是.start(),run()
Java的线程是通过java.lang.Thread类来实现的。JVM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。线程有5状态
- 创建状态new Thread()。生成线程对象,并未调用该对象的start方法时候。
- 就绪状态start()。1:调用了线程对象的start方法之后,调度程序未把该线程设置为当前线程。2:在线程运行之后,从等待或者睡眠中回来之后。
- 运行状态run()。线程调度程序把就绪状态的线程设置为当前线程,进入运行状态。
- 阻塞状态blocker()。线程正在运行的时候,被暂停,通常是为了等待某个事件的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
- 死亡状态stop()。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。已经死亡的线程,无法再用start方法进入就绪状态。
5,面向对象的特征有哪些方面
主要有以下四方面:(貌似也可以答3个方面)
1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2. 封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
3. 继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,叫派生类(子类),而原始叫基类(父类)。子可以在父继承方法和实例变量,还可以修改或增加新的方法。
4. 多态:多态性是指允许不同类的对象对同一消息作出响应。多态灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
6,谈谈final, finally, finalize的区别
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的
7,创建线程的方式及实现?
继承 Thread 类创建线程;
A)定义 Thread 类的子类,并重写该类的 run() 方法,该 run() 方法的方法体就代表了线程要完成的任务,因此把 run() 方法称为执行体;B)创建 Thread 子类的实例,即创建了线程对象; C)调用线程对象的 start() 方法来启动该线程。
实现 Runnable 接口创建线程;
A)定义 runnable 接口的实现类,并重写该接口的 run() 方法,该 run() 方法的方法体同样是该线程的线程执行体;
B)创建 Runnable 接口实现类的实例,并依此实例作为 Thread 的 target 来创建 Thread 对象,该 Thread 对象才是真正的线程对象;
C)调用线程对象的 start() 方法来启动该线程。
使用 Callable 和 Future 创建线程。
A)创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值;
B)创建 Callable 实现类的实例,使用 Future Task 类来包装 Callable 对象,该 Future Task 对象封装了该 Callable 对象的 call() 方法的返回值;
C)使用 Future Task 对象作为 Thread 对象的 target 创建并启动新线程;
D)调用 Future Task 对象的 get() 方法来获得子线程执行结束后的返回值。
三种方式的比较:
1> 通过 Runnable 和 Callable 创建多线程:
优势:
A)线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类;
B)在这种方式下,多个线程可以共享同一个 target 对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将 CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
劣势:
C)编程稍微复杂,如果要访问当前线程,必须使用 Thread.currentThread() 方法。
D) Runnable 和 Callable 的区别:
重写的方法是 run() 重写的方法是call()
Runnable的任务是不能返回值的 Callable的任务执行后可返回值
run()方法不可以抛出异常 call() 方法可以抛出异常
运行 Callable 任务可以看到一个 Future 对象,表示异步计算的结果。
使用继承 Thread 类的方式创建多线程:
优势:
如果要访问当前线程,则无需使用 Thread.currentThread() 方法,使用 this即可;
劣势:
已经继承了 Thread 类,不能再继承其他父类。
8,不通过构造函数也能创建对象么?答案:对!
(1) 用new语句创建对象,这是最常见的创建对象的方法。-----显式的调用构造函数
(2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。------显式的调用构造函数
(3) 调用对象的clone()方法。内存上对已有对象的克隆,不会调用构造函数
(4) 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。从文件中还原类的对象,不会调用构造函数。
9,接口和抽象类的区别?
一个类只能继承一个类(抽象类),但是可以实现多个接口
第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
第二点. 接口可以多继承,抽象类不行
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的。
当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的
所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。
10,说说TCP三次握手?(管道。内存共享。消息队列。信号量)进程通信
传输控制协议,面向连接,可靠,有序性,慢速度。(tcp20字节udp8个)
为了初始化SequenceNumber的初始值
11,TCP四次挥手?
为了终止连接
为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
- TCP滑动窗口?RTT-时间长,发送数据时间 RTO重传时间间隔。滑动窗口做流量控制,乱序重排。
- socket是啥?IP+端口号+协议 socket编程实现通信
12,TCP和Http的区别联系?
TCP传输层,http应用层,知道了 http是要基于TCP连接基础上的,简单的说,TCP就是单纯建立连接,不涉及任何我们需要请求的实际数据,简单的传输。http是用来收发数据,即实际应用上来的。
第一:从传输层,先说下TCP连接,我们要和服务端连接TCP连接,需要通过三次连接,包括:请求,确认,建立连接。即传说中的“三次握手协议”。
第一次:C发送一个请求连接的位码SYN和一个随机产生的序列号给Seq,然后S收到了这些数据。
第二次:S收到了这个请求连接的位码,啊呀,有人向我发出请求了么,那我要不要接受他的请求,得实现确认一下,于是,发送了一个确认码 ACN(seq+1),和SYN,Seq给C,然后C收到了,这个是第二次连接。
第三次:C收到了确认的码和之前发送的SYN一比较,偶哟,对上了么,于是他又发送了一个ACN(SEQ+1)给S,S收到以后就确定建立连接,至此,TCP连接建立完成。
简单就是:请求,确认,连接。,
第二:从实际上的数据应用来说httP
在前面客户端和应用服务器建立TCP连接之后,就需要用http协议来传送数据了,HTTP协议简单来说,还是请求,确认,连接。
总体就是C发送一个HTTP请求给S,S收到了这个http请求,然后返回给Chttp响应,然后C的中间件或者说浏览器把这些数据渲染成为了网页,展示在用户面前。
第一:发送一个http请求给S,这个请求包括请求头和请求内容:
request header:
包括了,1.请求的方法是POST/GET,请求的URL,http协议版本2.请求的数据,和编码方式3是否有cookie和cooies,是否缓存等。
post和get请求方式的区别是,get把请求内容放在URL后面,但是URL长度有限制。而post是以表单的形势,适合要输入密码之类的,因为不在URL中显示,所以比较安全。
request body:
即请求的内容.
第二:S收到了http请求,然后根据请求头,返回http响应。
response header:包括了1.cookies或者sessions2.状态吗3.内容大小等
response body:
即响应的内容,包括,JS什么的。
第三,C收到了以后,就由浏览器完成一系列的渲染,包括执行JS脚本等。
这就是我所理解的webTCP,HTTP基础知识,待续。。。。。
TCP是底层通讯协议,定义的是数据传输和连接方式的规范
HTTP是应用层协议,定义的是传输数据的内容的规范
HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP
HTTP支持的是www服务
而TCP/IP是协议
它是Internet国际互联网络的基础。TCP/IP是网络中使用的基本的通信协议。
TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP。