迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的collection移除元素 方法名称得到了改进,简化书写 **LisIterator:系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表 **Comparable:此接口强行对实现它的每个类的对象进行整体自然排序。使元素具备比较性
**Comparator:强行对某个对象collection进行整体排序的比较函数,使集合具备比较性 **Arrays:此类包含用来操作数组(比如排序和搜索)的各种静态方法
**增强for循环代替了迭代器使用的不爽,简化书写
**增强for循环局限性:
对集合或者数组进行遍历时,只能取元素,不能对集合进行操作
(4)基本数据类型的自动装箱和拆箱
**装箱:自动把一个基本数据类型的数据装箱成一个该类型数据的对象引用
**拆箱:自动把一个基本数据类型的对象引用拆箱成一个基本数据类型的数据,再参与运算
为什么前面的返回true而后面的运算返回false呢?
对于基本数据类型的整数,装箱成Integer对象时,如果该数值在一个字节内,(-128~127),
一旦装箱成Integer对象后,就把它缓存到磁里面,当下次,又把该数值封装成Integer对象时
会先看磁里面有没有该对象,有就直接拿出来用,这样就节省了内存空间。因为比较小的整数,
用的频率比较高,就没必要每个对象都分配一个内存空间。
这就是享元模式!比如26个英文字母,10个阿拉伯数字
问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,
但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。
枚举可以让编译器在编译时就可以控制源程序中填写的非法值,
普通变量的方式在开发阶段无法实现这一目标。
**用普通类如何实现枚举的功能?定义一个Weekday类来模拟实现:
*可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句
转移成了一个个独立的类。
举例:定义一个Weekday的枚举。
(记住,讲课时要先于自定义方法前介绍,讲课更流畅)
总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。
**枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
**枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。
把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
构造方法必须定义成私有的
如果有多个构造方法,该如何选择哪个构造方法?
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
实现普通的next方法
实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,
这些子类采用类似内部类的方式进行定义。增加上表示时间的构造方法
**枚举只有一个成员时,就可以作为一种单例的实现方式。
**泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,
编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,
对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。
由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,
就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,再调用其add方法即可。
**参数化类型与原始类型的兼容性:
参数化类型可以引用一个原始类型的对象,编译报告警告,
原始类型可以引用一个参数化类型的对象,编译报告警告,
**参数化类型不考虑类型参数的继承关系:
编译器不允许创建泛型变量的数组。即在创建数组实例时,
数组的元素不能使用参数化的类型,
例如,下面语句有错误:
**限定通配符的上边界:
**限定通配符的下边界:
限定通配符总是包括自己。
?只能用作引用,不能用它去给其他变量赋值
只能通过强制类型转换方式来赋值。
通过打开一个到实际文件的连接来创建一个 FileInputStream, 该文件通过文件系统中的路径名 name 指定。 通过打开一个到实际文件的连接来创建一个 FileInputStream, 该文件通过文件系统中的 File 对象 file 指定。 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。 从此输入流中读取一个数据字节。
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。 从输入流中跳过并丢弃 n 个字节的数据。 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。 返回可以从此输入流读取(或跳过)、且不受此输入流接下来的方法调用阻塞的估计字节数。
从此字节输入流中给定偏移量处开始将各字节读取到指定的 byte 数组中。 将指定字符添加到此 writer。 写入字符数组的某一部分。 写入字符串的某一部分。 在给定从中读取数据的文件名的情况下创建一个新 FileReader。 在给定从中读取数据的 File 的情况下创建一个新 FileReader。 **方法摘要:和Reader基类方法一致: 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
将字符读入数组的某一部分。 使用默认输入缓冲区的大小创建新的行编号 reader。 将字符读入数组中的某一部分。
(1)需求1:在硬盘上创建一个文件并写入信息
(2)需求2:在原有文件上续写数据
(3)需求3:读取硬盘上的文本文件,并将数据打印在控制台
**第一种读取方法:一个一个字节的读
**第二种读取方法:利用数组来提高效率
(4)需求4:拷贝文本文件
利用缓冲区提高数据读写效率
(无缓冲区就相当于一滴一滴的喝水,有缓冲区就相当于一杯一杯的喝水)
**第一种读法:利用字节数组读(此种读法效率有一定提高)
(4)需求4:拷贝字节文件,如图片或者MP3或者电影
**第一种拷贝:不带缓冲区(慢,还是效率问题)
**第二种拷贝:带缓冲区,高效
(3)需求3:发现需求2中其实就是读一行的原理,故引入字节通向字符的桥梁:InputStreamReader
为提高效率加入缓冲区:
(4)需求4:键盘录入数据并打印到控制台
(5)需求5:将键盘录入的数据存储到硬盘文件
(6)需求6:将硬盘文件的数据打印到控制台
**流操作的难点:流对象很多,不知道具体用哪个
(1)第一步:先明确源和目的
(2)第二步:明确是不是纯文本
(3)第三步:明确流体系后,通过设备来明确具体使用哪个流对象
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
测试应用程序是否可以执行此抽象路径名表示的文件。
测试应用程序是否可以读取此抽象路径名表示的文件。
测试应用程序是否可以修改此抽象路径名表示的文件。
按字母顺序比较两个抽象路径名。
测试此抽象路径名是否为绝对路径名。
测试此抽象路径名表示的文件是否是一个目录。
测试此抽象路径名表示的文件是否是一个标准文件。
测试此抽象路径名指定的文件是否是一个隐藏文件。
测试此抽象路径名表示的文件或目录是否存在。
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
返回由此抽象路径名表示的文件或目录的名称。
将此抽象路径名转换为一个路径名字符串。
返回此抽象路径名的绝对路径名字符串。
返回此抽象路径名的绝对路径名形式。
删除此抽象路径名表示的文件或目录。
在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
(5)获取全部:(非常重要!!!)
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
测试指定文件是否应该包含在某一文件列表中。 测试指定文件是否应该包含在某一文件列表中。
8、File类常见需求:
(1)文件名过滤:列出给定目录的所有.java文件
(2)列出指定目录下的所有文件和文件夹(递归)
**示例1:不带层次递归:
**示例2:带层次递归:
(3)需求:删除带内容的目录:
(4)需求:将制定目录下的java文件的绝对路径存储到文本文件中。
**对指定目录进行递归
**获取递归过程中所有java文件的路径
**将这些路径存储到集合中
**将集合中的数据写入文件中
//对指定目录进行递归并将所以Java文件存储到集合中
(7)需求:记录应用程序的使用次数,如果使用次数已到,则提示用户注册。
**第一次使用时建立一个配置文件用于记录使用次数
**每次使用都加载该配置文件,并先判断已使用次数
**每次使用完使用次数加1,写入配置文件
**数据要发送到指定端口。为了标示不同的应用程序,所以给这些网络应用程序都用数字进行标示
**定义通信规则。这个规则称为通信协议,国际组织定义了通用协议TCP/IP
是指将地理位置不同的具有独立功能的多台计算机及其外部设备,
通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,
实现资源共享和信息传递的计算机系统。
IP地址 = 网络号码+主机地址
A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码
B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码
C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码
(6)各种网络分类方式
A:按网络覆盖范围划分
局域网(几米至10公里以内) 城域网(10~100公里) 广域网(几百公里到几千公里) 国际互联网
B:按网络拓扑结构划分
总线型网络 星形网络 环型网络 树状网络 混合型网络
有线网 无线网
D:按网络使用性质划分
公用网 专用网
其之所以称为虚拟网,主要是因为整个VPN网络的任意两个节点之间的连接并没有传统专网
所需的端到端的物理链路,而是架构在公用网络服务商所提供的网络平台,如Internet、
ATM(异步传输模式〉、Frame Relay (帧中继)等之上的逻辑网络,
用户数据在逻辑链路中传输。它涵盖了跨共享网络或公共网络的封装、
加密和身份验证链接的专用网络的扩展。VPN主要采用了隧道技术、加解密技术、
密钥管理技术和使用者与设备身份认证技术。
需求1:UDP键盘录入数据,并发送给接收端
需求2:编写简单的聊天工具
建立连接后,通过Socket中的IO流进行数据的传输 同样,客户端与服务器端是两个独立的应用程序。 通过系统默认类型的 SocketImpl 创建未连接套接字 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 创建一个流套接字并将其连接到指定主机上的指定端口号。 返回套接字连接的地址。 返回此套接字的输入流。 返回此套接字的输出流。
返回此套接字连接到的远程端口。 此套接字的输入流置于“流的末尾”。 禁用此套接字的输出流。 将此套接字转换为 String。 创建非绑定服务器套接字。 创建绑定到特定端口的服务器套接字。 侦听并接受到此套接字的连接。 返回此服务器套接字的本地地址。 建立Socket服务,并制定要连接的主机和端口; 获取Socket流中的输出流OutputStream,将数据写入流中,通过网络发送给服务端;
获取Socket流中的输出流InputStream,获取服务端的反馈信息; 建立ServerSocket服务,并监听一个端口; 使用客户端对象的读取流获取客户端发送过来的数据; 通过客户端对象的写入流反馈信息给客户端;
TCP需求1:客户端给服务端发送数据,服务端接收到后反馈信息给客户端
TCP需求2:建立一个文本转换服务端,客户给服务端发送文本,服务端将数据转换成大写后返回给客户端
当客户端输入over时,转换结束
需求5:客户端并发登陆
客户端通过键盘录入用户名,服务端对这个用户名进行校验
如果用户存在,在服务端现实xxx已登录,并在客户端现实欢迎xxx
如果用户不存在,在服务端现实xxx正在尝试登陆,并在客户端现实xxx用户不存在