java——阶段性整理(三)集合、线程、网络编程
一、Vector和ArrayList、ArrayList和LinkedList的区别和联系
1)Vector和ArrayList的区别和联系
实现原理相同,功能相同,都是长度可变的数组结构,很多情况下可以互用
- Vector是早期JDK接口,ArrayList是替代Vector的新接口
- Vector线程安全,ArrayList重速度轻安全,线程非安全
- 长度需增长时,Vector默认增长一倍,ArrayList增长50%
2)ArrayList和LinkedList的区别和联系
- ArrayList和LinkedList都是List的实现类,元素具有有序,不唯一特点。
- ArrayList实现了长度可变的数组,在内存中分配连续空间。遍历元素和随机访问元素的效率比较高;
- LinkedList采用链表存储方式。插入、删除元素时效率比较高
二、面向对象设计原则有哪些。
面向对象设计原则是面向对象设计的基石,面向对象设计质量的依据和保障,设计模式是面向对象设计原则的经典应用
- 单一职责原则(SRP)
- 开闭原则(OCP)
- 里氏潜代原则(LSP)
- 依赖注入原则(DIP)
- 接口分类原则(ISP)
- 迪米特原则(LOD)
- 组合/聚合复用原则(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协议栈中传输层的两个协议,它们使用网络层功能把数据包发送到目的地,从而为应用层提供网络服务。
区别:
- TCP是面向连接的传输。UDP是无连接的传输。
- TCP保证数据按照发送顺利到达,UDP无法保证。
- TCP是可靠性传输,而UDP则是不可靠传输。
- UDP因为少了很多控制信息,所以传输速度比TCP数据快
- TCP适合于传输大量数据,UDP适合用于传输小量数据。
比喻:
TCP的server和client之间通信就好比两个人打电话。
UDP的server中client之间的通信就像两个人发电报后者发短信。
八、List、Set、Collection、Map的区别和联系。
- List和Set是Collection接口的两个子接口
- Collection接口存储一组不唯一,无序的对象
- List接口存储一组不唯一,有序(插入顺序)的对象
- Set接口存储一组唯一,无序的对象
- Map接口存储一组键值对象,提供key到value映射。key无序,唯一。value不要求有序,允许重复。
九、进程和线程的联系和区别
进程和线程的联系:
- 线程是指进程内的一个执行单元,也是进程内的可调度实体
- 一个线程只能属于一个进程,一个进程可有多个线程,至少一个线程
- 进程和线程都可以并执行
线程与进程的区别:
- 根本区别:线程是调度和执行基本单位,进程执行时分配资源的基本单位。
- 开销:进程间切换开销大,线程间切换开销小
- 所处环境:在操作系统中能同时运行多个任务(进程)在同一应用程序中有多个顺序流(线程)同时执行
十、TCP的Socket编程的主要步骤
服务器端编程步骤:
- 构建一个ServerSocket实例,指定本地的端口
- 调用accept()方法来获得客户端的连接请求。通过accept()方法返回的socket实例,建立了一个和客户端的新连接
- 通过这个返回的socket实例获取InputStream和OutputStram,可以通过这两个stream来分别都和写数据。
- 结束的时候调用socket实例的close()方法关闭socket连接
客户端编程步骤:
- 构建Socket实例,通过指定的远程服务器地址和端口来建立连接。
- 通过Socket实例包含的InputStream和OutputStream来进行数据的读写。
- 操作结束后调用socket实例的close方法,关闭。
十一、常用字节输入流和输出流
- FileInputStream和FileOutputStream 节点流 以文件为数据源和目的地,提高读写效率
- BufferedInputStream 和 BufferedOutputStream 处理流 提供了缓冲功能,提高读写效率
- DataInputStream 和 DataOutputStream 处理流 提供了方便读写基本数据类型和String数据的方法。
- ObjectInputStream 和 ObjectOutputStream 处理流 不仅提供了方便读写基本数据类型和String数据的方法,也提供了读写引用类型数据的方法
- ByteArrayInputStream 和 ByteArrayOutputStream 节点流 以字节数组为数据源和目的地
十二、线程的两种创建方式及其优缺点。
方式一:继承java.lang.Thread类,并覆盖run()方法。
- 优势:编写简单
- 劣势:无法继承其他父类
方式二:实现java.lang.Runnable接口,并实现run()方法。
- 优势:可继承其他类,多线程可共享同一个Thread对象
- 劣势:编写方式稍微复杂,如许访问当前线程,需调用Thread.currentThread()方法
十三、UDP的Socket编程主要步骤
服务器端(server):
- 构造DatagramSocket实例。
- 创建数据包DatagramPacket,存取发送和接收的数据、IP和端口。
- 通过DatagramSocket实例的receive方法接收客户端数据。
- 通过DatagramSocket的send方法向客户端发出反馈信息。
- 关闭DatagramSocket。
客户端(client):
- 构造DatagramSocket实例。
- 创建数据包DatagramPacket,存取发送和接收的数据、IP和端口。
- 通过DatagramSocket实例的receive方法接收客户端数据。
- 通过DatagramSocket的send方法向服务端发送信息。
- 关闭DatagramSocket。