超哥的苏小妍
1.三个string区别
- String是字符串常量,不可变。String创建的字符串在常量池中,对于String类的任何改变都会返回一个新的String对象。
- tringBuild,StringBuffer是字符串变量,可变。StringBuild,StringBuffer在堆中创建对象,对于StringBuild,StringBuffer中的内容修改都是当前这个对象。
- StringBuild是非线程安全的,但是效率高;
- StringBuffer是线程安全的,效率相较StringBuild较低。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
- 对于三者使用的总结:
- 操作少量的数据: 适用 String
- 单线程操作字符串缓冲区下大量数据: 推荐使用 StringBuilder(即不考虑并发问题时推荐StringBuilde)
- 多线程操作字符串缓冲区下大量数据: 推荐使用 StringBuffer
2.stringbuffer为啥安全
- StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
3.arp协议
- ARP 协议,全称 地址解析协议(Address Resolution Protocol),它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
- MAC 地址的全称是 媒体访问控制地址(Media Access Control Address)。如果说,互联网中每一个资源都由 IP 地址唯一标识(IP 协议内容),那么一切网络设备都由 MAC 地址唯一标识。
- 可以理解为,MAC 地址是一个网络设备真正的身份证号,IP 地址只是一种不重复的定位方式,也可以理解为 MAC 地址是身份证号,IP 地址是邮政地址。MAC 地址也有一些别称,如 LAN 地址、物理地址、以太网地址等。
- ARP 的工作原理将分两种场景讨论:
- 同一局域网内的 MAC 寻址;
- 从一个局域网到另一个局域网中的网络设备的寻址。
4.tcp udp区别
- TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。
- UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
- TCP 是一对一的两点服务,即一条连接只有两个端点。
- UDP 支持一对一、一对多、多对多的交互通信
- TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。
- UDP 是尽最大努力交付,不保证可靠交付数据。
- 由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:FTP 文件传输;HTTP / HTTPS;
- 由于 UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:包总量较少的通信,如 DNS 、SNMP 等;视频、音频等多媒体通信;广播通信;
5.两个栈实现一个队列
- 1,首先准备两个栈,栈A与栈B
- 2,栈A专门用来完成入队列操作,栈B专门用来出队列与取队首元素操作
- 3,每次入队列操作时,首先得判断B栈是否为空,不空则将B栈元素全都依次入A栈,最后继续入新元素(即将要入栈元素添加到栈A)
- 4,每次出队列与取队首元素操作时,将A栈中的元素依次入B栈,出队列即取出B栈中的元素,取队首元素即取B栈栈顶元素即可
6.聚集索引和非聚集索引区别
- 聚集索引:聚集索引是索引结构和数据一起存放的索引。类似于字典的正文,当我们根据拼音直接就能找到那个字。
- 非聚集索引:非聚集索引是索引结构和数据分开存放的索引。类似于根据偏旁部首找字,首先找到该字所在的地址,再根据地址找到这个字的信息。
- 区别:
- 1.聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个
- 2.聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续
- 3.聚集索引:物理存储按照索引排序;聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序。
- 4.非聚集索引:物理存储不按照索引排序;非聚集索引则就是普通索引了,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序。
- 5.索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。
- 优势与缺点:聚集索引插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快。
7.threadlocal
ThreadLocal意为线程本地变量,用于解决多线程并发时访问共享变量的问题。
很明显,在多线程的场景下,当有多个线程对共享变量进行修改的时候,就会出现线程安全问题,即数据不一致问题。常用的解决方法是对访问共享变量的代码加锁(synchronized或者Lock)。但是这种方式对性能的耗费比较大。在JDK1.2中引入了ThreadLocal类,来修饰共享变量,使每个线程都单独拥有一份共享变量,这样就可以做到线程之间对于共享变量的隔离问题。
- 常用的方法
- set(T value):设置线程本地变量的内容。
- get():获取线程本地变量的内容。
- remove():移除线程本地变量。注意在线程池的线程复用场景中在线程执行完毕时一定要调用remove,避免在线程被重新放入线程池中时被本地变量的旧状态仍然被保存。
8.设计模式
9.动态代理和gclib区别
- JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。
- JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。
- JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行效率更高。