java19-集合

这篇具有很好参考价值的文章主要介绍了java19-集合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

集合

集合概述

  • 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象操作,就要对对象进行存储
  • 使用Array存储对象方面有一些弊端,而集合就像一个容器,可以动态的把多个对象的引用放入容器中

集合框架

Collection接口(单列集合,用来存储一个一个的对象)

  • 创造集合
     Collection coll=new ArrayList();
        // add(Object e);
        coll.add("123");
        coll.add(123);
        coll.add(new  Date());
        coll.add(new Person1("jack",20));

        // size
        System.out.println(coll.size());
        // 4
  • 常用方法

import org.junit.Test;

import java.util.*;

public class CollectionTest {
    @Test
    public void test1(){
        Collection coll=new ArrayList();
        // add(Object e);
        coll.add("123");
        coll.add(123);
        coll.add(new  Date());
        coll.add(new Person1("jack",20));

        // size
        System.out.println(coll.size());
        // 4

        // contains(Object obj)
        // 我们在判断时会调用obj对象所在类的equals()
        boolean contains = coll.contains(123);
        System.out.println(contains);
        // true
        System.out.println(coll.contains(new Person1("jack",20)));
        // true

        // containsAll(Collection coll) 形参coll中所有元素都在当前集合中
        Collection coll1= Arrays.asList(123,"123");
        System.out.println(coll.containsAll(coll1));
        // true

        // remove(Object obj) 移除某个元素 (也会调equals())
        System.out.println(coll);
        // [123, 123, Thu Dec 08 22:34:36 CST 2022, Person1{name='jack', age=20}]
        coll.remove(123);
        System.out.println(coll);
        // [123, Thu Dec 08 22:34:36 CST 2022, Person1{name='jack', age=20}]

        // removeAll(Collection coll) 移除当前集合中形参coll中所有元素

    }
    @Test
    public void test2(){
        Collection coll1=new ArrayList();
        coll1.add(123);
        coll1.add(456);
        coll1.add(789);
        Collection coll2=Arrays.asList(123,789);
        // retainAll(Collection coll); 获取当前集合与coll的交集,并返回给当前集合
        coll1.retainAll(coll2);
        System.out.println(coll1);
        //[123, 789]

        // equals(Object obj) 当前集合和形参集合元素相同
        Collection coll3=new ArrayList();
        coll3.add(123);
        coll3.add(789);
        System.out.println(coll3.equals(coll2));
        // true

    }
    @Test
    public void test3(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add("123");
        coll.add(true);
        // hashCode() 返回当前对象的哈希值
        System.out.println(coll.hashCode());
        // 1658615

        // 集合=>数组 toArray()
        Object[] objects = coll.toArray();
        for (int i = 0; i < objects.length; i++) {
            System.out.println(objects[i]);
            //123
            //123
            //true
        }

        // 数组=>集合 调Arrays类的静态方法asList()
        List<String> strings = Arrays.asList(new String[]{"123", "456"});
        System.out.println(strings);
        // [123, 456]

    }
    @Test
    public void test4(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add("123");
        coll.add(true);
        // iterator()返回Iterator接口的实例,用于遍历集合元素,每次都是一个新的迭代器对象
        Iterator iterator = coll.iterator();
        System.out.println(iterator.next());
        // 123

        // hasNext() 是否还有元素
        while (iterator.hasNext()){
            // next() 指针下移,并返回下移后当前元素
            System.out.println(iterator.next());
        }
    }
}
class Person1{
    private String name;
    private int age;
    public Person1(String name,int age) {
        this.name=name;
        this.age=age;
    }

    @Override
    public String toString() {
        return "Person1{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person1 person1 = (Person1) o;
        return age == person1.age && Objects.equals(name, person1.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
  • forEach循环循环遍历集合

import org.junit.Test;

import java.util.ArrayList;
import java.util.Collection;

public class forEachTest {
    @Test
    public void test1(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add("123");
        coll.add(true);
        // for (集合元素类型 局部变量 : 集合对象)
        for (Object obj:coll){
            System.out.println(obj);
        }
    }
    @Test
    public void test2(){
        int[] arr=new int[]{1,2,3};
        for (int i:arr){
            System.out.println(i);
        }
    }
}

List接口(存储有序的,可重复数据)
  • List接口实现类常用有ArrayList,LinkedList,Vector
方法 特点
ArrayList 作为list主要实现类,线程不安全,效率高。底层使用Object[]存储
LinkedList 对于频繁的插入,删除操作,比ArrayList效率高,底层使用双向链表存储
Vector 作为list古老实现类,线程安全,效率低。底层使用Object[]存储
  • List常用方法
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class listTest {
    @Test
    public void test1() {
        ArrayList list = new ArrayList();
        list.add(123);
        list.add("123");
        list.add(123);
        System.out.println(list);
        //[123, 123, 123]

        // void add(int index,Object obj):在index位置插入obj
        list.add(1, 456);
        System.out.println(list);
        // [123, 456, 123, 123]

        // boolean addAll(int index,Collection coll):从index位置将coll所有元素添加
        List list1 = Arrays.asList(1, 2, 3);
        list.addAll(list1);
        System.out.println(list);
        // [123, 456, 123, 123, 1, 2, 3]

        // Object get(int index):获取指定位置的元素
        Object obj = list.get(1);
        System.out.println(obj);
        // 456

        // int indexOf(Object obj):获取obj首次出现位置返回
        int index = list.indexOf(123);
        System.out.println(index);
        // 0

        // int lastIndexOf(Object obj):获取obj最后出现位置返回
        int index1 = list.lastIndexOf(123);
        System.out.println(index1);
        // 3

        //Object remove(int index):移除index位置元素,并返回移除元素
        Object remove = list.remove(1);
        System.out.println(remove);
        // 123

        // Object set(int index,Object obj):设置index位置的元素为obj
        list.set(1, "set");
        System.out.println(list);
        // [123, set, 123, 1, 2, 3]

        // list subList(int fromIndex,int toIndex):返回从fromIndex到toIndex元素子集合
        List list2 = list.subList(1, 3);
        System.out.println(list2);
        // [set, 123]
    }
}
Set接口(存储无序的,不可重复数据)
方法 特点
HashSet 作为set主要实现类,线程不安全,可以存储null
LinkedHashSet 作为HashSet子类,遍历其内部数据时,可以按照添加顺序遍历
TreeSet 可以按照添加对象指定属性排序
  1. 无序性和不可重复
  • 无序性:不等于随机性,存储的数据在底层数组中并非按照数组索引顺序添加,而是根据数据哈希值
  • 不可重复:保证添加的元素按照equals方法判断时不能返回true,即相同元素只能有一个
  1. set中没有新增方法,都是collection中方法
  2. TreeSet的排序
  • 自然排序:比较两个对象是否相等的标准为compareTo()返回为0,不再是equals()

import org.junit.Test;

import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetTest {
    @Test
    public void test1(){
        TreeSet treeSet = new TreeSet();
        treeSet.add(new User("jack",10));
        treeSet.add(new User("tom",23));
        Iterator iterator = treeSet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
            //User{name='jack', age=10}
            //User{name='tom', age=23}
        }
    }
}
class User implements Comparable{
    public String name;
    public Number age;
    public User(String name,Number age){
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }

    public Number getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Number age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    // 按照姓名从小到大排列
    @Override
    public int compareTo(Object o) {
        if(o instanceof User){
            User user=(User) o;
            return this.name.compareTo(user.name);
        }else {
            throw new RuntimeException("输入类型不匹配");
        }
    }
}
  • 定制排序:比较两个对象是否相等的标准为compare()返回为0,不再是equals()

Map接口(双列集合,用来存储一对一对的数据(key-value))

  • HashMap:作为Map主要实现类,线程不安全,效率高,存储null的key和value
    • linkedHashMap:保证在遍历Map元素时,可以按照添加顺序遍历。原理在原有的HashMap底层结构基础上,添加了一对指针指向前一个和后一个元素。对于频繁的遍历操作,此类效率高于HashMap
import org.junit.Test;

import java.util.HashMap;
import java.util.LinkedHashMap;

public class MapTest { 
    @Test
    public void test2(){
        HashMap map = new HashMap();
        map.put(123,"aa");
        map.put(23,"bb");
        map.put(3,"cc");
        System.out.println(map);
        // {3=cc, 23=bb, 123=aa}
        HashMap map2 = new LinkedHashMap();
        map2.put(123,"aa");
        map2.put(23,"bb");
        map2.put(3,"cc");
        System.out.println(map2);
        // {123=aa, 23=bb, 3=cc}
    }
}

  • TreeMap:保证按照添加的Key-Value对进行排序,实现排序遍历,要求key必须是同一个类的实例
  • Hashtable:作为古老的实现类,线程安全,效率低,不能存储null的key和value
    • Properties:常用来处理配置文件。key和value都是String类型
Map结构
  • Map中的key:无序的,不可重复的,使用Set存储所有的key==>key所在的类重写equals()和hashCode()
  • Map中的value:无序的,可重复的,使用Collection存储的所有的value==>value所在的类重写equals()
  • 一个键值对:key-value构成了一个Entry对象
  • Map中的Entry:无序的,不可重复的,使用set存储所有的entry
HashMap底层结构

对于jdk7

  • HashMap map = new HashMap();底层创建一个长度是16的一维数组Entry[] table
  • map.put(key.value)
    • 调用key所在类的hashCode()计算key的哈希值,此哈希值经过算法后,得到Entry数组中存放位置
      • 如果位置上数据为空,key-value添加成功
      • 如果此位置数据不为空,意味着此位置上存在一个或者多个数据(以链表形式存在),比较key和已有数据的hash值
        • 如果key的Hash值与已经存在的数据的哈希值都不相同,此时数据添加成功
        • 如果key的Hash值与某个数据的Hash值相同,继续比较key的equlas(key2),如果返回false,此时添加成功;如果返回true, 替换调value
          对于jdk8
  • new HashMap()底层没有创建一个长度为16的数组
  • jdk8底层数组是node[]
  • 首次调用put()时,创建底层长度为16数组
  • jdk底层结构:数组+链表+红黑树。当数组某一个索引位置上的元素以链表形式存在的数据个数>8且当前数组的长度>64,此时此索引位置上的所有数据改为使用红黑树存储

Map常用方法

方法 含义
Object put(Object key,Object value) 将指定的key-value添加(或修改)到map对象中
void putAll(Map m) 将Map中所有的key-value对存放到当前map对象中
Object remove(Object key) 移除指定的key-value对,并返回Value
void clear() 清空当前map中所有数据
Object get(Object key) 获取指定key对应的value
Boolean containsKey(Object key) 是否包含对应的key
Boolean containsValue(Object value) 是否包含对应的value
int size() 返回map中的key-value的对数
Boolean isEmpty() 判断当前对象map是否为空
Boolean equals(Object obj) 判断当前map和参数对象obj是否相等
Set keySet() 返回所有key构成的Set集合
Collection values() 返回所有value构成的集合
Set entrySet() 返回所有key-value对构成的Set集合
import org.junit.Test;

import java.util.*;

public class MapTest {
    @Test
    public void test3(){
        HashMap hashMap = new HashMap();
        hashMap.put("AA",12);
        hashMap.put(12,"AA");
        hashMap.put("AA",123);
        System.out.println(hashMap);
        // {AA=123, 12=AA}
        HashMap hashMap1 = new HashMap();
        hashMap1.put("BB",12);
        hashMap.putAll(hashMap1);
        System.out.println(hashMap);
        // {AA=123, BB=12, 12=AA}
        Object value = hashMap.remove("AA");
        System.out.println(value);
        // 123
        System.out.println(hashMap);
        // {BB=12, 12=AA}
        hashMap.clear();
        System.out.println(hashMap);
        // {}
        HashMap hashMap2 = new HashMap();
        hashMap2.put("AA",123);
        hashMap2.put("BB",123);
        Object key = hashMap2.get("AA");
        System.out.println(key);
        Boolean isExist = hashMap2.containsKey("AA");
        System.out.println(isExist);
        isExist = hashMap2.containsValue(123);
        System.out.println(isExist);
        int size = hashMap2.size();
        System.out.println(size);
        boolean empty = hashMap2.isEmpty();
        System.out.println(empty);
        Set set = hashMap2.keySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
            // AA BB
        }
        Collection values = hashMap2.values();
        for (Object obj: values){
            System.out.println(obj);
            // 123 123
        }
        Set set1 = hashMap2.entrySet();
        Iterator iterator1 = set1.iterator();
        while (iterator1.hasNext()){
            Object obj = iterator1.next();
            // entrySet集合中的元素都是entry
            Map.Entry entry = (Map.Entry) obj;
            System.out.println(entry.getKey()+"="+entry.getValue());
            // AA=123
            // BB=123
        }
    }
}

Properties

  • Properties类是Hashtable的子类,该对象用于处理属性文件
  • 由于属性文件key-value是字符串类型,所以Properties的key-value是字符串类型
  • 用getProperty(String key)和setProperty(String key,String value)
import java.io.FileInputStream;
import java.util.Properties;

public class properties {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        FileInputStream fileInputStream = new FileInputStream("jdbc.properties");
        properties.load(fileInputStream);
        String name = properties.getProperty("name");
        String password = properties.getProperty("password");
        System.out.println("name="+name+"password"+password);
        // name=jackpassword123

    }
}

collections工具类

Collections是一个操作Set,List和Map等集合的工具类

方法 含义
reverse(list) 反转list中元素顺序
shuffle(list) 对list集合顺序随机排序
sort(list) 根据元素的自然顺序对list集合元素进行升序排列
sort(list,Comparator) 根据指定的Comparator产生的顺序对list集合进行排序
swap(list,int,int) 将指定list的i元素和j元素交换
Object Max(Collection) 根据自然排序,返回最大值
Object Max(Collection,Comparator) 根据Comparator指定的顺序,返回最大值
Object Min(Collection) 根据自然排序,返回最小值
Object Min(Collection,Comparator) 根据Comparator指定的顺序,返回最小值
int frequency(Collection Object) 返回指定集合中指定元素出现的次数
void copy(list dest,list src) 将src内容复制到dest中
bollean replaceAll(List list,Object oldVal,Object newVla) 使用新值替换list中的旧值
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class CollectionsTest {
    @Test
    public void test1(){
        ArrayList arrayList = new ArrayList();
        arrayList.add(123);
        arrayList.add(234);
        arrayList.add(345);
        System.out.println(arrayList);
        // [123, 234, 345]
        Collections.reverse(arrayList);
        System.out.println(arrayList);
        // [345, 234, 123]
//        Collections.shuffle(arrayList);
//        System.out.println(arrayList);
//        // [345, 123, 234]
        Collections.swap(arrayList,1,2);
        System.out.println(arrayList);
        // [345, 123, 234]
    }
    @Test
    public void test2(){
        ArrayList arrayList = new ArrayList();
        arrayList.add(123);
        arrayList.add(234);
        arrayList.add(345);
        List<Object> dest =  Arrays.asList(new Object[arrayList.size()]);
        // dest.size必须大于arrayList.size
        Collections.copy(dest,arrayList);
        System.out.println(dest);
        // [123, 234, 345]
    }
}

同步操作

Collections提供多个synchronizedXXX方法,该方法可以将指定集合包装成线程同步集合,从而可以解决多线程访问集合线程安全问题文章来源地址https://www.toymoban.com/news/detail-733234.html

Collection c = Collections.synchronizedCollection(new ArrayList());
List list = Collections.synchronizedList(new ArrayList());
Set set = Collections.synchronizedSet(new HashSet());
Map map = Collections.synchronizedMap(new HashMap());

到了这里,关于java19-集合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「Java」《Java集合框架详解:掌握常用集合类,提升开发效率》

    Java 集合框架是 Java 编程中不可或缺的一部分。它提供了一组强大的数据结构和算法,用于存储、操作和处理对象数据。本文将深入探讨 Java 集合框架的核心概念,介绍常用的集合接口和实现类,并提供实际应用示例,帮助读者更好地理解和应用集合框架,提升开发效率。

    2024年02月11日
    浏览(46)
  • Java语言第三篇集合

    集合和数组的对比 数组的长度是不可变的,集合的长度是可变的。 数组可以存基本数据类型和引用数据类型。集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类。 Collection 集合 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素

    2024年01月23日
    浏览(71)
  • Java基础--->集合详解

    ​ Collection一般存储的是列表数据 List ​ List存储的数据是有序可重复的 ArrayList ​ ArrayList数组存储,可以动态扩容,适合大量查找,线程不安全 ArrayList扩容机制 : JDK8之前直接创建长度为10的数组elementData,EMPTY_ELEMENTDATA=10是默认值; JDK8之后只有当add时才初始容量值 ArrayLi

    2023年04月23日
    浏览(45)
  • Java基础-----集合类(四)

    1.Iterator 可以遍历List集合,也可以遍历Set集合; ListIterator只能遍历List集合 2.Iterator 只能单向遍历(向后遍历),ListIterator双向遍历(向前/向后遍历) 3.ListIterator继承Iterator接口,添加新的方法 add(E e):将指定的元素插入到集合中,插入位置为迭代器当前位置之前 hasNext():正向

    2024年02月03日
    浏览(35)
  • JAVA集合基础(一)

            集合(Collection)是Java编程语言中用于存储和操作一组对象的容器。它是Java集合框架的核心部分,提供了一组接口和类,用于处理不同类型的集合数据。         在编程中,我们经常需要处理一组相关的对象,例如存储用户列表、商品信息、日志记录等。集合

    2024年02月08日
    浏览(38)
  • java基础-集合+泛型+枚举

    说明: 集合框架是一个类库的集合,里面还有很多接口。 里面虚框都是接口 。 全部在java.util HashSet是基于HashMap实现的。 TreeSet是一个有序Set。 ArrayList能快速随机访问,可变大小。 LinkedList随机访问相对慢,但是可以当作stack或者queue来用。 下面是List接口常用的方法: 使用的

    2024年02月20日
    浏览(37)
  • java基础入门-19-【IO(字节流&字符流)】

    生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。 我们把这种数据的传输,可以看做

    2024年02月07日
    浏览(39)
  • 【Java基础】Java中List集合的常用方法

    在Java编程中,List集合是最常用的一种数据结构之一。它具有动态扩容、元素添加、删除和查询等基础操作,可以存储各种类型的对象,并且支持泛型。在本文中,我将介绍Java List集合的常用方法,并通过实例演示这些方法的使用。 一、List集合的创建与初始化 在使用List集合

    2024年02月16日
    浏览(37)
  • Java基础 - 9 - 集合进阶(二)

    可变参数就是一种特殊形参,定义在方法、构造器的形参列表里,格式是: 数据类型…参数名称; 可变参数的特点和好处 特点: 可以不传数据给它;可以传一个或者同时传多个数据给它;也可以传一个数组给它 好处: 常常用来灵活的接收数据         Collections是一个用

    2024年03月20日
    浏览(36)
  • Java基础集合框架学习(上)

    Java基础集合框架 的主要接口和类: List 接口 : 有序集合,可以包含重复元素。常见实现包括ArrayList、LinkedList 和 Vector。 Set 接口 : 不包含重复元素的集合。常见实现包括HashSet、LinkedHashSet 和 TreeSet。 Map 接口 : 键值对的集合,每个键映射到一个值。常见实现包括HashMap、Linked

    2024年02月13日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包