集合操作
1.ArrayList类、LinkedList类使用及分析
- java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为 查询数据、遍历数据,所以 ArrayList 是最常用的集合。
- 在教学及开发过程中,发现很多新人在编码时非常随意地去使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。
- java.util.LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合 【LinkedList是一个双向链表】
图解LinkedList:
- 实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。这些方 法我们作为了解即可:
public void addFirst(E e) :将指定元素插入此列表的开头。
public void addLast(E e) :将指定元素添加到此列表的结尾。
public E getFirst() :返回此列表的第一个元素。
public E getLast() :返回此列表的最后一个元素。
public E removeFirst() :移除并返回此列表的第一个元素。
public E removeLast() :移除并返回此列表的最后一个元素。
public E pop() :从此列表所表示的堆栈处弹出一个元素。
public void push(E e) :将元素推入此列表所表示的堆栈。
public boolean isEmpty() :如果列表不包含元素,则返回true。
LinkedList是List的子类,List中的方法LinkedList都是可以使用,这里就不做详细介绍,我们只需要了解LinkedList 的特有方法即可。在开发时,LinkedList集合也可以作为堆栈。
import java.util.LinkedList; public class LinkedListDemo { public static void main(String[] args) { LinkedList<String> link = new LinkedList<String>(); //添加元素 link.addFirst("abc1"); link.addFirst("abc2"); link.addFirst("abc3"); System.out.println(link); // 获取元素 System.out.println(link.getFirst()); System.out.println(link.getLast()); // 删除元素 System.out.println(link.removeFirst()); System.out.println(link.removeLast()); //判断集合是否为空 while (!link.isEmpty()) { //弹出集合中的栈顶元素 System.out.println(link.pop()); } System.out.println(link); } }
2.HashSet、TreeSet 使用
简介:
java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方 法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比 Collection 接口更加严格了。
特点:
List 接口不同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
派生类:
Set 集合有多个子类,这里我们介绍其中的 java.util.HashSet 、 java.util.LinkedHashSet 这两个集合。
java.util.HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序 不一致)。
java.util.HashSet 底层的实现其实是一个 java.util.HashMap 支持。
举个栗子:
import java.util.HashSet; public class HashSetDemo { public static void main(String[] args) { //创建 Set集合 HashSet<String> set = new HashSet<>(); //添加元素 set.add(new String("cba")); set.add("bac"); set.add("abc"); set.add("cba"); //遍历 for (String name : set) { System.out.println(name); } } }
什么是哈希表呢?
在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。 但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。
从JDK1.8开始,哈 希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找 时间。 简单的来说,哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示。
图解哈希表:
总而言之,JDK1.8引入红黑树大程度优化了HashMap的性能,那么对于我们来讲保证HashSet集合元素的唯一, 其实就是根据对象的hashCode和equals方法来决定的。
如果我们往集合中存放自定义的对象,那么保证其唯一, 就必须复写hashCode和equals方法建立属于当前对象的比较方式。
3.HashMap、TreeMap 类使用及分析
现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等, 这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即 java.util.Map 接 口。 我们通过查看
特点:
- Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
派生类:
- 通过查看Map接口描述,看到Map有多个子类,这里我们主要讲解常用的HashMap集合、LinkedHashMap集合。
HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需 要重写键的hashCode()方法、equals()方法。
- LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链 表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的 hashCode()方法、equals()方法。
Map接口中的常用方法:
public V put(K key, V value) 把指定的键与指定的值添加到Map集合中。
public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值
public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
public Set keySet() : 获取Map集合中所有的键,存储到Set集合中。
public Set> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)
举个栗子:
import java.util.HashMap; public class HashMapDemo { public static void main(String[] args) { //创建 map对象 HashMap<String, String> map = new HashMap<>(); //添加三个企业及其创始人到map集合 map.put("腾讯", "马化腾"); map.put("国美", "黄光裕"); map.put("乐视", "贾跃亭"); System.out.println(map); // 想要移出 key为乐视的元素 System.out.println("从map中移出企业的创始人是:" + map.remove("乐视"));// 贾跃亭 // 查看移出后、剩余哪些元素 System.out.println("剩余的元素有:" + map); {腾讯=马化腾, 国美=黄光裕} // 想要查看 国美的创始人 是谁 System.out.println("腾讯的创始人:"+ map.get("腾讯")); // 马化腾 System.out.println("国美的创始人:"+ map.get("国美")); // 黄光裕 // 想要查看 美团的创始人 是谁 ? 但是再map中没有存储过、因此会打印出null System.out.println("美团的创始人:"+ map.get("美团")); } }
Map集合遍历键找值方式:
- 键找值方式:即通过元素中的键,获取键所对应的值
- 分析步骤:
- 1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示: keyset()
- 2. 遍历键的Set集合,得到每一个键。
- 3. 根据键,获取键所对应的值。方法提示: get(K key)
举个栗子:
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /* 第三种方法:打印 键值对 */ public class HashMapDemo { public static void main(String[] args) { // 1. 创建 map对象 HashMap<String, String> map = new HashMap<>(); // 2. 添加三个企业及其创始人到map集合 map.put("腾讯", "马化腾"); map.put("国美", "黄光裕"); map.put("乐视", "贾跃亭"); // 3. 将双列集合map集合转换为单列集合set Set<Map.Entry<String, String>> set = map.entrySet(); // 4. 通过单列集合set,调用foreach for(Map.Entry<String, String> founder : set ){ System.out.println(founder); } } }
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /* 第四种方法:打印 键值对 */ public class HashMapDemo { public static void main(String[] args) { // 1. 创建 map对象 HashMap<String, String> map = new HashMap<>(); // 2. 添加三个企业及其创始人到map集合 map.put("腾讯", "马化腾"); map.put("国美", "黄光裕"); map.put("乐视", "贾跃亭"); // 3. 将双列集合map集合转换为单列集合set Set<Map.Entry<String, String>> set = map.entrySet(); // 4. 通过单列集合set,调用迭代器 Iterator<Map.Entry<String, String>> iterator = set.iterator(); while (iterator.hasNext()) { Map.Entry<String, String> founder = iterator.next(); System.out.println(founder); } } }
/* 需求:打印 键值对 */ public class HashMapDem { public static void main(String[] args) { // 1. 创建 LinkedHashMap 类型的 linkedHashMap 对象 LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>(); // 2. 添加三个企业及其创始合 linkedHashMap.put("腾讯", "马化腾"); linkedHashMap.put("乐视", "贾跃亭"); linkedHashMap.put("国美", "黄光裕"); // 3.,取出元素。键找值方式 Set<Map.Entry<String, String>> set = linkedHashMap.entrySet(); for (Map.Entry<String, String> founder : set) { System.out.println(founder.getKey() + "的创始人是:" + founder.getValue()); } } }
4.其它常用集合类介绍
Collections类
- java.utils.Collections 是集合工具类,用来对集合进行操作。部分方法如下:
public static boolean addAll(Collection c, T... elements) 往集合中添加一些元素
public static void shuffle(List list) 打乱顺序 :打乱集合顺序
public static void sort(List list) 将集合中元素按照默认规则排序。
public static void sort(List list,Comparator ) 将集合中元素按照指定规则排序
举个栗子:
import java.util.ArrayList; import java.util.Collections; public class CollectionsDemo { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); // 原始方法是 一个一个添加! //list.add(12); //list.add(14); //list.add(15); //list.add(1000); //采用工具类 一次完成多个元素添加到集合中 Collections.addAll(list, 5,29,32, 1,2); System.out.println(list); //排序方法 Collections.sort(list); System.out.println(list); } }
5.JUnit基本使用
JUnit 是一个 Java 编程语言的单元测试框架
使用方法:
1. 创建一个类 ,命名规范为:XxxTest
public class UserLoginTest { }
2. 创建一个方法,方法名称命名规范为:testXzz
public void testLogin(){ }
3. 在方法上一行加入annotation(注解):@Test
import org.junit.Test; public class UserLoginTest { @Test public void testLogin(){ } }
添加之后,会要求导入一个包。 运行方式:双击选中方法名称,右键run testLogin() 即可/或 选中 run Junit 注: 单元测试方法的权限修饰符必须采用 public 单元测试方法的返回值类型必须采用 void 单元测试方法上一行必须引入@Test注解