给大忙人看的Java核心技术笔记(7、集合)

要点:

  1、Collection接口为所有集合类提供了共同方法(映射除外,映射是通过Map接口描述的)

  2、列表是一个有序集合,其中的每个元素都有一个整数索引

  3、set针对高效包含测试进行过优化。Java提供了HashSet和TreeSet实现

  4、对映射来说,可以选择HashMap或TreeMap实现。LinkedHashMap会记住元素插入的顺序。

  5、Collection接口和Collections类提供了很多有用的算法:如设置操作,查询、排序、打乱原先顺序等

  6、视图通过使用标准集合接口提供了对存储在其他地方的数据的访问

1、简介

  ArrayList和LinkedList,一个是链表,一个是线性表。

    List接口提供了访问列表中第n个元素的方法,尽管这种访问方式可能效率有些低。也就是说,一个集合类应该实现RandomAccess接口。这是一个没有方法的标记接口。

    例如,ArrayList实现了List和RandomAccess,但是LinkedList只实现了List接口。

  在set中元素不会被插入到特定的位置,并且不允许重复的元素。SortedSet允许按顺序的迭代,NavigableSet含有寻找元素邻居的方法。

  Queue会记住插入的顺序,但是只能在尾端插入元素,头部删除它们。Deque(双端队列)

  所有的集合接口都是泛型类型的,带有表示元素类型的类型参数。

  Collections类的有用方法:

    P237 !

2、迭代器

1 Collection<String> coll = ...;
2 Iterator<String> iter = coll.iterator();
3 while(iter.hasNext()){
4    String element = iter.next();   iter.remove();
5 }

remove方法移除了迭代器返回的最后一个元素,并不是迭代器指向的元素。在中间没有调用next或previous时不能连续两次调用remove

1 List<String> friends = new LinkedList<>();
2 ListIterator<String> iter = friends.listIterator();
3 iter.add("a");// a|
4 iter.add("b");// a b |
5 iter.previous();// a|b
6 iter.add("c");// a | c
7 //ListIterator和链表一起使用
8 //在迭代之前添加元素,将被访问的元素设置为不同值,向后回溯

如果你用多个迭代器访问一个数据结构,其中一个使数据结构发生改变,那么其他的迭代器可能会失效。如果继续使用的话,一个无效的迭代器可能抛出ConcurrentModificationException

3、set

  set可以高效的检测一个值是不是它的元素(是否包含在内contains())。但是不记得元素添加的顺序。当顺序无关紧要时,set是很有用的。

  如果想要按顺序便利集合,可以使用TreeSet。set的元素必须实现Comparable接口,或者在构造函数中提供Comparator

  TreeSet类实现了SortedSet和NavigableSet接口

    P241 SortedSet和NavigableSet方法!

4、Map

  map存储键和值之间的联系。调用put方法建立新的联系,或者改变已存键所对应的值(put方法可以更新键下的值)。

  不用按顺序访问用HashMap,如果要按序访问用TreeMap

    int count = counts.get("a"); //如果键不存在get返回Null,当值拆箱时会出空指针异常

    int count = counts.getOrDefault("a",0);//建议使用

  计数器,当存在就加一:

    counts.merge(word, 1, Integer::sum);

    如果word键之前不存在,就将word与1联系起来,否则就用Integer::sum函数将之前的值加1

  P243 Map方法! 没看懂。

1 //迭代Map
2 for(Map.Entry<String, Integer> entry : counts.entrySet()){
3   String k = entry.getKey();
4   Integer V = entry.getValue();
5 }
6 //或者
7 counts.forEach((k,v)->{k,v处理});

5、其他集合

  Properties类可以容易地使用纯文本格式保存和加载的映射。通常用来存储项目的配置选项。

1 Properties settings = new Porperties();
2 settings.put("width", "200");
3 settings.put("title", "hello");
4 try(OutputStream out = Files.newOutputStream(Path)){
5     settings.store(out, "Properties");
6 }

  属性文件使用ASCII编码而不是UTF-8,注释以#或!开头,不在范围的字符会Uniode转义格式写入

1 //从文件加载属性
2 try(InputStream in = Files.newInputStream(path)){
3   settings.load(in);
4 }
5 String tilte = settings.getProperty("tilte","New Document");

  System.getProperties()获得系统properties对象。System.getenv()获得Java虚拟机环境变量。

  

时间: 2024-10-06 15:55:11

给大忙人看的Java核心技术笔记(7、集合)的相关文章

给大忙人看的Java核心技术笔记(4、继承与反射)

继承是在现有类的基础上创建新类的过程.(实例变量和静态变量统称为域,类中的域.方法.嵌套类.接口统称为类成员) 反射机制:在程序运行期间查找类及其成员的能力 abstract方法没有实现:abstract类不能被实例化. 子类不能直接访问父类的私有实例变量. 不同于this引用,super不是对象的引用,而是绕过动态查找方法并调用特定方法的指令. 覆盖一个方法时,可以将返回类型改成子类型(协变返回类型是允许的) 重载一个方法时,子类方法的可见性至少与父类方法一样.父类方法是公有的,子类方法也必须

给大忙人看的Java核心技术笔记(6、泛型编程)

要点: 泛型类是带有一个或多个类型参数的类 泛型方法是带有类型参数的方法 可以要求类型参数必须是一个或者多个类型的子类型 泛型类型是不变得:当S是T的子类型是,G<S>和G<T>没有关系 通过使用通配符G<? extends T>或者 G<? super T>,你可以指定一个方法接受一个带子类或父类参数的泛型类型的实例 当泛型类和方法被编译时,类型参数会被擦除 类型擦除对泛型有诸多限制.特别是,不能实例化泛型类或数组.不能转换成泛型类型,或者抛出一个泛型类型

给大忙人看的Java核心技术笔记(10、并发编程)

本章要点: Runnable表述一个可以异步执行的任务 Executor将Runnable实例列入执行计划 Callable描述一个会产生结果的任务 可以向ExecutorService提交一个或多个Callable实例,并且当这些Callable有执行结果后,合并这些结果 当多个线程在没有同步的情况下操作共享数据时,其结果是不可预知的 与使用锁机制编程相比,并行算法和线程安全的数据结构更好 并行Stream和数组操作可以自动并且安全地将计算并行化运行 ConcurrentHashMap是线程安

给大忙人看的Java核心技术笔记(3、接口和lambda表达式)

1.接口是面向对象的关键特性:他们让你在不提供实现的情况下,指定应该做什么 近来,应为函数式编程非常适合并发和事件驱动编程,其重要性有所提升 接口的所有方法默认为公有方法,不用特意声明为public 实现类必须将接口方法声明为public,否则默认情况下,他们在包级别可访问.应为接口要求public级别访问,所以会报错 如果一个类只实现接口的某些方法,必须用abstract修饰 2.转换为接口类型 IntSequence digits = new DigitSequence(); 这句话创建的对

《写给大忙人看的java》笔记--基本的编程结构

1.字符串是UTF-16编码中的Unicode编码点的序列 2.绑定System.in的Scanner可以读取终端输入: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco } span.s1 { text-decoration: underline; color: #7e504f } span.s2 { color: #931a68 } span.s3 { color: #0326cc } Scanner sc = new S

《写给大忙人看的java se 8》笔记

现在才来了解java8,是不是后知后觉了点? 新的编程技术,个人不喜欢第一时间跟进. 待社区已有实践积淀再切入似乎更划算些? 一点点精明的考虑. 不多说,上代码. //读<写给大忙人看的java se 8>做的笔记代码 //希望对忙到连这书都没工夫看的你,匆匆一瞥,留下印象 //祝编程愉快 public class MainTest { //第一章,讲lambda表达式 //lambda表达式类似javascript的函数字面量,可用于替代java的匿名内部类 //基本型为 (形参列表)-&g

黑马程序员——JAVA学习笔记八(集合)

1,    JAVA最初版本只为最常用的数据结构提供了很少的一组类:Vector.Stack.Hashtable.BitSet与Enumeration接口,从JAVA1.2版本开始推出了一组功能完善的的数据结构. 集合类的由来:  对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定.  就使用集合容器进行存储. 集合特点: 1,用于存储对象的容器. 2,集合的长度是可变的. 3,集合中不可以存储基本数据类型值. 4,接口与实现相互分离. 集合框架是为表示和操作集合而规定的一种统一的标准

Java核心技术 笔记五 OOP

java 的核心就是面向对象 (完全面向对象的) 面向对象程序设计 就必须清楚对象的三个主要特性 1.对象的行为 2.对象的状态 3.对象标识 除此之外 还需要了解对象之间的关系 比较常见的关系有 依赖 继承 聚合 在Java程序中 程序员应该尽可能的将相互依赖的类减到最少  即减少类间的耦合度 在Java中  并不是所有的类都是具有面向对象的特征 如math类 date类 在对象与对象变量之间存在着一个重要的区别 Date deadline; 这里的定义了一个对象变量deadline   它可

Java核心技术点之集合框架

概述 Java集合框架由Java类库的一系列接口.抽象类以及具体实现类组成.我们这里所说的集合就是把一组对象组织到一起,然后再根据不同的需求操纵这些数据.集合类型就是容纳这些对象的一个容器.也就是说,最基本的集合特性就是把一组对象放一起集中管理.根据集合中是否允许有重复的对象.对象组织在一起是否按某种顺序等标准来划分的话,集合类型又可以细分为许多种不同的子类型. Java集合框架为我们提供了一组基本机制以及这些机制的参考实现,其中基本的集合接口是Collection接口,其他相关的接口还有Ite