Java笔记(六)——基础知识(郝斌)
178.容器
- 为什么需要容器
- 数组存在两个缺陷
- 数组长度难以扩充
- 数组中的元素类型必须相同
- 容器可以弥补数组的这两个缺陷
- 举例:
- 假设A是个类名
- A【】arr = new A【10】
- 表示分配了一个数组,数组中的每个元素都是A类对象的一个引用,但是如果想扩充数组的长度,比如希望数组的长度变成15,我们不能直接在原数组内存的后面追加内存,必须得另外分配长度为15的内存空间,然后利用System.arraycopy()方法来把原数组的内容拷贝到新内存中,很明显,这既耗时,又耗内存
- 所以一旦数组内存已分配,你想改变数组的长度,效率会变得极低
- 数组存在两个缺陷
179.容器与现实的对应关系
- 集合就是将若干用途、性质相同或相近的“数据”组合而成的一个整体
- 数学上,集合类型可以归纳为三种:
- 集(Set)
- Set集合中不区分元素的顺序,不允许出现重复元素
- 列表(List)
- List集合区分元素的顺序,且允许包含重复元素
- 映射(Map)中保存成对的“键-值”信息,映射中不能包含重复的键,每个键最多只能映射一个值
- 集(Set)
- Java设计了三个接口对应数学上的三种集合类型,这三个接口的名字分别是Set List Map
180.容器的框架图
- Collection接口-定义了一组存取对象的方法,其子接口Set和List分别定义了存储方式
- Set中的数据对象没有顺序且不能重复
- List中的数据对象有顺序且可以重复
- Map接口定义了“键-值”映射“对”的方法
181.Collection接口中的方法介绍
- Int size()
- 返回collection中的元素个数
- Boolean isEmpty()
- Boolean containesAll(collection c)
- 判断形参c所指向的集合中所有的元素是不是已经全部包含在了当前集合中,是返回true,否则false
- Iterator ilterator();
- 返回能够遍历当前集合所有元素的迭代器
- Obeject【】 toArray()
- 容器不是数组,不能通过下标的方式来访问容器中的元素
- 只有数组才可以通过下标来访问
- 返回一个包含此collection中所有元素的数组
- Boolean add(Object e)
- 把e添加到当前集合
- Boolean remove(object o)
- Boolean addAll(collection c)
- 把c中所有的元素添加到当前集合中
- Boolean removeAll(collection c)
- Void clear()
- 把当前容器中的所有元素清除
- Boolean equals(object o)
- Int hashCode();
182.Collection接口的子接口-List接口
- List接口是Collection接口的子接口,实现List接口的容器类中的元素是有顺序的且可以重复的
- List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
183.Collection接口的子接口-Set接口
- 因为很多Set和List都是继承自Collection接口,所以Set和List接口有很多方法都是一样的
- List接口中有set、indexof方法,但是Set接口中却只有add方法,没有set、indexOf方法,因为set是无序且不能重复的,不存在某个元素具体位置这个概念
184.Map接口
- Java.until.Map接口描述了映射结构,Map接口允许以键集、值集合或键-值映射关系集的形式查看某个映射的内容
- 主要方法:
- Object put(object key,object value)
- Object get(object key)
- 注意Map接口并没有Object get(Object value)
- Boolean isEmpty()
- Void clear()
- Int size()
- Boolean containesKey(Object key)
- Boolean containesValue(Object value)
185.预备知识:toString方法
- 对任意类A,假设aa是该A类的一个实例
System.out.println(aa);等价于System.out.println(aa.toString())
- Obeject类中含有toString方法
- Java中所有的类都默认继承了Object类的toString方法
- 建议所有的子类都要重写toString方法
186.Collection接口实现示例总结
强烈建议:所有添加到Collection容器中的对象都应该重写父类Obeject中的toString方法
187.ArrayList与LinkedList的比较
- ArrayList和LinkedList都实现了List接口中的方法,但二者内部实现不同
- ArrayList底层采用数组完成,而LinkedList则是以一般的双向链表完成,其内每个对象除了数据本身之外,还有两个引用,分别指向前一个元素和后一个元素
- 如果我们经常在List的开始处增加元素,或者在List中进行插入和删除操作,我们应该使用LInkedList,
- ArrayList存取速度快,插入删除慢
- LinkedList存取速度慢,插入删除速度快
188.Collections类
- Collection接口的实现类,如ArrayList、LinkedList本身并没有提供排序、倒置、查找等方法,这些方法是由Collections类来实现的,该类有很多public static方法,可以直接对Collection接口的实现类进行操作
- Collections类常用算法
- Void sort(List) 对List容器内的元素排序
- Void shuffle(List) 对List容器内的对象进行随机排列
- Void reverse(List)对LIst容器内的对象进行逆序排列
- Void fill(List,Obeject)
- 用一个特定的对象重写整个List容器
- Void copy(List dest,List src)
- 将src List容器内容拷贝到dest List容器
- Int binarySearch(List,Object)
- 对于顺序的List容器,采用折半查找的方法查找特定对象
189.Collections.fill()用法
- LinkedList it = new LinkedList();
- It.add(“111”);
- It.add(“222”);
- It.add(“333”);
- System.out.println(it);
- Collections.fill(it,“888”)
- System.out.println(it)
- 结果:
- [111,222,333]
- [888,888,888]
190.Comparable接口
- 为何要使用Comparable接口
- 基本类型数据和String类型数据,他们彼此的比较标准Java语言本身已经提供好了
- Java语言本身没有提供用户自定义对象之间的比较标准
- 所以一个容器中如果含有用户自定义类型的数据,并且我们需要对容器中的元素进行排序,或查找某一元素时,我们就必须得制定容器中元素与元素之间的比较标准
- 凡是需要进行对象比较/排序的场合均可考虑实现Comparable接口
191.Comparable接口介绍
- 问题:上面的算法根据什么确定容器对象的“大小”顺序?
- Comparable接口中只有一个方法可以实现:
- Public int ComparaTo(Obeject o)
- 返回0,表示this==o
- 返回正数,表示this>o
- 返回负数,表示this<o
- 实现了Comparable接口的类通过实现ComparaTo方法从而确定该对象的排序方式
- Public int ComparaTo(Obeject o)
- 实例:
- 把所有人的信息存入电脑
- 再按编号排序输出
192.Set接口介绍
- Set接口是Collection的子接口,Set接口没有提供额外的方法,但实现Set接口的容器中的元素是没有顺序的,且不可以重复的
- Set容器是可以与数学中的“集合”概念相对应
- Set:
- HashSet
- TreeSet
193.HashSet
- HashSet实现了Set接口
- HashSet容器中的元素是不能重复的,无顺序的
- 存放入HashSet容器中的类必须要实现equals()和HashCode方法
194.重写hashCode方法的必要
- String和Integer这些Java自带的类都重写了hashCode方法,如果String和Integer new出来的对象的内容是一样的,则这些对象的hashCode返回值也是一样的,尽管这些对象占用的是不同内存
- 不过用户自定义类型则不同,如本程序的A类,即便是两个内容一模一样的A类对象,它们返回的hashCode也是不一样的,但是两个内容一模一样的integer类对象或String类对象返回的hashCode值却是一样的,因为系统自带的Integer和String类都已经重写Object类的hashCode方法
- 如果程序员希望自己定义的类对象占用不同的内存但内容相同的对象调用hashCode()方法返回值是一样的,则程序员必须自己重写hashCode方法。如本程序的B类
195.什么容器必须得重写equals()方法和hashCode()方法
- 添加到HashMap和Hashtable容器中的键必须都得同时实现equals()方法和HashCode()方法,否则很可能导致容器中出现重复的映射,所谓重复映射是指同一个键映射在容器中出现了多次
- 添加到HashSet容器中的对象也必须得实现equals方法和hashCode方法,否则很可能导致容器中出现重复的对象
- 什么类必须得重写equals()和hashCode()方法
- Hashtable、HashSet、HashMap都必须得同时实现equals()方法和hashCode()方法,TreeSet和TreeMap则不需要实现equals()方法和hashCode()方法
- 为什么要重写equals()和hashCode()方法
- 预备知识:
- 散列码:
- Object中的hashCode方法会返回该对象的内存真实地址的整数化表示,这个形象的、不是真正地址的整数值就是哈希码
- 散列码:
- 预备知识:
- 向HashSet中添加对象时,HashSet先通过该对象的hashCode()计算出相应的桶,然后再根据equals()方法找到相对应的对象,如果容器中已存在该对象则不再添加,如果不存在,则添加进去、
196.怎样重写equals()和hashCode()方法
- 如何重写equals()方法
- Public boolean equals(Obeject ob)
- {
- 如果this和ob的内容是一模一样
- 返回true
- 否则
- 返回flase
- 如何重写hashCode()方法
- Public int hashCode()
- {
- return 当前类中基本类型数据对象的hashCode()方法
- }
- equals()方法和hashCode()方法举例
- 例子
- 把学生信息存入HashSet容器中,要求不能出现重复的学生信息,最后把学生信息全部输出
- 附注:
- HashSet类中并没有public Object get(int index)方法,因此要想输出HashSet容器中所有的元素,可以借助Iterator()方法来实现
- 例子
197.Iterator方法介绍
- Boolean hasNext();
- 是用来判断当前游标的后面是否还有元素,如果有返回true,否则返回false
- Obeject next();
- 先返回当前游标右边的元素,然后游标后移一个位置
- Void remove()
- 删除最近返回的元素,在调用remove之前,我们至少保证先调用一次next方法,而且调用next之后只能调用一次remove方法
- remove()方法不推荐使用
198.TreeSet类
- TreeSet类实现了Set接口
- TreeSet是一个有序集合,TreeSet中元素将按照升序排列,缺省是按照自然排序进行排列,因此TreeSet中元素要实现Comparable接口
- 记住:所有可以进行排序的类都应该实现Comparable接口
199.TreeSet
- Collection c = new TreeSet()
- c.add(“123”);
- c.add(“456”);
- c.add(“234”);
- c.add(“111”);
- c.add(“678”);
- Iterator i = c.iterator();
- while(i.hasnext())
- {
System.out.println(i.next());
- }
200.HashSet和TreeSet的比较
- HashSet是基于Hash算法来实现的,其性能通常都优于TreeSet,我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet
201.预备知识:哈希表
- 哈希表的定义:
- 哈希表不是只存储需要保存的数据,而是既保存数据,也保存该数据的主键,实际是:先保存主键,然后哈希表会根据某种算法自动计算出以当前主键为主键的数据的存储位置,然后再把数据保存进去
- 哈希表:
- 假设待保存的数据是val,val的主键是key,则哈希表先存储key,然后哈希表会自动根据key计算出val的存储位置,并最终把val存储进去
- 哈希表注意事项:
- 哈希表又称散列表
- Hash不允许存在重复的键
- 哈希表主要是为了提高数据的存储速度和查找速度而设计
- 几乎所有的哈希表都会产生哈希冲突
- Java中是利用桶来解决哈希冲突
202.Map接口
- Map(映射)是一种把键对象和值对象进行映射的集合,它的每一个元素都包含一对键对象和值对象
- 向Map集合中加入元素时,必须提供一对键对象和值对象,从Map中检索元素时,只要给出键对象,就会返回对应的值对象
- 接口Map提供了根据关键字找对应值的方法get(),定义如下:
- Obeject get(Object key)
203.Map接口方法介绍
- 接口Map方法还提供了设置关键字和对应值的方法put()
- 定义如下:
- Object put(Object key,Object value)
- 根据key计算出存储位置,然后把value存入此位置,如果该位置已有元素,则覆盖它
- 该方法返回覆盖之前的元素对象的值,如果此前位置为空,则返回null
- Object put(Object key,Object value)
- Void putAll(Map m)
- 把m容器中所有的元素存入当前容器中
- Int size();
- Boolean isEmpty();
- Boolean containsKey(Object key);
- Boolean containsvalue(Object value);
- Object remove(Object key);
- Void clear();
204.基本概念
- 网络程序
- 能够接收另一台计算机发送过来的数据或者能够向另一台计算机发送数据的程序叫网络程序
- IP
- 能够在网络中唯一标识一台主机的编号就是IP
- 网络中每台主机都必须有一个唯一的IP地址
- IP地址是用一个逻辑地址
- 因特网上的IP地址具有全球唯一性
- 32位,4个字节,常用点分十进制的格式表示,例如:192.168.0.16
- 端口号
- 一台计算机上可以同时运行多个网络程序
- 一台计算机从网卡接受过来的数据到底应该交给本地的哪个网络程序来处理的,这是由端口号来决定的
- 端口是用一个16位的数字来表示,它的范围是:0-65535,1024以下的端口号保留给预定义的服务,例如:80端口访问网页,25端口用来邮件发送,oralce92默认的端口号是1521,tomcat默认的端口号是8080
- 协议:为进行网络中数据交换(通信)而建立的规则、标准或约定
- 常见协议
- TCP:面向连接的可靠的传输协议,类似于打电话
- UDP:是无连接的,不可靠的传输协议,类似于写信
205.基于UDP的Socket编程步骤
- 定义码头
- 即:定义一个DatagramSocket对象ds
- 定义可以用来接收或发送数据的集装箱
- 定义DatagramPacket对象dp
- 在码头上用集装箱接收对方发送过来的数据(ds.receive(dp))
或者在码头上把集装箱中的数据发送给对方(ds.send(dp))
- 关闭码头(ds.close())
206.UDP的socket编程要注意的问题
- “127.0.0.1”是String,不是IP地址,IP地址在Java中是用java.net.InetAdderss类表示
- java.net.InetAdderss并没有构造方法,因此要把“127.0.0.1”转化为IP地址
- 必须写成:
- InetAddress.getByName(“127.0.0.1”)
- 不能写成:
- New InetAddress(“127.0.0.1”)
- 必须写成:
207.UDP的socket编程注意的问题
- DatagramPacket是个集装箱,既可以存放即将要发送到客户端的数据,也可以用来存放即将要接收的客户端数据
- 如果UDP中两个网络程序要通信的话,这两个程序必须得定义DatagramPacket包
- 如果定义的DatagramPacket对象要用来接收客户端发送过来的数据,则不建议指定目的端口号和目的IP
- 如果定义的DatagramPacket对象要用来存储要发送到客户端的数据,则必须指定目的端口号的目的IP
- DatagramPacket所有的构造函数的第一个形参都是byte【】buf,
即:所有的DatagramPacket对象的内核都是个byte数组
即:定义DatagramPacket对象必须借助byte数组来实现
208.基于TCP的Socket网络编程
- 注意的问题
- TCP客户端
- 一旦new出了Socket对象,该对象就会自动向服务器端发送连接请求,如果连接不成功,则程序立即终止
- TCP服务器端
- new出的ServerSocket对象并不会自动监听客户端的请求,只有调用ServerSocket对象的accept方法时,才会监听客户端的请求
- TCP客户端
209.HTTP协议
- http协议是浏览器和服务器之间进行数据传输的一个协议
- 浏览器发送到服务器的数据称为请求信息
- 服务器发送到浏览器的数据称为响应信息
210.HTTP协议下的请求信息
- 一个完整的http协议下的请求信息包括三部分内容
- 请求行
- 若干可选消息头
- 正文内容
- 请求行包含三部分内容,彼此之间用空格分隔
- 请求方式
- 如get / post
- 资源路径
- 用户想要访问的资源的地址
- HTTP版本号
- 请求方式
211.HTTP协议下的响应信息
- 一个完整的http协议下的响应消息包括三部分内容
- 一个状态行
- 若干可选消息头
- 正文内容
- 状态行包含三部分内容,彼此之间用空格分隔
- HTTP版本号
- 状态码
- 原因叙述
Java笔记(六)——基础知识(郝斌)相关推荐
- HTML5学习笔记 —— JavaScript基础知识
HTML5学习笔记 -- JavaScript基础知识 标签: html5javascriptweb前端 2017-05-11 21:51 883人阅读 评论(0) 收藏 举报 分类: JavaScr ...
- java的一些基础知识(引用BlogJava 落花飞雪)
java的一些基础知识(引用BlogJava 落花飞雪) <Practical Java>笔记 1. 声明是什么? String s = "Hello world!" ...
- JS学习笔记——入门基础知识总结
JS入门基础知识总结1 前言 基础背景知识 一.产生历史: 二.特点: 三.应用方向: 四.Javascript组成: JavaScript书写使用方式 一.行内式(了解即可,项目中不使用,日常练习尽 ...
- 【Java】【基础知识】【Java的基本使用】
[Java][基础知识][Java的基本使用] 基于jdk8 仅个人理解,或有疏漏 基于 java疯狂讲义 第三版和第四版 java核心技术卷一 第十版和第十一版 廖雪峰java课程 一.基本数据与结 ...
- Java 网络编程基础知识
Java 网络编程基础知识 基础概念 计算机网络的基本概念 网络:多台计算机使用网络设备互联在一起,计算机之间可以进行通信,这样就组成了一个计算机网络. 网络设备:集线器(HUB),路由器,交 ...
- java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识
原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...
- 笔记-项目管理基础知识-复习要点
1. 项目的特点 临时性(一次性).独特性.渐进明确性 2. 项目目标包括成果性目标和约束性目标 ●笔记-项目管理基础知识-项目目标 3. 项目目标的特点 多目标性.有限性.层次性 4. ▲项目管理5 ...
- 数字图像处理与Python实现笔记之基础知识
数字图像处理与Python实现笔记之基础知识 摘要 绪论 1 数字图像处理基础知识 1.1 数字图像简介 1.1.1 数字图像处理的目的 1.1.2 数字图像处理的应用 1.1.3 数字图像处理的特点 ...
- php基础教学笔记,php学习笔记:基础知识
php学习笔记:基础知识 2.每行结尾不允许有多余的空格 3.确保文件的命名和调用大小写一致,是由于类Unix系统上面,对大小写是敏感的 4.方法名只允许由字母组成,下划线是不允许的,首字母要小写,其 ...
- 第76节:Java中的基础知识
第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...
最新文章
- 苹果市值盘中超2万亿美元,从1万亿到2万亿仅用时2年
- 担保债务凭证(Collateralized Debt Obligation,简称CDO) CLO/CBO
- 对单片机C语言的一些误用和总结
- Linux tshark发送抓取的数据到kafka
- Numpy系列(三)常用random随机函数汇总
- 全世界最全牛人博客,你可以学习到太多!
- 使用Foxmail添加outlook和gmail
- 芝麻信用分800+的技巧,get!
- USBTO232的几个问题,乱码,回车无效,驱动安装
- Linux下常用的编辑文件与保存命令
- 深入理解LightGBM
- 贾扬清分享_深度学习框架caffe
- every和some的区别
- step 文件在sw怎么编辑_solidworks如何直接编辑STP文件
- c#多线程防止界面卡死
- golang触发gc的时机
- 【图像识别】基于matlab实现步态周期检测与步态角度特征
- 深信服广域网优化三度入围Gartner魔力象限
- 妖精的尾巴魔导少年怎么用电脑玩 妖精的尾巴魔导少年模拟器教程
- 人工智能软件表现抢眼,几乎准确预测了奥密克戎病毒的复杂结构