Java集合

Collection接口

Collection接口是List,Set,Queue接口的父类,因此该接口定义的方法能够用于操作List,Set,Queue集合。

看看List的接口:

            @Overridepublic boolean add(Object o) {return false;}@Overridepublic boolean remove(Object o) {return false;}@Overridepublic boolean containsAll(Collection c) {return false;}@Overridepublic boolean addAll(Collection c) {return false;}@Overridepublic boolean addAll(int index, Collection c) {return false;}@Overridepublic boolean removeAll(Collection c) {return false;}@Overridepublic boolean retainAll(Collection c) {return false;}@Overridepublic void clear() {}@Overridepublic Object get(int index) {return null;}@Overridepublic Object set(int index, Object element) {return null;}@Overridepublic void add(int index, Object element) {}@Overridepublic Object remove(int index) {return null;}@Overridepublic int indexOf(Object o) {return 0;}@Overridepublic int lastIndexOf(Object o) {return 0;}@Overridepublic ListIterator listIterator() {return null;}@Overridepublic ListIterator listIterator(int index) {return null;}@Overridepublic List subList(int fromIndex, int toIndex) {return null;}

使用Lambda表达式遍历集合

因为Java8的Iterable接口增加了forEach(Consumer action)默认方法。

而Iterable接口是Collection接口的父类,因此能够使用Lambda表达式。

Consumer接口为函数式接口,唯一一个方法accept。

程序会将集合的元素依次传递给Consumer的accept方法,所以Lambda表达式实现是accept方法。

使用Java8增强的Iterator遍历集合元素

public interface Iterator<E> {boolean hasNext();E next();void remove();void forEachRemaining(Consumer<? super E> action) ;
}

remove();删除集合it.next()返回的元素。利用迭代器对集合元素其他操作(赋值)不能够改变集合的元素值。

it.forEachRemaining(obj->System.out.println("迭代集合元素:"+obj));

使用foreach循环遍历集合元素

for(Object obj:books){//不能修改集合元素

}

使用Java8增强的Predicate操作集合

Collection集合新增的方法,removeIf(Predicate filter)

使用Lambda表达式(目标类型是Predicate )过滤集合

books.removeIf(ele->((String)ele).length()<10);

使用Java8增强的Stream操作集合

Java8的流式的API,Stream,IntStream,LongStream,DoubleStream,Stream是一个通用的接口.

如何使用Stream?

1使用Stream,IntStream,LongStream,DoubleStream的builder()类方法创建该Stream对应的Builder.

2重复调用Builder的add方法添加多个元素。

3调用Builder的build方法获得对应的Stream。

4调用Stream的聚集方法。

Collection接口的stream方法,支持流操作。

Stream接口中的中间方法:返回值是另一个流。

Stream接口中的末端方法:流被销毁。

Set集合

HashSet类:

不能保证元素有序,不是同步的,多线程操作同一个HashSet,必须使用代码保证其同步。集合元素的值可以是null。

HashSet集合判断两个元素相同的标准是:通过equals比较放回true,而且两个对象的hashCode值也相同。

把一个对象放入HashSet集合中,如果重新写equals方法,就必须重写hashCode方法。这是因为equals方法返回true,如果hashCode值不同,从而使两个具有相同的元素的两个对象添加成功。这就违背了set集合元素唯一的规则。

如果hashCode相同,而equals返回false,这就更麻烦。HashSet集合会试图根据hash表保存在同一个位置,但是又不行,否则会只剩下一个对象,所以采用了链式存储结构。访问元素的时候也是根据hashCode值快速定位槽位slot,所以具有两个以上的相同hashCode值元素,会导致性能的下降。

LinkedHashSet类:

有序的链式存储,保证元素与添加时候一致,性能低于HashSet。

TreeSet类

TreeSet是SortedSet接口的实现类,保证了集合元素的有序状态。

总之一句话:如果试图把一个对象添加到TreeSet集合中,而且必须是同一种类型的数据,必须实现Comparable接口,否则将抛出异常。

TreeSet集合判断两个对象相等的标准:两个对象通过CompareTo比较是否返回0,不为0就不相等,才能添加集合中。

定制排序:new TreeSet(Comparator c)

HashSet和TreeSet:

添加、查询时用HashSet,效率高。只有保证排序状态的Set,用TreeSet,它会用了红黑树算法维护集合元素的次序。LinkedHashSet遍历元素的时候要更快。

List集合

ListIterator增加了迭代中添加元素的功能,也继承了Iterator删除元素的功能,此外增加了向前遍历的功能。

ArrayList和Vector实现类

创建一个空的集合默认大小为10.ArrayList是线程不安全的,操作是需要手动同步。而Vector是线程安全的。

Stack是Vector的子类,是栈结构的,同样是线程安全的、性能较差的。可以考虑使用ArrayDeque使用栈功能。

Arrays.ArrayList是Arrays内部类的实例,不是ArrayList和Vector实例。不能使用ArrayList和Vector的方法操作。

Queue集合

public interface Queue<E> extends Collection<E> {boolean add(E e);boolean offer(E e);E remove();E poll();E element();E peek();
}

PriorityQueue实现类

不允许插入null元素,按照元素的大小重新排列,不是按照元素的添加顺序存储,是一个比较标准的队列。

Deque接口和ArrayDeque实现类:同时具备栈和队列的功能

public interface Deque<E> extends Queue<E> {void addFirst(E e);void addLast(E e);boolean offerFirst(E e);boolean offerLast(E e);E removeFirst();E removeLast();E pollFirst();E pollLast();E getFirst();E getLast();E peekFirst();E peekLast();boolean removeFirstOccurrence(Object o);boolean removeLastOccurrence(Object o);boolean add(E e);boolean offer(E e);E remove();E poll();E element();E peek();void push(E e);boolean remove(Object o);boolean contains(Object o);public int size();Iterator<E> descendingIterator();}

LinkedList实现类:实现了List<E>, Deque<E>,    具备List、栈和队列的功能

遍历List集合,对于ArrayList和Vector使用get方法,对于LinkedArrayList使用迭代器。

经常插入、删除的包含大量数据的List,使用LinkedArrayList。

Map集合

HashMap和HashTable都是Map接口的实现类。

Java8改进了HashMap的实现,存在key冲突的情况下依然具有很好的性能。两者之间存着两点典型的区别。HashTable是线程安全的,HashMap不是线程安全的,所以性能会高些。HashTable不允许使用null作为key或者value,而HashMap可以使用null作为key或者value。

由于HashMap的key不能重复,所以最多只有一个key-value对的key为null,但是可以有很多为null的value。

HashMap和HashTable判断key相同的标准:equals返回true,且两个key的hashCode值相同。

HashMap和HashTable判断value相同的标准:equals返回true。

LinkedHashMap实现类,具有顺序性。

Properties类是HashTable的子类。

    public String getProperty(String key) public String getProperty(String key, String defaultValue) public synchronized Object setProperty(String key, String value)public synchronized void load(Reader reader) throws IOException {load0(new LineReader(reader));}public void store(Writer writer, String comments)

SortedMap接口和TreeMap实现类

TreeMap也有两种排序方式:自然排序和定制排序。

IdentityHashMap实现类:

保证key严格的相等。例如字符串常量。

操作集合的工具类Collections

Java提供了一个操作Set,List和Map等集合的工具类Collections。反转List集合的元素,随机排序(洗牌)、向前移动或者向后移动指定数量的元素,二分查找,指定集合中指定元素出现的次数,使用新值代替旧值,子List对象在父List对象第一次出现的位置,根据自然排序或者定制排序返回最大值或者最小值,将指定集合包装成线程同步的集合。

必须掌握的Java基础知识(三)相关推荐

  1. 逻辑运算符,if、swtch语句(java基础知识三)

    1.逻辑运算符的基本用法 * A:逻辑运算符有哪些 &(逻辑与) |(逻辑或) !(逻辑非) ^(逻辑异或) &&(短路与) ||(短路或) * 注意事项: * a:逻辑运算符 ...

  2. java 基础知识三 java变量

    1.作用域 {} 包围起来的代码称之为代码块,在块中声明的变量只能在块中使用 2.常量 就是固定不变的量,一旦被定义,它的值就不能再被改变. 3.变量 变量必须在程序中被定义(或声明)后才能使用,而且 ...

  3. Java基础知识(四) 基本类型与运算

    Java基础知识 基本类型与运算 1. Java提供了哪些基本数据类型 2. 什么是不可变类 3. 值传递与引用传递的区别 4. Math类中的round.ceil和floor方法的功能各是什么 5. ...

  4. java基础知识总结(三)

    类 1. 内部类 1. 内部类分类 Java内部类详解 - 简书 (jianshu.com) java提高篇(十)-----详解匿名内部类 - chenssy - 博客园 (cnblogs.com) ...

  5. Java基础知识 21(Set集合,HashSet集合以及它的三种遍历方式(迭代器,增强for循环,forEach),LinkedHashSet集合,TreeSet集合(自然排序法,比较器排序法))

    Java基础知识 21 Set集合 Set集合:一个不包含重复元素的Collection集合,元素不重复,List集合是允许元素重复的. Set接口的三个字类:HashSet(),LinkedHash ...

  6. Java基础看jvm,JAVA基础知识|java虚拟机(JVM)

    一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...

  7. 【转】Java基础知识整理

    本博文内容参考相关博客以及<Java编程思想>整理而成,如有侵权,请联系博主. 转载请注明出处:http://www.cnblogs.com/BYRans/ PDF版下载链接:<Ja ...

  8. java基础知识之初识java

    java基础知识之初识java JAVA基础课后总结 一 1.计算机程序 定义:程序(Program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合. 2.指令 定义:指令就是指示机 ...

  9. Java基础知识——异常Throwable和Exception

    Java基础知识--异常Throwable和Exception Java设置了异常,旨在鼓励将方法中可能出现的异常告知给使用此方法的程序员(你和我!).当然了,这种方法是比较优雅的,让我们确切的知道是 ...

  10. [JSP暑假实训] 一.MyEclipse安装及JAVA基础知识

    本系列文章是作者暑假给学生进行实训分享的笔记,主要介绍MyEclipse环境下JSP网站开发,包括JAVA基础.网页布局.数据库基础.Servlet.前端后台数据库交互.DAO等知识.非常基础的文章, ...

最新文章

  1. 【机器学习】5行代码在小数据集上涨点
  2. 不管什么事,只要用心做,总不会太差!
  3. 无法从计算机中删除,【求助】Windows无法从该家庭组中删除你的计算机
  4. 查看文件大小du -sh ./ ll -h
  5. Day9 深度学习入门
  6. 听说本周五要进行一个小测试,公司对员工的考核
  7. MySQL优化十大技巧
  8. java找出最高工资和下标_(java)leetcode852 山脉数组的封顶索引(二分查找法找出数组中最大值的下标)(Peak Index in a Mountain Array)...
  9. 文件转换base64流
  10. 三菱有C语言PLC控制器,三菱PLC可程序设计控制器系列软件介绍
  11. 搭建Android开发环境(超详细)
  12. 多线程并发面试题合集
  13. 统计检验 单尾还是双尾
  14. 零售超市pos收银系统多少钱一台
  15. 使用Lens管理多云Kubernetes
  16. 好用的APS系统是什么样的?
  17. 美团2020后台校招题目--美团骑手包裹区间分组
  18. 鲲鹏计算产业的典型应用
  19. 易代账总显示没开启打印服务器,为什么易代账一直打不开,显示一直处于唤醒状态...
  20. java字符流字节流场景_【120期】Java IO:字节流、字符流、缓冲流

热门文章

  1. zookeeper-大数据Week6-DAY1-1-Zookeeper
  2. DAY1-Workstation and CentOS7.x 快照
  3. 美国科技投资交易约4.1%来自中国 投资仍然很困难
  4. 解决PyScripter中文乱码问题
  5. rocketmq整合mysql事务_分布式事务(4)---RocketMQ实现分布式事务项目
  6. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战
  7. Verilog 语法点使用————(持续更新)
  8. 使用 google_breakpad 分析 Electron 崩溃日志文件
  9. ORACLE常用的一些特殊SQL,收藏收藏,下次需要的时候就不用再翻箱倒柜了
  10. hiprint使用初体验,模板设计经验分享