Java标准库自带的java.util包提供了集合类:Collection,它是除Map外所有其他集合类的根接口。Java的java.util包主要提供了以下三种类型的集合:
List:一种有序列表的集合,例如,按索引排列的Student的List;Set:一种保证没有重复元素的集合,例如,所有无重复名称的Student的Set;Map:一种通过键值(key-value)查找的映射表集合,例如,根据Student的name查找对应Student的Map。Java集合的设计有几个特点:
一、实现了接口和实现类相分离,例如,有序表的接口是List,具体的实现类有ArrayList,LinkedList等;
二、支持泛型,我们可以限制在一个集合中只能放入同一种数据类型的元素,例如:
List<String> list = new ArrayList<>(); // 只能放入String类型三、Java访问集合总是通过统一的方式——迭代器(Iterator)来实现,它最明显的好处在于无需知道集合内部元素是按什么方式存储的。
List是最基础的一种集合:它是一种有序列表。
List的行为和数组几乎完全相同:List内部按照放入元素的先后顺序存放,每个元素都可以通过索引确定自己的位置,List的索引和数组一样,从0开始。
在实际应用中,需要增删元素的有序列表,我们使用最多的是ArrayList。
ArrayList把添加和删除的操作封装起来,让我们操作List类似于操作数组,却不用关心内部元素如何移动。
我们考察List<E>接口,可以看到几个主要的接口方法:
在末尾添加一个元素:void add(E e)在指定索引添加一个元素:void add(int index, E e)删除指定索引的元素:int remove(int index)删除某个元素:int remove(Object e)获取指定索引的元素:E get(int index)获取链表大小(包含元素的个数):int size()但是,实现List接口并非只能通过数组(即ArrayList的实现方式)来实现,另一种LinkedList通过“链表”也实现了List接口。在LinkedList中,它的内部每个元素都指向下一个元素。
通常情况下,我们总是优先使用ArrayList。
List的特点
元素可重复;元素可为null
创建List
1.ArrayList
2.LinkedList
3.of方法(不可传入null):
List<Integer> list = List.of(1, 2, 5);List遍历
不推荐使用for循环根据索引配合get(int)方法遍历(get()方法对于LinkedList而言,索引越大,访问速度越慢。),如:
public class Main { public static void main(String[] args) { List<String> list = List.of("apple", "pear", "banana"); for (int i=0; i<list.size(); i++) { String s = list.get(i); System.out.println(s); } } }推荐方法:迭代器(Iterator)
Iterator对象有两个方法:1.boolean hasNext()判断是否有下一个元素,2.E next()返回下一个元素。
使用Iterator遍历List代码如下:
public class Main { public static void main(String[] args) { List<String> list = List.of("apple", "pear", "banana"); for (Iterator<String> it = list.iterator(); it.hasNext(); ) { String s = it.next(); System.out.println(s); } } }对于Java而言,Iterator遍历使用频率非常高,for each循环本身就可以帮助我们使用Iterator进行遍历,即得到简化版List遍历代码如下:
public class Main { public static void main(String[] args) { List<String> list = List.of("apple", "pear", "banana"); for (String s : list) { System.out.println(s); } } }Java默认配置文件以.properties为扩展名,每行以key=value表示,因此可以使用Map<String, String>来表示。示例配置文件如下:
# setting.properties last_open_file=/data/hello.txt auto_save_interval=60可以从文件系统读取该.properties文件
String f = "setting.properties"; Properties props = new Properties(); props.load(new java.io.FileInputStream(f)); String filepath = props.getProperty("last_open_file"); String interval = props.getProperty("auto_save_interval", "120");可见,用Properties读取配置文件,一共有三步:
创建Properties实例;调用load()读取文件;调用getProperty()获取配置。需要注意的是,由于load(InputStream)默认总是以ASCII编码读取字节流,所以会导致读到乱码。我们需要用另一个重载方法load(Reader)读取:
Properties props = new Properties(); props.load(new FileReader("settings.properties", StandardCharsets.UTF_8));就可以正常读取中文。