集合框架之List、Array List、set、Map
List
List是java集合框架种最常见的一个集合接口,直接从Collection继承而来;List集合是一个有序集合(内部的元素顺序按照添加顺序存储);List接口中包含几个常用的实现类:ArrayList、LinkedList、Vector(JDK1.0)
ArrayList:(数组列表),基于动态数组的实现
LinkedList: (链表),基于链表的实现
Vector:(数组列表),基于动态数组的实现
ArrayList
Arraylist是一个基于数组的动态数组实现,内部可以存储任何的数据类型的元素,提供了一系列的API用于简单的访问列表数据。
ArrayList基本使用
public class ArrayListDemo { public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(10);list.add(20);list.add(30);list.add(40);list.add(50);list.add(60);List<Integer> list2 = new ArrayList<>();list2.add(100);list2.add(200);list.addAll(list2);System.out.println(list.contains(100));// for (Integer integer : list) { // list.remove(integer); // }//不允许在对集合遍历时调用集合的remove方法更改元素,会抛出一ConcurrentModificationException//如果需要在遍历时删除,因该调用通过集合获取的迭代器对象自生的remove方可更改Iterator<Integer> it = list.iterator();while(it.hasNext()){int i = it.next();//remove前要确保next()获取过元素,否则会出现IllegalStateExceptionit.remove();}} }
注意事项:
//不允许在对集合遍历时调用集合的remove方法更改元素,会抛出一个ConcurrentModificationException // for (Integer integer : list) { // list.remove(integer); // }//如果需要在遍历时删除,因该调用通过集合获取的迭代器对象自生的remove方可更改Iterator<Integer> it = list.iterator();while(it.hasNext()){int i = it.next();//remove前要确保next()获取过元素,否则会出现IllegalStateExceptionit.remove();}}
基于sort()方法使用Comparator接口实现集合排序
JDK1.8中List接口新增了默认方法sort用于实现对集合排序,方法内部只需要传入一个排序规则(实现Comparator接口)即可实现对集合元素排序,如下案例:
排序比较器:
/**排序比较器,通过继承Comparator接口并实现compare方法 */ public class MyComparator implements Comparator<String>{/*方法内部需要传入两个被比较的对象,数据类型跟接口泛型一直,方法的返回值为int值,集合的sort方法会自动根据该返回结果决定如何实现对元素的排序*/@Overridepublic int compare(String a, String b) {return a.compareTo(b);} }
测试类
public class TestSort { public static void main(String[] args) {ArrayList<String> names = new ArrayList<>();names.add("tom");names.add("jarry");names.add("admin");names.add("allen");names.add("kobe");//执行排序 names.sort(new MyComparator());for(String n:names){System.out.println(n);}} }
执行结果:
[admin, allen, jarry, kobe, tom]
对于无需反复使用的比较器,可无需单独定义比较器类,直接在sort方法中使用匿名内部类的写法即可完成相同的排序功能:
public class TestSort { public static void main(String[] args) {ArrayList<String> names = new ArrayList<>();names.add("tom");names.add("jarry");names.add("admin");names.add("allen");names.add("kobe");//匿名内部类实现排序规则(回调机制callback)names.sort(new Comparator<String>() {@Overridepublic int compare(String a, String b) {return a.compareTo(b);}});} }
JDK8之后新增的lambda表达式可以进一步简化匿名内部类的写法,如下:
import java.util.ArrayList; public class TestSort { public static void main(String[] args) {ArrayList<String> names = new ArrayList<>();names.add("tom");names.add("jarry");names.add("admin");names.add("allen");names.add("kobe");//lambda表达式names.sort((a,b)->a.compareTo(b));ArrayList<Integer> list = new ArrayList<>();list.add(8);list.add(4);list.add(5);list.add(2);list.add(1);list.add(9);list.add(7);//lambda表达式list.sort((a,b)->a-b);System.out.println(list);} }
中文排序(扩展)
由于在实际开发中排序的规则多变,比如,在中文环境下需要对中文字符串按照汉语拼音的字母表顺序排列,因此,将中文字符串转换为汉语拼音就成为了排序的关键因素;
Pinyin4J插件可以帮助我们实现将中文字符串转换为汉语拼音,使用前需要先将插件包(pinyin4j-XX.jar
)加载到项目中(buildPath),具体使用如下:
public class TestPinyin { public static void main(String[] args) {//将指定的字符转换为汉语拼音String[] str = PinyinHelper.toHanyuPinyinStringArray('中');//由于字符可能存在多种读音,因此返回为各种读音的字符串数组for (String s : str) {System.out.println(s);}String name = "张三疯";//下面的例子演示了如何将“张三疯”转换为zhang1san1feng1的过程String pinyin= "";for (int i = 0; i < name.length(); i++) {char n = name.charAt(i);String[] p = PinyinHelper.toHanyuPinyinStringArray(n); pinyin += p[0];}System.out.println(pinyin); //zhang1san1feng1} }
通过对以上代码的使用,再结合之前的sort方法和Comparator接口即可轻松实现对中文的排序,示例如下:
Student.java
public class Student {private String name;private int age;private double score;public Student() {// TODO Auto-generated constructor stub}public Student(String name, int age, double score) {super();this.name = name;this.age = age;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";}}
TestStudent.java
import java.util.ArrayList; import java.util.Comparator;import net.sourceforge.pinyin4j.PinyinHelper;public class TestStudent2 {public static void main(String[] args) {ArrayList<Student> list = new ArrayList<>();list.add(new Student("张三丰", 19, 55));//zhang 5list.add(new Student("苍老师", 20, 32));//cang 1list.add(new Student("牛德华", 18, 48));//niu 4list.add(new Student("马老师", 21, 98));//ma 3list.add(new Student("柴老师", 23, 101));//chai 2//排序实现list.sort((a,b)->{//分别获取要比较的两个学生的姓名String name1 = a.getName();//zhang1san1feng1String name2 = b.getName();//cang1lao3shi1//声明变量存储转换之后汉语拼音String p1 = "";String p2 = "";//将汉字转拼音for (int i = 0; i < name1.length(); i++) {p1 += PinyinHelper.toHanyuPinyinStringArray(name1.charAt(i))[0];}for (int i = 0; i < name2.length(); i++) {p2 += PinyinHelper.toHanyuPinyinStringArray(name2.charAt(i))[0];}//比较return p1.compareTo(p2); });for (Student s : list) {System.out.println(s);}} }
Set
Collection接口还提供了另一个子接口Set,Set是一个无序集合,元素的存储顺序不是按照添加顺序存储(具体存储顺序跟使用的实现类有关);因为元素的存储是无序的,因此无法像List一样通过索引获取元素,所以对于Set集合中元素的获取只能通过迭代器进行迭代;另外Set集合中不允许出现重复的元素(不允许存在e1.equals(e2)),实际上是后出现的元素会覆盖原来存在的。
Set集合有两个常见的实现:
HashSet:基于散列算法(Hashtable)实现的元素存储顺序
TreeSet:基于二叉树中红黑树的实现,元素的排序方式需要通过实现Comparable或者Comparator接口完成
public class HashSetDemo { public static void main(String[] args) {//无序(不按照添加顺序存储),不允许重复HashSet set = new HashSet();set.add("hello");set.add("rose");set.add("123");set.add(true);set.add(100);set.add(3.14);set.add("rose");set.add(null);System.out.println(set.size());System.out.println(set);for (Object obj : set) {System.out.println(obj);}System.out.println("----------------");Iterator it = set.iterator();while(it.hasNext()){Object obj = it.next();System.out.println(obj);}} }
HashSet和TreeSet区别?
HashSet:基于Hash表实现的元素存储,内部元素的排序按照hash表中的地址进行排序,内部允许null值存在,但是不允许重复的元素,如果一旦出现重复的元素(此时hash值是已经存在的情况,不会将新的元素存储)。
TreeSet:基于树的实现,内部元素的排序需要通过提供排序比较器(Comparable,Comparator)进行实现;内部的元素必须是Comparable实现类(或者在创建TreeSet对象时提供Comparator比较器),并且由于比较器内部会使用到集合中的元素,因此元素不允许为null(会导致NullPointerException).
Map
Map接口是JDK1.2新增集合框架中的一种容器,Map集合内部的元素存储采用键值对(Key-Value)结构,key不允许重复,另外每一个key都会对应一个value对象;Map集合有三个常见实现类:
HashMap
TreeMap
Hashtable
HashMap使用
public class HashMapDemo { public static void main(String[] args) {HashMap map = new HashMap();map.put(3.14, Math.PI);map.put(1, "hello");map.put(true, new String("true"));map.put("a", "admin");System.out.println(map);System.out.println(map.get("a"));//获取Map中键值对的set集合 // Set set = map.entrySet(); // for (Object obj : set) { // System.out.println(obj); // }//获取Map集合中键集(keys)Set set = map.keySet();for (Object key : set) {System.out.println(key+"-----"+map.get(key)); }//获取Map集合中值集(values)Collection c = map.values();for (Object v : c) {System.out.println(v);}//聊天室,要显示每个ip地址对应的用户的昵称?Map<String,String> users = new HashMap<>();users.put("192.168.4.254", "狗蛋");users.put("192.168.4.151", "翠花");users.put("192.168.4.168", "旺财");users.put("192.168.4.76", "来福");users.put("192.168.4.55", "傻根");//根据key移除指定的元素(key-value对)users.remove("192.168.4.168");System.out.println(users);//获取集合中元素的个数System.out.println(users.size());} }
HashMap、Hashtable、TreeMap的区别?
HashMap:是基于hash表的实现,是Map接口的一个实现类,内部的元素存储顺序是根据key的hash地址进行排序,因此,元素的顺序存储顺序可能跟添加的顺序不一致;HashMap使用链表加数组共同来实现元素存储;HashMap允许空键值出现,但是不允许重复的键存在(值可以重复);HashMap是线程不同步的实现,因此在操作数据时效率较高,但是线程并发是不能保障数据的一致性。如果多线程并发下使用建议使用:
java.util.concurrent.ConcurrentHashMap**
**Hashtable:Hashtable是集合框架出现之前的键值对集合解决方案,从Dictionary类(JDK1.0)继承而来,在JDk1.2出现Map接口后,Hashtable又从改接口实现,Hashtable不允许空键值出现,该类的实现是线程同步,因此在多线程并发操作时对数据的一致性有保障,但是效率低。
TreeMap:是基于二叉树中的红黑树实现,元素的存储按照键的自然顺序排序(键必须实现Comparable接口,或者在创建TreeMap对象时指定的Comparator比较器),TreeMap中的键必须是相同的数据类型,并且不允许空元素出现,同HashMap一样,TreeMap也是线程不同步的实现。
Collections类
Collections类是是一个用于对集合进行一些常规操作的工具类(排序,查找,反转等),内部包含的都是静态方法.
public class CollectionsDemo { public static void main(String[] args) {List<String> list = Arrays.asList("tom","jack","rose","lucy","lily");List<String> list2 = Arrays.asList("狗蛋","傻根","旺财","来福");System.out.println(list);//二分查找int pos = Collections.binarySearch(list, "rose");System.out.println(pos);//将第二个集合拷贝到第一个集合中(第一个集合中的元素会被覆盖) // Collections.copy(list, list2); // System.out.println(list);Collections.emptyList();String s = Collections.max(list);System.out.println(s);//反转集合Collections.reverse(list);System.out.println(list);//洗牌Collections.shuffle(list);System.out.println(list);//排序Collections.sort(list);System.out.println(list);} }
Collection、Collections、Connection什么区别?
Collection:JDK1.2之后出现的集合框架的顶层接口
Collections:跟随集合框架共同出现的一个用处理集合(排序,查找等)相关的工具类
Connection:
排序解决方案Comparable&Comparator
目标类需要实现Comparable接口
public class User implements Comparable<User>{ private String name;private int age;public User() {// TODO Auto-generated constructor stub}public User(String name, int age) {super();this.name = name;this.age = age;} public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;} @Overridepublic int compareTo(User u) {return this.age - u.age;} @Overridepublic String toString() {return "User [name=" + name + ", age=" + age + "]";}}
测试类
public class Test { public static void main(String[] args) {List<User> list = Arrays.asList(new User("tom", 19),new User("jack", 18),new User("curry", 26),new User("james", 16),new User("kobe", 39),new User("wade", 22),new User("zark", 29));//使用该方法时,集合中的类型需要实现Comparable接口,并实现comparaTo方法Collections.sort(list);//使用该方法时,集合中的类型无需实现Comparable接口,但需要通过第二个参数//指定排序比较器(Comparator)并实现比较器中的compare(t1,t2)方法Collections.sort(list,(a,b)->a.getName().compareTo(b.getName()));for (User u : list) {System.out.println(u);}} }
集合框架之List、Array List、set、Map相关推荐
- 集合框架详解之Set、Map接口与实现类
集合框架 1.Set集合 1.1Set集合概述 Set实现类:HashSet类.TreeSet类 特点:无序.无下标.元素不可重复 方法:全部继承自Collection中的方法 1.11 Set接口的 ...
- Java 集合框架(List、Set、Map、Iterator、Stack、Properties)
文章目录 1. ArrayList 2. LinkedList 3. HashSet 4. TreeSet 5. Iterator.ListIterator 6. HashMap 7. TreeMap ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- 集合_java集合框架
java集合框架图 简化图: Java平台提供了一个全新的集合框架."集合框架"主要由一组用来操作对象的接口组成. 不同接口描述一组不同数据类型. 1.Java 2集合框 ...
- Java—集合框架List
集合的概念 现实生活中:很多的事物凑在一起 数学中的集合:具有共同属性的事物的总和 Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象 集合的作用 在类的内部,对数据进行组 ...
- Java基础—集合框架(三)
一Map集合 二Map扩展知识 集合框架(三) 一.Map集合 1.概述 Map集合用于存储键值对,且它保证键的唯一性,并且每个键最多只能映射一个值.Map集合是Set集合的底层实现,其和Collec ...
- 面试新东方,java集合框架把我问懵了
今天视频面试了新东方,笔试题还算可以,涵盖面很广,多数都是牛客网上的题,笔试用了30分钟吧.有想知道笔试题的小伙伴私聊,这里就不展示了. 由于疫情期间,没去现场面试,是在钉钉上进行的视频面试.两个人都 ...
- java把map值放入vector_Thinking in java基础之集合框架
Thinking in java基础之集合框架 大家都知道我的习惯,先上图说话. 集合简介(容器) 把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成 ...
- 集合框架及背后的数据结构、Collection,Map、ArrayList的使用
一.类和接口总览 二.Collection 接口 1.Collection 常用方法 2.Map 接口 三.预备知识-泛型(Generic) 泛型是怎么编译的? 四.预备知识-包装类(Wrapper ...
最新文章
- Git 中.gitignore 使用和.gitignore 无效的解决方法
- cut、tee、split、xargs、bc命令
- 在线运行 Linux,强的离谱!
- 不是说好一起长大的吗?
- 灌水导论——灌水法初步
- shell给python传变量_python和shell 传递变量
- linux下输入法终极解决方案
- Token是什么 Token登录认证
- 模块化设计(程序流程图)
- DirectX11学习笔记01
- 海尔希望小学:同一片蓝天下梦想启航
- 经典点云配准算法:迭代最近点算法ICP(Iterative Closest Point)
- 我的理想计算机系100字,我的理想作文100字
- python破解zip压缩包密码
- uniapp扭蛋抽奖
- Android开发xposed,用Android Studio开发Xposed插件项目步骤
- HDU 5730 Shell Necklace
- virtualapp-RefClass反射机制(转载)
- 处理 echarts 数据过多时的展示问题
- 低压开关柜组成部分图解
热门文章
- 拯救007 迪杰斯特拉最短路解决
- 服务器租用一般价格是多少,如何选择服务商
- 前端面试高频精讲(二)Vue篇
- 文件格式和扩展名不匹配。文件可能已损坏或不安全。除非您信任其来源,否则请勿打开。是否仍要打开它?--解决
- bim推荐计算机配置,BIM建模推荐电脑配置清单 适合Revit软件的BIM建模电脑主机配置...
- ES6 浅谈箭头函数,双冒号符号
- 【原创】【FS】FATFS文件系统介绍(未完待续........2018.4.1)
- MobaXterm使用指南
- 程序员的自我修养之数学基础04:特殊矩阵(零矩阵、单位矩阵、对角矩阵、逆矩阵、转置矩阵、对称矩阵)
- 【.Net实用方法总结】 整理并总结System.IO中File类及其方法介绍