首页 > 编程语言 >Java——集合

Java——集合

时间:2023-11-08 21:45:18浏览次数:50  
标签:元素 Java Object 泛型 哈希 集合 public

 一、集合类概述

  为什么会出现集合类?

    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作

  数组和集合类同是容器,有何不同?

    数组虽然可以存储对象,但长度是固定的;集合的长度是可变的。数组中可以存储基本数据类型;集合只能存储对象。

  集合类的特点

    集合只用于存储对象,集合的长度是可变的,集合可以存储不同类型的对象

  

  java提供了不同的集合给我们应对不同的场景,这些不同的集合底层的数据结构不同,导致了不同的集合,它们的存储和取出的顺序不太一样。

  虽然集合的底层数据结构不同,但归根结底都是存数据的,既然是存储数据的,那么这些集合应该有着部分相同的特点

  java将这些集合不断向上提取相同的部分,得出相关父类,形成继承体系

集合继承体系

栈和队列

 

数组和链表

哈希表

 

二、Collection

  Collection层次结构中的根接口

  例:Collection c1 = new ArrayList();     // 接口多态

 

  接口成员方法  

    boolean add(Object e)   默认在集合的末尾处添加元素
    boolean remove(Object o)   移除某一个元素
    void clear()   清空集合
    boolean contains(Object o)   
    boolean isEmpty()   判断是否为空
    int size()   获取集合元素的个数

    boolean addAll(Collection c)   将c2的元素全部添加到c1中

    boolean removeAll(Collection c)  c1只保留与c2不同的元素在其中

    boolean containsAll(Collection c)  判断c1是否包含c2的全部元素
    boolean retainAll(Collection c)  c1与c2做交集,将结果覆盖存储在c1中,c2不变

    Object[] toArray()  把集合转化成数组,可以实现集合的遍历

 

    Iterator iterator()  迭代器,集合专用的遍历方式 

 

增强for循环

三、List接口

概述

  有序的colection。此接口的用户可以对列表中的每个元素的插入位置进行精确的控制。用户可以根据元素的整数索引访问元素,并搜索列表中的元素。

  与set不同,列表通常允许重复的元素

成员方法

  void add(int index,Object element)  根据索引位置添加元素
  Object remove(int index)  根据索引位置删除元素

  Object get(int index)  获取索引位置上对应的元素
  Object set(int index,Object element)  修改索引位置上的元素

  

  Object o2 = l1.set(1, "flink"); 
  System.out.println(o2);  // 返回索引位置上历史的元素值

 

List集合特有的迭代器:ListIterator listIterator()

四、ArrayList接口

概述

  底层数据结构是数组,查询快,增删慢

  线程不安全,效率高

去除集合中字符串的重复值(字符串的内容相同)

注意事项

  在对自定义对象去重时,需要元素类型重写equals方法,自动生成即可

五、Vector类

概述

  底层数据结构是数组,查询快,增删慢

  线程安全,效率低

特有成员方法

  public void addElement(Object obj)  可以使用add()方法代替
  public Object elementAt(int index)  可以使用get()方法代替
  public Enumeration elements()  可以使用迭代器代替

所以即使这个线程是安全的,也不建议用

六、LinkedList类

概述

  底层数据结构是链表,查询慢,增删快

  线程不安全,效率高

特有成员方法 

  public void addFirst(E e)及addLast(E e)
  public E getFirst()及getLast()
  public E removeFirst()及public E removeLast()

请用LinkedList模拟栈数据结构的集合,并测试

 

六、泛型

没有泛型之前的的缺陷:

  警告黄色下划线太多,程序有隐患

  没有固定的元素类型约束,导致将来在获取元素的时候,没法统一的进行处理

 

  在使用集合的时候,原则上一个集合只能存储一种数据类型

  java借助数组的思想,为集合提供了泛型的功能,有了泛型之后,一个集合只能添加规定类型的元素了

泛型的好处:

  去除了大量的黄色警告线,让程序美观且严谨

  获取元素的时候,不需要再向下转型了

泛型应用

  泛型类  

    把泛型定义在类上

    public class 类名<泛型类型1,...>

    泛型类型必须是引用类型

 

  泛型方法

    把泛型定义在方法上

    public<泛型类型>返回类型 方法名(泛型类型)

 

  泛型接口

    把泛型定义在接口上

    public interface 接口名<泛型类型1...>

泛型高级(通配符)

  目的是为了辅助将来看帮助文档使用

  泛型通配符<?>
    任意类型,如果没有明确,那么就是Object以及任意的Java类了
  ? extends E
    向下限定,E及其子类
  ? super E
    向上限定,E及其父类

七、增强for

概述

  简化数组和Collection集合的遍历

格式

  for(元素数据类型 变量:数组或者Collection集合){    

        使用变量即可,该变量就是元素

  }

好处:简化遍历

注意事项:增强for的目标要判断是否为null

八、静态导入

概述

  格式:import  static 包名...类名.方法名

  可以直接导入到方法的级别

注意事项

  方法必须是静态的

  如果有多个同名的静态方法,容易不知道使用谁,这个时候要使用的话,必须加前缀。意义不大,所以一般不用,但是要能看懂。

  如果本类中有与静态导入的方法重名的时候,默认就近原则调用本类中的静态方法 

九、可变参数

概述

  定义方法的时候不知道该定义多少个的时候使用

格式

  修饰符  返回值类型  方法名(数据类型... 变量名){}

  注意

    这里的变量其实是一个数组

    如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个

Arrays工具类中的一个方法

  public static<T> List<T> asList(T...a)  

集合的嵌套遍历

 

获取10个1-20之间的随机数,要求不能重复

 

 

键盘录入多个数据,以0结束,要求在控制台输出这多个数据中的最大值

十、set接口

概述

  一个不包含重复元素的collection

十一、HashSet类

概述

  不保证set的迭代顺序

  特别是不保证该顺序恒久不变

如何保证元素唯一性

  底层数据结构是哈希表(元素是链表的数组)

  哈希表依赖于哈希值存储

  添加功能底层依赖的两个方法:

    int hashCode()

    boolean  equals(Object obj)

 

HashSet中的add方法实际上是调用HashMap中的put方法

源码中有这么一句话判断元素是否与哈希表中的元素重复:
p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))

HashSet中底层是哈希表,判断一个元素是否重复,会先判断哈希值是否相同,如果哈希值相同在判断内容值,如果哈希值和内容值都一样了,才会认为重复

而每一个自定义对象的都是new出来的,哈希值不一样。即便哈希值一样,底层判断内容的方法是equals()方法,而自定义类中没有写,所以调用的是Object类中的,而Object类中的equals()方法比较的是地址值

所以要想去重,应该重写hashCode()方法和equals()方法,自动生成即可

十二、LinkedHashSet

 概述

  元素有序唯一:由链表保证有序  有哈希表保证元素唯一

  线程不安全,效率高

十三、TreeSet

概述

  使用元素的自然顺序对元素进行排序

  或者根据创建set时提供的Comparator进行排序

  具体取决于使用的构造方法

TreeSet如何保证元素的排序和唯一性的

  底层数据结构是红黑树(红黑树是一种自平衡的二叉树) 

 

TreeSet的add方法实际上底层调用的时TreeMap的put方法

两种排序方法:

  自然排序:当TreeSet时无参构造方法创建的时候,默认走的是自然排序

  比较器排序:comparator 

使用TreeSet存储自定义对象并遍历:

  当是无参构造方法的时候走的是自然排序,自然排序源码中有一步转型操作,转成Comparable类型

  需要自定义对象实现Comparable接口,并实现CompareTo方法、

  如果想要走比较器排序,需要在创建TreeSet对象的时候,传入一个Comparator对象

十四、Map接口

概述

  将键映射到值的对象

  一个映射不能包含重复的键

  每个键最多只能映射到一个值  

Map接口和Collection接口的不同

  Map是双列的,Collection是单列的

  Map的键唯一,Collection的子体系Set是唯一的

  Map集合的数据结构值针对键有效,跟值无关

  Collection集合的数据结构是针对元素有效

Map本身是一个接口,我们需要借助一个实现子类去创建对象,才能调用方法

成员方法  

  V put(K key,V value)  向集合中添加一组键值对  返回值对应的历史值

  V remove(Object key)  根据键删除一个键值对,返回别删除的value值
  void clear()  清空集合中的所有键值对
  boolean containsKey(Object key)  判断是否包含某个键
  boolean containsValue(Object value)  判断是否包含某个值
  boolean isEmpty()  判断是否为空
  int size()  获取键值对的个数

 

Map集合遍历

  方式一:根据键找值

    获取所有键的集合

    遍历键的集合

    根据键找值

 

  方式二:根据键值对对象找键和值

    获取所有键值对对象的集合

    遍历键值对对象的集合,获取到每一个键值对对象

    根据键值对对象找键和值

 

十五、HashMap类

概述

  键是哈希表结构,可以保证键的唯一性

 

HashMap中的去重是针对key来说的,要求key的类型要重写equals()方法和hashCode()方法      

十六、LinkedHashMao类

Map接口的哈希表和链接列表实现,具有可预知的迭代顺序

底层是哈希表和双链表,哈希表保证了元素的唯一性,链表保证了元素的有序性,都是针对key来说的

十七、TreeMap类

底层数据结构是红黑树,自平衡二叉树,这里的唯一性和排序是针对key来说的

"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)

 

HashMap嵌套ArrayList

 

 

面试题:HashMap和Hashtable的区别

  1、HashMap是线程不安全的,而Hashtable是线程安全的
  2、HashMap的key和value允许为null值,而Hashtable不允许

十八、Collections

针对集合操作的工具类

静态成员方法  

  public static <T> void sort(List<T> list)  排序
  public static <T> int binarySearch(List<?> list,T key)  二分查找(前提集合是有序的)
  public static <T> T max(Collection<?> coll)
  public static void reverse(List<?> list)  反转
  public static void shuffle(List<?> list)  随机打乱

 

我们可以将线程不安全的集合编程线程安全的

就用Collections工具类的方法去变

方法:synchronized

标签:元素,Java,Object,泛型,哈希,集合,public
From: https://www.cnblogs.com/black-rosebush/p/17817829.html

相关文章

  • java 创建字符串对象
    packagecom.elaina.test1;publicclassStringTest{publicstaticvoidmain(String[]args){//直接赋值Strings1="abc";System.out.println(s1);//使用new//空参构造,创建一个空白的字符串对象Strings2......
  • java jna 动态库从资源路径载入问题?
    在其他项目中依赖你的功能jar包时,可能出现无法找到动态库的问题。这是因为在这种情况下,动态库不再位于资源目录中,而是被打包到了依赖的项目中。为了解决这个问题,你可以尝试以下方法:修改Native.loadLibrary方法的调用方式:将动态库的绝对路径传递给Native.loadLibrary方法,而不......
  • 有趣的Java之记录用户操作日志
    Java记录操作日志java自带的日志框架是java.util.logging(JUL),从JDK1.4(2002)开始捆绑在JDK中。可以使用JUL来记录操作日志。以下是使用JUL记录事务的示例://java.util.loggingjava.util.logging.Loggerlogger=java.util.logging.Logger.getLogger(this.getClass().getName());......
  • Java学习—Java方法
    那么什么是方法呢?Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的命名规则1.方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerso......
  • Java安全机制之一——SecurityManager和AccessController
    前言:在看socket相关代码的时候,AbstractPlainSocketImpl中的一段代码吸引了我,其实之前见过很多次类似的代码,但一直不想去看,只知道肯定和权限什么的相关,这次既然又碰到了就研究一下,毕竟也不能对java基本代码一无所知。static{java.security.AccessController.doPrivileged(......
  • Java_消息队列_RocktMQ
    RocketMQ安装RocketMQ的安装包分为两种,二进制包和源码包sudoapt-getinstalldefault-jdksudoapt-getinstallmaven解耦,异步,削峰填谷异步消息可以作为解耦消息的生产和处理的一种解决方案部署:包括NameServer、Broker、Proxy组件NameServer需......
  • java基础学习:二进制,八进制,十六进制
      ......
  • 如何将我的Java程序转换为.exe文件?
    内容来自DOChttps://q.houxu6.top/?s=如何将我的Java程序转换为.exe文件?如果我有一个Java源文件(*.java)或一个类文件(*.class),我如何将其转换为一个.exe文件?我还需要一个程序的安装程序。javapackagerJavaPackager工具用于编译、打包和准备Java和JavaFX应用程序进行分发。......
  • java 获取resources下文件的路径 使用 ClassLoader类 获取路径,使用流的方式读取
    java获取resources下文件的路径使用ClassLoader类,使用流的方式读取Java获取resources下文件的路径在Java开发中,我们经常需要读取resources目录下的文件,例如配置文件、模板文件等。本文将介绍如何获取resources下文件的路径,并提供相应的代码示例。1.resources目录在Java项......
  • Java登陆第一天——Mysql安装
    MySQL是一种开源、免费的关系型数据库官网https://www.mysql.com/由于是外网国内下载很慢可以使用国内镜像阿里云镜像站:https://mirrors.aliyun.com/mysql/搜狐开源镜像站:http://mirrors.sohu.com/mysql/建议下载压缩包。下载解压文件夹文件夹放在自己想放的目录下配......