java——阶段性整理(三)集合、线程、网络编程

一、Vector和ArrayList、ArrayList和LinkedList的区别和联系

1)Vector和ArrayList的区别和联系

实现原理相同,功能相同,都是长度可变的数组结构,很多情况下可以互用

  1. Vector是早期JDK接口,ArrayList是替代Vector的新接口
  2. Vector线程安全,ArrayList重速度轻安全,线程非安全
  3. 长度需增长时,Vector默认增长一倍,ArrayList增长50%

2)ArrayList和LinkedList的区别和联系

  1. ArrayList和LinkedList都是List的实现类,元素具有有序,不唯一特点。
  2. ArrayList实现了长度可变的数组,在内存中分配连续空间。遍历元素和随机访问元素的效率比较高;
  3. LinkedList采用链表存储方式。插入、删除元素时效率比较高

二、面向对象设计原则有哪些。

面向对象设计原则是面向对象设计的基石,面向对象设计质量的依据和保障,设计模式是面向对象设计原则的经典应用

  1. 单一职责原则(SRP)
  2. 开闭原则(OCP)
  3. 里氏潜代原则(LSP)
  4. 依赖注入原则(DIP)
  5. 接口分类原则(ISP)
  6. 迪米特原则(LOD)
  7. 组合/聚合复用原则(CARP)

开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。其他设计原则都可以看作是开闭原则的实现手段或方法。

三、HashSet采用了哈希表作为存储结构,哈希表的特点和实现原理。

哈希表的查询速度特比快,时间复杂度为0

  • HashMap、Hashtable、HashSet这些集合采用的是哈希表结构,需要用到hashCode哈希码,hashCode是一个整数值。
  • 系统类已经覆盖了hashCode方法,自定义如果要放入hash类集合,必须重写hashCode。如果不重写,调用的是Object的hashCode,而object的hashCode实际上是地址
  • 向哈希表中添加数据的原理:当向集合Set 中增加对象时,首先集合计算要增加对象的hashCode 码,根据该值来得到一个位置用来存放当前对象,如在该位置没有一个对象存在的话,那么集合Set 认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象存在的话,接着将准备增加到集合中的对象与该位置上的对象进行equals 方法比较,如果该equals 方法返回false,那么集合认为集合中不存在该对象,在进行一次散列,将该对象放到散列后计算出的新地址里。如果equals 方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增加到集合中了。
  • 在哈希表中判断两个元素是否重复要使用到hashCode()和equals()。hashCode决定数据在表中的存储位置,而equals 判断是否存在相同数据。

四、实现java反射技术的主要类和作用。

在JDK中,主要由以下类来实现Java反射机制,这些类哦都为与java.lang.reflect包中

  • Class类:代表一个类
  • Field类:代表类的成员变量
  • Method类:代表类的成员方法
  • Constructor类:代表类的结构方法
  • Array类:提供了动态创建数组,以及访问数组的元素的静态方法

五、sleep()和wait()的区别

sleep是线程类(Thread)的方法。

  • 作用是导致次线程暂停执行指定时间给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复;
  • 用sleep()不会释放对象锁。

wait是Object类的方法。

  • 对此对象调用wait方法导致本现场放弃对象锁,进入等待此对象的等待锁定池。
  • 只有针对此对象发出notfiy方法(或notifyAll)后本线程才进入对象锁定池,准备获得对象锁进行运行状态。

六、HashMap和Hashtable的联系和区别

共同点:

  • 二者都实现了Map接口,是将惟一键映射到特定的值上
  • 底层都采用哈希表作为存储结构,查询速度快,在很多情况下可互用。

主要区别:

  • Hashtable继承Dictionary类,HashMap是java1.2引进的Map实现。
  • Hashtable的线程安全的,而HashMap不是。在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须位置提供外同步。
  • HashMap没有排序,允许一个null键和多个null值,二Hashtable不允许。
  • HashMap把Hashtable的contains()去掉,改成containsValue和containsKey,因为contains方法容易让人引起误解。  

七、TCP/IP协议栈中,TCP协议和UDP协议的联系和区别

联系:

  TCP和UDP是TCP/IP协议栈中传输层的两个协议,它们使用网络层功能把数据包发送到目的地,从而为应用层提供网络服务。

区别:

  1. TCP是面向连接的传输。UDP是无连接的传输。
  2. TCP保证数据按照发送顺利到达,UDP无法保证。
  3. TCP是可靠性传输,而UDP则是不可靠传输。
  4. UDP因为少了很多控制信息,所以传输速度比TCP数据快
  5. TCP适合于传输大量数据,UDP适合用于传输小量数据。

比喻:

  TCP的server和client之间通信就好比两个人打电话。

  UDP的server中client之间的通信就像两个人发电报后者发短信。

八、List、Set、Collection、Map的区别和联系。

  1. List和Set是Collection接口的两个子接口
  2. Collection接口存储一组不唯一,无序的对象
  3. List接口存储一组不唯一,有序(插入顺序)的对象
  4. Set接口存储一组唯一,无序的对象
  5. Map接口存储一组键值对象,提供key到value映射。key无序,唯一。value不要求有序,允许重复。

九、进程和线程的联系和区别

进程和线程的联系:

  1. 线程是指进程内的一个执行单元,也是进程内的可调度实体
  2. 一个线程只能属于一个进程,一个进程可有多个线程,至少一个线程
  3. 进程和线程都可以并执行

线程与进程的区别:

  1. 根本区别:线程是调度和执行基本单位,进程执行时分配资源的基本单位。
  2. 开销:进程间切换开销大,线程间切换开销小
  3. 所处环境:在操作系统中能同时运行多个任务(进程)在同一应用程序中有多个顺序流(线程)同时执行

十、TCP的Socket编程的主要步骤

服务器端编程步骤:

  1. 构建一个ServerSocket实例,指定本地的端口
  2. 调用accept()方法来获得客户端的连接请求。通过accept()方法返回的socket实例,建立了一个和客户端的新连接
  3. 通过这个返回的socket实例获取InputStream和OutputStram,可以通过这两个stream来分别都和写数据。
  4. 结束的时候调用socket实例的close()方法关闭socket连接

客户端编程步骤:

  1. 构建Socket实例,通过指定的远程服务器地址和端口来建立连接。
  2. 通过Socket实例包含的InputStream和OutputStream来进行数据的读写。
  3. 操作结束后调用socket实例的close方法,关闭。

十一、常用字节输入流和输出流

  1. FileInputStream和FileOutputStream 节点流  以文件为数据源和目的地,提高读写效率
  2. BufferedInputStream 和 BufferedOutputStream 处理流 提供了缓冲功能,提高读写效率
  3. DataInputStream 和 DataOutputStream 处理流 提供了方便读写基本数据类型和String数据的方法。
  4. ObjectInputStream 和 ObjectOutputStream 处理流 不仅提供了方便读写基本数据类型和String数据的方法,也提供了读写引用类型数据的方法
  5. ByteArrayInputStream 和 ByteArrayOutputStream 节点流  以字节数组为数据源和目的地

十二、线程的两种创建方式及其优缺点。

方式一:继承java.lang.Thread类,并覆盖run()方法。

  • 优势:编写简单
  • 劣势:无法继承其他父类

方式二:实现java.lang.Runnable接口,并实现run()方法。

  • 优势:可继承其他类,多线程可共享同一个Thread对象
  • 劣势:编写方式稍微复杂,如许访问当前线程,需调用Thread.currentThread()方法

十三、UDP的Socket编程主要步骤

服务器端(server):

  1. 构造DatagramSocket实例。
  2. 创建数据包DatagramPacket,存取发送和接收的数据、IP和端口。
  3. 通过DatagramSocket实例的receive方法接收客户端数据。
  4. 通过DatagramSocket的send方法向客户端发出反馈信息。
  5. 关闭DatagramSocket。

客户端(client):

  1. 构造DatagramSocket实例。
  2. 创建数据包DatagramPacket,存取发送和接收的数据、IP和端口。
  3. 通过DatagramSocket实例的receive方法接收客户端数据。
  4. 通过DatagramSocket的send方法向服务端发送信息。
  5. 关闭DatagramSocket。
原文地址:https://www.cnblogs.com/rsdqc/p/5416273.html