java集合就像一个容器,这些对象能够是任意的数据类型,且长度可变。集合按照其存储结构能够分为两大类,即单列集合Collection,和双列集合Map。
这两种集合特色以下:
(1)Collection:单列集合接口,用于存储一系列元素。
Collection集合有两个重要的子接口,分别是List和Set。其中List集合的特色是元素有序,可重复;Set集合的特色是元素无序而且不可重复。List接口的主要实现类有ArrayList和ListedList;Set接口的主要实现类有HashSet和TreeSet。
(2)Map:双列集合的根接口,用于存储具备键(Key),值(Value)映射关系的元素。
Map集合中每一个元素都包含一对键值,而且Key是惟一的,在使用Map集合时能够经过指的Key找到对应的Value。Map接口的主要实现类有HashMap和TreeMap。java
List接口继承于Collection接口,在List集合中容许出现重复的元素,在程序中能够经过索引来访问集合中的指定元素,另外List集合还有一个特色就是存取有序。面试
ArrayList内部封装了一个长度可变的数组对象(初始容量为8,按1.5倍扩容),在ArrayList中进行增删改查效率会比较低,可是在遍历和查找元素时显得很是高效。
LinkedList集合
为了克服ArrayList增删效率低的问题,能够用LinkedList,该集合内有一个双向循环链表,增删效率较高。数组
Iterator对象被称为迭代器,用来访问Collection中的元素。在使用迭代器对集合元素迭代是,若是调用了remove的方法去删除元素,,会出现异常。缘由是集合中删除元素会致使迭代器语气的迭代次数发生改变,致使迭代器的结果不许确。架构
public class Test1 { public static void main(String[] args) { // 建立ArrayList对象 ArrayList list = new ArrayList(); // 添加元素 list.add("data_1"); list.add("data_2"); list.add("data_3"); Iterator iterator = list.iterator(); while (iterator.hasNext()){ //hasNext()判断集合中是否存在下一个元素 Object object = iterator.next(); //若是存在,则调用next()将其取出,不然说明已经到达了集合末尾,中止遍历 System.out.println(object); } } } //输出结果为 data_1 data_2 data_3
foreach是一种简介的for循环,也被称为加强for循环。foreach循环用于遍历数组或集合中的元素,具体语法格式以下ide
for( 容器中的元素类型 临时变量 : 容器变量 ){ //执行语句 } public class Test1 { public static void main(String[] args) { // 建立ArrayList对象 ArrayList list = new ArrayList(); // 添加元素 list.add("data_1"); list.add("data_2"); list.add("data_3"); for (Object object : list) { System.out.println(object); } } }
foreach也存在局限性,当时用foreach循环时,不能对集合中元素进行修改。性能
在JDK8中,根据Lambda表达式的特性还增长了一个forEach方法来遍历集合,演示以下学习
public class Test1 { public static void main(String[] args) { // 建立ArrayList对象 ArrayList list = new ArrayList(); // 添加元素 list.add("data_1"); list.add("data_2"); list.add("data_3"); list.forEach(obj-> System.out.println("迭代器集合元素"+obj)); } } //输出结果为 迭代器集合元素data_1 迭代器集合元素data_2 迭代器集合元素data_3
Set接口中的元素无序,而且保证存入的元素不会重复。Set接口主要有两个实现类,分别是HashSet和TreeSet,其中HashSet是根据对象的哈希值来肯定元素集合中的存储位置,所以具备良好的存取和查找性能。TreeSet则以二叉树的方式来存储元素,它能够实现对集合中的元素排序。this
HashSet是set接口的一个实现类,它所存储的元素是不可重复的,而且元素都是无序的。当想HashSet集合中添加元素时,首先会调用hashcode方法来肯定元素的存储位置,而后再调用元素对象的equals()方法来确保该位置没有重复元素。编码
public class Test1 { public static void main(String[] args) { HashSet hashSet = new HashSet(); hashSet.add("Jack"); hashSet.add("Rose"); hashSet.add("Eve"); hashSet.add("Rose"); hashSet.forEach(obj-> System.out.println(obj)); } } //输出结果为 Eve Rose Jack
向集合中存入元素时,为了保证HashSet正常工做,要求在存入对象是,须要重写Object类中的hashCode()和equals()方法。上个例子将字符串存入HashSet时,String类已经默认重写了hashCode的方法,可是有时候传入自定义类型的对象存入HashSet,须要重写方法。spa
package Demo01; import java.util.ArrayList; import java.util.*; /** * @author Dell */ public class Test1 { public static void main(String[] args) { HashSet hashSet = new HashSet(); hashSet.add(new Student("2","zhang")); hashSet.add(new Student("8","name")); hashSet.add(new Student("4","jack")); hashSet.add(new Student("6","row")); hashSet.forEach(); } } class Student{ String id; String name; public Student(String id, String name) { this.id = id; this.name = name; } @Override public String toString(){ return id+" "+name; } @Override public int hashCode(){ return id.hashCode(); } @Override public boolean equals(Object object){ if(this == object){ //判断是不是同一个对象 return true; //若是是,返回true } if(!(object instanceof Student)){ //判断对象是为Student类型 return false; //若是不是,返回false } Student student = (Student) object; //将对象强转为Student类型 boolean b = this.id.equals(student.id); //判断id值是否相同 return b; //返回判断结果 } } //输出结果为 [2 zhang, 4 jack, 6 row, 8 name]
TreeSet采用平衡二叉树来存储元素,这样的结构能够保证TreeSet集合中没有重复的元素,且能够排序。集合中的元素在进行比较时,都会调用compareTo()方法,该方法是Comparable定义的。在向TreeSet传入自定义数据时,没有实现Comparable接口。为了解决这个问题java提供了两种方法分别为天然排序和定制排序。
//天然排序 package Demo01; import java.util.ArrayList; import java.util.*; /** * @author Dell */ public class Test1 { public static void main(String[] args) { TreeSet treeSet = new TreeSet(); treeSet.add(new Teacher("jack",18)); treeSet.add(new Teacher("rose",19)); treeSet.add(new Teacher("tom",19)); treeSet.add(new Teacher("rose",19)); System.out.println(treeSet); } } // 定义Teacher类实现Comparable接口 class Teacher implements Comparable{ String name; int age; public Teacher(String name, int age) { this.name = name; this.age = age; } @Override public String toString(){ return name +":"+age; } // 重写Comparable接口的compareTo()的方法 @Override public int compareTo(Object obj){ Teacher teacher = (Teacher) obj; // 定义比较方式,先比较年龄,再比较名称name if(this.age- teacher.age>0){ return 1; } if(this.age- teacher.age==0){ return this.name.compareTo(teacher.name); } return -1; } } //输出结果为 [jack:18, rose:19, tom:19]
Teacher类实现了Comparable接口,并重写compareTo()方法。在compareTo()方法中,首先针对age值进行修改,根据比较结果返回-1和1,当age相同时,再对name进行比较。教师Teacher对象首先按照年龄升序排序,年龄相同时会按照姓名进行升序排序,而且TreeSet集合会将重复的元素去掉。
//定制排序 package Demo01; import java.util.*; /** * @author Dell */ public class Test1 { public static void main(String[] args) { // 1.建立集合时,传入Comparator接口实现定制排序规则 TreeSet treeSet = new TreeSet(new MyComparator()); treeSet.add("jack"); treeSet.add("hello"); treeSet.add("tom"); System.out.println(treeSet); // 2.建立集合时,使用Lambda表达式定制排序规则 TreeSet treeSet1 = new TreeSet((obj1,obj2)->{ String s1 = (String) obj1; String s2 = (String) obj2; return s1.length() - s2.length(); }); treeSet1.add("jack"); treeSet1.add("tom"); treeSet1.add("hello"); System.out.println(treeSet1); } } class MyComparator implements Comparator{ @Override public int compare(Object obj1, Object obj2){ //定制排序方式 String str1 = (String) obj1; String str2 = (String) obj2; int temp = str1.length()-str2.length(); return temp; } }
Map接口是一个双列集合,它的每一个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。Map中key和value能够是任意数据类型,而且键对象Key不容许重复,在访问Map集合中的元素时,只要指定了Key,就能找到对应的Value。
HashMap集合时Map接口的一个实现类,它用于存储键值映射关系,该集合的键和值容许为空,但键不能重复,且集合中的元素是无序的。
使用Iterator遍历集合须要先将Map集合转换为Iterator接口对象,而后进行遍历。因为Map集合中元素是有键值对构成的,因此使用Iterator遍历,有两种方法,即keySet()和entrySet()
keySet()方法须要将Map集合中全部的键对象转换为Set单列集合,接着将含键对象的Set集合转换为Iterator接口对象,而后遍历Map集合中全部的键,再根据键获取相应的值。
//该方法是keySet()方法 import java.util.*; /** * @author Dell */ public class Test1 { public static void main(String[] args) { Map map = new HashMap(); map.put("3", "Jack"); map.put("1", "Rock"); map.put("2", "Tom"); Set keySet = map.keySet();//获取键的集合 Iterator iterator = keySet.iterator();//迭代键的集合 while (iterator.hasNext()) { Object key = map.keySet(); Object value = map.get(key);//获取每一个键所对应的值 System.out.println(key + ":" + value); } } }
entrySet()方法将原有的Map集合中的键值对做为一个总体返回Set集合,接着将包含键值对对象的Set集合转换为Iterator接口对象,而后获取集合中的全部键值对映射关系,在从映射关系中取出键和值。
//该方法是entrySet()方法 package Demo01; import java.util.*; /** * @author Dell */ public class Test1 { public static void main(String[] args) { Map map = new HashMap(); map.put("3", "Jack"); map.put("1", "Rock"); map.put("2", "Tom"); Set entrySet = map.entrySet(); Iterator iterator = entrySet.iterator();//获取Iterator对象 while (iterator.hasNext()){ Map.Entry entry = (Map.Entry)(iterator.next());//获取集合中键值对映射关系 Object key = entry.getKey();//获取Entry中的键 Object value = entry.getValue();//获取Entry中的值 System.out.println(key + ":" + value); } } }
public class Test1 { public static void main(String[] args) { Map map = new HashMap(); map.put("3", "Jack"); map.put("1", "Rock"); map.put("2", "Tom"); map.forEach((key, value) -> System.out.println(key + ":" + value)); } }
在map集合中还提供了一个values()的方法,经过这个方法,能够直接获取Map中存储全部值的Collection集合
public class Test1 { public static void main(String[] args) { Map map = new HashMap(); map.put("3", "Jack"); map.put("1", "Rock"); map.put("2", "Tom"); Collection values = map.values();//获取map集合中values值集合对象 values.forEach(v-> System.out.println(v)); } }
建立LinkedHashMap集合,可保证存取顺序一致。
Properties集合是HashTable的子类,Properties主要用来存储字符串类型的键和值。
在文件目录中添加配置文件 文件名为test.properties
下面来展现如何对properties配置文件进行读取和写入操做
Background = black name = zhang age = 19
package Demo01; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; public class Test1 { public static void main(String[] args) throws Exception { // 1.经过properties进行属性文件读取操做 Properties pps = new Properties(); // 加载要读取的文件test.properties pps.load(new FileInputStream("test.properties")); // 遍历test.properties键值对元素信息 pps.forEach((k,v)-> System.out.println(k +":"+ v)); // 2.经过properties进行属性文件写入操做 // 指定要写入操做的文件名称和位置 FileOutputStream out = new FileOutputStream("test.properties"); // 向properties类文件进行希尔键值对信息 pps.setProperty("charset","UTF-8"); // 将此properties集合中新增的键值对信息写入配置文件中 pps.store(out,"新增charset编码"); } } //第一次输出结果为 background:black name:zhang age:19 //第二次输出结果为 charset:UTF-8 background:black name:zhang age:19
在文章的最后做者为你们整理了不少资料!包括java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书等等!有须要的朋友关注公众号:前程有光,自行下载便可!