容器类的基本用法
容器可以管理对象的生命周期、对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称、如何产生(Prototype 方式或Singleton 方式)、哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系。(百度百科) 图片来源:简书网博主本熊本
ArrayList
定义
导入包:
import java.util.ArrayList;
两种都可以实现的定义方法
private ArrayList<?> arrayList = new ArrayList<?>(); //<?>是放置元素类型(得是包裹基本类型),一些常用包裹类型:Boolean,Integer,Character,Double //一般一个容器放置同种类型,这种定义可以只允许放置<?> ?所使用的的类型
//这是一种泛型表示法
ArrayList arrayList = new ArrayList();//object类型元素
基本方法
arrayList.add(object e)
//添加元素
arrayList.add(1);//整数 arrayList.add("hello");//字符串
arrayList.add(int index, object element)
arrayList.add(0, "hello");//在index 位置放置一个元素,原位置及其后面所有元素后移
arrayList.addAll(Collection c)
arrayList.add(arrayList2);//把另一个容器类对象arrayList2放到arratList中
arrayList.addAll(int index, Collection c)
arrayList.addAll(1,arrayList2);//在第二位插入arrayList2
其中也可以自定义类类型的容器添加
arrayList.retainAll(Collection c) //求集合arrayList与集合c的交集(去除arrayList中不属于c的数)
resultHashSet.clear(); //把A中所有元素添加到resultHashSet里面 resultHashSet.addAll(an); //求mn中与resultHashSet相交的元素 resultHashSet.retainAll(mn);
arrayList.get(int index)
arrayList.get(0);//返回容器第一个元素 arrayList.get(1);//返回容器第二个元素
arrayList.remove(int index)、arrayList.remove(object o)
arrayList.remove(1);//删除第二位元素 arrayList.remove(“hello”)//也可以直接根据数据进行删除,不用于整数的数据的删除 arrayList.removeIf(Predicate filter)// 通过removeIf和lambda表达式进行
arrayList.clear();
arrayList.clear();//清空集合所有的元素(设为null),并将size设为零
arrayList.contains(object o)
arrayList.contains(1)//判断是否包含某值,返回Boolean型
arrayList.toArrary()、arrayList.toArrayList(object [])
//两种方法转化成数组,一般用定义用第一种方法定义,所以这的object 可以是其他常用的与之匹配数据类型 Object[] aObject = arrayList.toArray();//方法一 arrayList.toArray(aObject);//方法二
arrayList. size()
arrayList.size();//返回容器中的元素个数
LinkedList
ArrayList、Vector和LinkedList类均在java.util包下,LinkedList在使用过程中与ArrayList基本上是一致的。
ArrayList没有的方法:
linkedList.addFirst(object o)
linkedList.addFirst(“hello”)//在第一个位置插入元素
linkedList.addLast()
linkedList.addLast(“end”);//在尾部位置添加元素数据
Vector
ArrayList、Vector和LinkedList类均在java.util包下,vector在使用过程中与ArrayList基本上是一致的。
ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会在内存中开辟一块连续的空间来存储,因为数据存储是连续的,所以它们支持用下标来访问元素,索引数据的速度比较快。
区别:Arraylist多线程中使用不安全,适合在单线程访问时使用,效率较高,而Vector线程安全,适合在多线程访问时使用,效率较低
(1)
ArrayList和Vector都有一个初始化的容量大小,当里面存储的元素超过初始的大小时就需要动态地扩充它们的存储空间,Vector默认扩充为原来的两倍(每次扩充空间的大小可以设置),ArrayList默认扩充为原来的1.5倍(没有提供方法来设置空间扩充的方法)。
(2)
ArrayList和Vector最大的区别就是synchronization(同步性)的使用,没有一个ArrayList的方法是同步的,而Vector的绝大多数方法(如add,insert,remove,set,equals,hashcode)都是直接或间接同步的,所以Vector是线程安全的,ArrayList不是线程安全的。正是由于Vector提供了线程安全的机制,其性能上也要稍逊于ArrayList
LinkedList是采用双向列表来实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问则效率比较低,但是插入元素时不需要对数据进行移动,因此插入效率较高。同时,LinkedList是非线程安全的容器
对容器的选择:
当对数据的主要操作是索引或只在集合的末端增加、删除元素时,使用ArrayList或Vector效率比较高,
当对数据的操作主要为指定位置或删除操作时,使用LikedList效率比较高;当在多线程中使用容器时,选用Vector较为安全 (此段来源:博客园博主梧桐树master)
HashSet
//Hashset是集合的一种容器 ,1.没有排序的概念 2.集合中没有重复元素(相比之下ArrayList是有序的,元素可重复的)
导入包
import java.util.HashSet;
定义
HashSet<?> hashSet = new HashSet<?>();//泛型定义
HashSet hashSet = new HashSet();//object定义
其他方法和ArrayList基本一致,因为是无序的,所以无法通过索引获取元素数据
TreeSet
比较重要的区别
1、TreeSet 是二叉树实现的,Treeset中的数据是自动排好序(自然排序(默认) 和定制排序)的,不允许放入null值。
2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。
3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的 String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。
4.TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0 ;HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相 等
本段为CSDN博主「JeemyJohn」的原创(有半度墨水改动)
原文链接:https://blog.csdn.net/u013709270/article/details/53670956
HashMap
定义
HashMap<key,value> map = new HashMap<key,value>();//以泛型的形式添加,key唯一,只有放在最后的那个算数,即如果两个key一样,value以最后定义的那个为准
HashMap map = new HashMap();//普通方式定义
基本方法
map.put(object key,object value ) 把键值对放进容器
map.put("张三", 56); map.put("李四", 18);//字符串为键,整数为值 map.put(1, 2); //整数为键,整数为值
map.get(objec key) 通过键得到值
map.get(1);//输出为键为1时保存的值 map.get(“张三”);//输出键为张三 时保存的值
map.keyset() 输出所有的键位
map.keySet()//输出所有的键,无序,不重复,以集合的方式输出,如System.out.print(map.keySet()); 结果为[张三,李四,1]
map.values() 输出所有的值
map.values();//输出所有value的值,同样以一个集合输出
map.keySet().size()、 map.values().size() 得到键位对的对数
map.keySet().size();//输出键的个数 map.values().size();//输出值的个数
map.containsKey() 判断键是否存在
map.containsKey(2);//判断键2是否存在,返回Boolean值
map.containsValue()判断值是否存在
map.containsValue(2);//判断值是否存在
TreeMap
主要区别(TreeMap&HashMap)
(1)HashMap:适用于在Map中插入、删除和定位元素。
(2)Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
(3)HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap.
(4)HashMap 非线程安全 TreeMap 非线程安全(此设计线程安全)
(5)HashMap的结果是没有排序的,而TreeMap输出的结果是排好序的。
//未完结2020-03-19