集合操作、文件操作

1 List
1.1 ArrayList和LinkedList
List接口是Collection的子接口,用于定义线性表数据结构。可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少。
List的两个常见实现类为ArrayList和LinkedList,分别用动态数组和链表的方式实现了List接口。
可以认为ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别。ArrayList更适合于随机访问而LinkedList更适合于插入和删除。在性能要求不是特别苛刻的情况下可以忽略这个差别。在这里插入图片描述
1.2 常用API
get和set
List除了继承Collection定义的方法外,还根据其线性表的数据结构定义了一系列方法,其中最常用的就是基于下标的get和set方法:
— E get(int index) 获取集合中指定下标对应的元素,下标从0开始。
— E set(int index, E element) 将给定的元素存入给定位置,并将原位置的元素返回。在这里插入图片描述
插入和删除
List根据下表的操作还支持插入和删除操作。
— void add(int index, E element) 将给定的元素插入到指定位置,原位置及后续元素都顺序向后移动。
— E remove(int index) 删除给定位置的元素,并将被删除的元素返回。在这里插入图片描述
subList
List的subList方法用于获取子List。
需要注意的是,subList获取的List与原List占有相同的存储空间,对子List的操作会影响原List。
— List subList(int fromIndex, int toIndex);
fromIndex和toIndex是截取子List的首尾下标(前包括,后不包括)在这里插入图片描述
在这里插入图片描述
List转换为数组toArray
List的toArray方法用于将 集合转换为数组。但实际上该方法是在Collection中定义的,所以所有的集合都具备这个功能。
其有两个方法:
— Object[] toArray()
— T[] toArray(T[] a)
其中第二个方法是比较常用的,我们可以传入一个指定类型的数组,该数组的元素类型应与集合的元素类型一致。返回值则是转换后的数组,该数组会保存集合中所有的元素。在这里插入图片描述
数组转换为List
Arrays类中提供了一个静态方法asList,使用该方法我们可以将一个数组转换为对应的List集合。
其方法定义为:
— static List asList<T… a>
返回的List的集合元素类型由传入的数组的元素类型决定。
并且要注意的是,返回的集合我们不能对其增删元素,否则会抛出异常。并且对集合的元素进行修改会影响数组对应的元素。在这里插入图片描述
1.3 List排序
Collection.sort方法实现排序
Collections是集合的工具类,它提供了很多便于我们操作集合的方法,其中就有用于集合排序的sort方法。
该方法定义为:
— static void sort(List list) 该方法的作用是对给定的集合元素进行自然排序。在这里插入图片描述
Comparable
Collections的sort方法是对集合元素进行自然排序,那么两个元素对象之间就一定要有大小之分。这个大小之分是如何界定的?实际上,在使用Collections的sort排序的集合元素都必须是Comparable接口的实现类,该接口表示其子类是可比较的,因为实现该接口必须重写抽象方法:
— int compareTo(T t); 该方法用于使当前对象与给定对象进行比较。
— 若当前对象大于给定对象,那么返回值应为>0的整数。
— 若小于给定对象,那么返回值应为<0的整数。
— 若两个对象相等,则应返回0。在这里插入图片描述
Comparator
一旦Java类实现了Comparable接口,其比较逻辑就已经确定;如果希望在排序的操作中临时指定比较规则,可以采用Comparator接口回调的方式。
Comparator接口要求实现类必须重写其定义的方法:
— int compare(T o1, T o2)
该方法的返回值要求
— 若o1>o2则返回值应>0
— 若o1<o2则返回值应<0
— 若o1==o2则返回值应为0在这里插入图片描述
2 队列和栈
2.1 Queue队列
队列是常用的数据结构,可以将队列看成特殊的线性表,队列限制了对线性表的访问方式:只能从线性表的一端添加(offer)元素,从另一端取出(poll)元素。
队列遵循先进先出(FIFO First Input First Output)的原则。
JDK中提供了Queue接口,同时使得LinkedList实现了该接口(选择LinkedList实现Queue的原因在于Queue经常要进行添加和删除的操作,而LinkedList在这方面效率较高)。
Queue接口中主要方法如下:在这里插入图片描述
在这里插入图片描述
2.2 Deque双端队列
Deque是Queue的子接口,定义了所谓“双端队列”即从队列的两端分别可以入队(offer)和出队(poll),LinkedList实现了该接口。
如果将Deque限制为只能从一端入队和出队,则可实现“栈”(Stack)的数据结构,对于栈而言,入栈称之为push,出栈称之为pop。
栈遵循先进后出(FILO First Input Last Output)的原则。在这里插入图片描述
在这里插入图片描述
3 Map接口
3.1 Map接口
Map接口定义的集合又称查找表,用于存储所谓“Key-Value”映射对。Key可以看成是Value的索引,作为Key的对象在集合中不可以重复。
根据内部数据结构的不同,Map接口有多种实现类,其中常用的有内部为hash表实现的HashMap和内部为排序二叉树实现的TreeMap。
3.2 常用API
put()方法
Map接口中定义了向Map中存放元素的put方法:
— V put(K key, V value)
将Key-Value对存入Map,如果在集合中已经包含该Key,则操作将替换该Key所对应的Value,返回值为该Key原来所对应的Value(如果没有则返回null)。在这里插入图片描述
get()方法
Map接口中定义了从Map中获取元素的get方法:
— V get(Object key)
返回参数key所对应的Value对象,如果不存在则返回null。在这里插入图片描述
containsKey()方法
Map接口中定义了判断某个key是否在Map中存在:
— boolean containsKey(Object key);
若Map中包含给定的key则返回true,否则返回false。在这里插入图片描述
3.3 HashMap
Hash表远离在这里插入图片描述
hashCode方法
从HashMap的原理中我们可以看到,key的hashCode()方法的返回值在HashMap存储元素时会起着很重要的作用。而hashCode()方法实际上是在Object中定义的(Object提供的hashCode方法将返回该对象所在的内存地址的整数形式)。
hashCode方法需要注意:
第一:与equals方法的一致性,即equals比较返回true的两个对象其hashCode方法返回值应该相同;
第二:hashCode返回的数值应符合hash算法的要求,试想如果有很多对象的hashCode方法返回值都相同,则会大大降低hash表的效率,一般情况下可以使用IDE(如Eclipse)提供的工具自动生成hashCode方法。
装载因子以及HashMap优化
Capacity:容量,hash表里bucket(桶)的数量,也就是散列数组大小。
Initial capacity:初始容量,创建hash表时,初始bucket的数量,默认构建容量为16,也可以使用特定容量。
Size:大小,当前散列表中存储数据的数量。
Load factor:加载因子,默认值0.75(就是75%),当向散列表增加数据时如果size/capacity的值大于Load factor则发生扩容并且重新散列(rehash)。
性能优化:加载因子较小时,散列查找性能会提高,同时也浪费了散列桶空间容量。0.75是性能和空间相对平衡结果。在创建散列表时指定合理容量,减少rehash提高性能。
3.4 Map的遍历
Map提供了三种遍历方式:
— 遍历所有的Key
— 遍历所有的Key - Value对
— 遍历所有的Value(不常用)
遍历所有Key的方法
— Set keySet() 该方法会将当前Map中所有的key存入一个Set集合后返回。在这里插入图片描述
遍历所有键值对的方法
— Set<Entry<K, V>> entrySet() 该方法会将当前Map中每一组key-value对封装为一个Entry对象并存入一个Set集合后返回。在这里插入图片描述
3.5 有序的Map — LinkedHashMap
使用Map接口的哈希表和链表实现,具有可预知的迭代顺序。此实现与HashMap的不同之处在于:LinkedHashMap维护着一个双向循环链表。此链表定义了迭代顺序,该迭代顺序通常就是存放元素的顺序。
需要注意的是,如果在Map中重新存入已有的key,那么key的位置不会发生改变,只是将value值替换。
统计各点PM2.5最大值(要求顺序)在这里插入图片描述
4 文件操作 — File
4.1 创建File对象
java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录。File类只用于表示文件(目录)的信息(名称、大小等),不能对文件的内容进行访问。
构造方法:
File(String pathname) 通过将给定路径名字符串转换成抽象路径名来创建一个新的File实例。
— 抽象路径应尽量使用相对路径,并且目录的层级分隔符不要直接写“/”或“\”,应使用File.separator这个常量表示,以避免不同系统带来的差异。在这里插入图片描述
File(File parent, String child) 根据parent抽象路径名和child路径名字符串创建一个新的File实例在这里插入图片描述
4.2 常用API
isFile()方法
File的isFile方法用于判断当前File对象所表示的是否为一个文件。
— boolean isFile() 返回值:当前File对象所表示的是一个文件时返回true。在这里插入图片描述
length()方法
File的length方法用于返回此抽象路径名表示的文件的长度(占用的字节量)
— long length() 返回值:当前File对象所表示的文件所占用的字节量在这里插入图片描述
exists()方法
File的exists方法用于测试此抽象路径名表示的文件或目录是否存在
— boolean exists() 返回值:若该File表示的文件或目录存在则返回true,否则返回false
createNewFile() 方法
File的createNewFile方法用于当且仅当不存在具有此抽象路径名指定的名称的文件时,创建由此抽象路径名指定的一个新的空文件。
— boolean createNewFile() 返回值:如果指定的文件不存在并成功地创建,则返回true;如果指定的文件已经存在,则返回false。在这里插入图片描述
delete()方法
File的delete方法用于删除此抽象路径名表示的文件或目录
— boolean delete() 返回值:当且仅当成功删除文件或目录时,返回true;否则返回false。
需要注意的是,若此File对象所表示的是一个目录时,在删除时需要保证此为空目录才可以成功删除。在这里插入图片描述
isDirectory()方法
File的isDirectory方法用于判断当前File表示的是否为一个目录。
— boolean isDirectory() 返回值:当File对象表示的是一个目录时返回true;否则返回false在这里插入图片描述
mkdir()方法
File的mkdir方法用于创建此抽象路径名指定的目录。
— boolean mkdir() 返回值:当且仅当已创建目录时,返回true;否则返回false在这里插入图片描述
mkdirs()方法
File的mkdirs方法用于创建此抽象路径名指定的目录,包括所有必须但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必须的父目录。
— boolean mkdirs() 返回值:当且仅当已创建目录以及所有必需的父目录时,返回true;否则返回false在这里插入图片描述
listFiles()方法
File的listFiles方法用于返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的子项(文件或目录)。
— File[] listFiles() 返回值:抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。如果目录为空,那么数组也将为空。如果抽象路径名不表示一个目录,或者发生I/O错误,则返回null。
输出一个当前目录下的内容在这里插入图片描述
4.3 FileFilter接口
FileFilter用于抽象路径名的过滤器
此接口的实例可传给File类的listFiles(FileFilter)方法。用于返回满足该过滤器要求的子项。
— File[] listFiles(FileFilter filter)在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值