集合

java集合框架总结(六)

点点圈 提交于 2019-12-02 19:16:52
一、Map 简介 Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 Key,另外一组用于保存 Map 里的 Value Map 中的 key 和 value 都可以是任何引用类型的数据 Map 中的 Key 不允许重复,即同一个 Map 对象的任何两个 Key 通过 equals 方法比较中返回 false Key 和 Value 之间存在单向一对一关系,即通过指定的 Key 总能找到唯一的,确定的 Value。 相关方法: 结构图: 二、HashMap & Hashtable HashMap 和 Hashtable 是 Map 接口的两个典型实现类,区别: Hashtable 是一个古老的 Map 实现类,不建议使用 Hashtable 是一个线程安全的 Map 实现,但 HashMap 是线程不安全的。 Hashtable 不允许使用 null 作为 key 和 value,而 HashMap 可以与 HashSet 集合不能保证元素的顺序的顺序一样,Hashtable 、HashMap 也不能保证其中 key-value 对的顺序 Hashtable 、HashMap 判断两个 Key 相等的标准是:两个 Key 通过 equals 方法true,hashCode 值也相等。 Hashtable 、HashMap 判断两个

避免基本类型数组转换列表陷阱(Arrays.asList())

你。 提交于 2019-12-02 06:18:33
一、分析 我们在开发的过程中经常会使用Arrays和Collections这两个工具类在数组和列表之间转换。 Arrays.asList()方法:输入一个变长参数,返回一个固定长度的列表。看源码: public static<T> List<T> asList(T... a){ return new ArrayList<T>(a); } asList方法输入的是一个泛型变长参数,我们知道基本类型是不能泛型化的,也就是说8个基本类型不能作为泛型参数,要想作为泛型化参数就必须使用其对应的包装类型。 二、场景 在使用Arrays虽然非常方便,但有时候会出现一些奇怪的问题,看如下代码: public static void main(String[] args){ int[] data = {1,2,3,4,5}; List list = Arrays.asList(data); System.out.println("列表中的元素数量是:" + list.size()); } 也许你会说,这很简单,list变量的元素数量当然是5。但是运行结果却是1。 由上分析得知,int基本类型是不能被泛型化,传入asList方法的。在Java中数组是一个对象,它是可以泛型化的,也就是说上面例子把int类型的数组作为了T的类型,所以在转换后在List中就只有一个类型为int数组的元素了。我们打印出来看看

利用线性表的顺序结构求集合的并、交、差、补(C语言实现)

China☆狼群 提交于 2019-12-01 17:15:42
昨天用数据结构中的线性表的顺序结构实现了关于集合的并、交、差、补的集合运算,做个记录,希望也能帮助到其他人。 一、算法分析   (1)用数组A,B,C,E表示集合。假定A={1,3,4,5,6,7,9,10},   B={2,,3,4,7,8,10}, E={1,2,3,4,5,6,7,8,9,10},   输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。      (2)两个集合的并运算:把数组A中各个元素先保存在数组C中。将数组B中的元素逐一与数组A中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B的并。    C语言算法(线性表顺序结构实现): /**求集合的并集的函数**/ void Union_Sq(SqList La,SqList Lb,SqList &Lc){ int i; ElemType elem; Lc.length=0; for(i = 0; i < La.length; i++) Lc.elem[Lc.length++]=La.elem[i]; for(i = 1; i <= Lb.length; i++){ elem = Lb.elem[i-1]; if(!LocateElem_Sq(La,elem,Equal)) ListInsert_Sq(Lc,Lc.length

第十章 Scala 容器基础(十八):从集合中提取元素序列

不问归期 提交于 2019-11-30 15:27:46
Problem 你想要从集合中提取一串连续的元素,通过指定开始和结束位置或者通过一个方法。 Solution 你可以利用一些集合方法来从有序集合中提取一串连续的元素。比如drop,dropWhile,head,headOption,init,last,lastOption,slice,tail,take,takeWhile。 给定一个有序集合: scala> val x = (1 to 10).toArray x: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 利用drop(n)方法,你可以提取集合除了前n个元素外,剩余的元素。 scala> x.drop(3) res0: Array[Int] = Array(4, 5, 6, 7, 8, 9, 10) 利用dropWhile方法,会丢掉从集合开始一直到能满足你传给dropWhile方法的判断条件为true的所有元素。 scala> x.dropWhile(_ < 6) res2: Array[Int] = Array(6, 7, 8, 9, 10) dropRight(n)方法和drop很像,只不过它会丢掉集合右侧的n个元素。 scala> x.dropRight(3) res4: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7) take(n

CopyOnWriteArraylist解析

北城余情 提交于 2019-11-29 02:50:10
自从JDK1.5引入引入concurrentHashmap,CopyOnWriteArraylist等并发集合后,java集合体系得到了很大的完善,我们有多了不少特殊情境的选择。 我们都知道,ArrayList存数数据的结构为数组,获取数据是根据数组下标,因此获取数据速度很快,而插入(中间)数据,删除数据却需要copy数组,因此速度较慢,而相比之下, CopyOnWriteArraylist底层的存储依然是数组,但是基本操作却不大一样。 好处(使用场景):  Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。 CopyOnWriteArrayList通过修改时拷贝原数组,而获取数组时返回老数组(相当于快照),使得修改和查看(遍历)的线程操作的是不同数组,达到避免并发修改的问题 缺点(不宜使用): 1. 内存占用问题 。 因为CopyOnWrite的写时复制机制

java集合框架总结(一)

大憨熊 提交于 2019-11-29 02:48:44
本系列博客详细介绍了JAVA集合框架,你将知道: 一.学习目标 1)java集合框架的层次结构 2)使用Collection接口定义的公用方法对集合和线性表操作 3)使用Iterator接口遍历集合 4)使用JDK的增强for循环替代迭代Iterator进行集合遍历 5)熟悉Set接口,了解何时及如何使用HashSet,LinkedHashSet或TreeHashSet来存储元素 6)熟悉Map接口,了解何时及如何使用HashMap,LinkedHashMap或TreeTable来存储元素 7)使用Comparator接口来比较元素,以及实现自然排序,定制排序 8)熟悉List接口,了解何时以及如何使用ArrayList或者LinkedList来存储元素 9)区分Vector与ArrayList,并了解如何使用Vector和Stack 10)使用JDK1.5的一般类型来简化程序设计 11)理解Collection和Map的区别,知道何时及如何使用HashMap,LinkedHashMap,TreeHashMap来存储 12)使用Collections类中的静态方法,及如何解决多线程并发访问集合时 的线程安全问题 13)使用Arrays类中的静态方法 14)如何重写hashCode() 和 equals()实现响应功能 15)使用Properties 类处理属性文件 二:Java

JAVA 持有对象——容器初探

北城余情 提交于 2019-11-29 02:48:07
引言 如果一个程序只包含固定数量的且其生命周期都是已知对象,那么这是一个非常简单的程序——《think in java》 了解容器前,先提出一个问题,ArrayList和LinkedList谁的处理速度更快呢? 一 持有对象的方式 在Java中,我们可以使用数组来保存一组对象。但是,数组是固定大小的,在一般情况下,我们写程序时并不知道将需要多少个对象,因此数组固定大小对于编程有些受限。 java类库中提供了一套相当完整的容器类来解决这个问题,其中基本类型有List,Queue,Set,Map,这些对象类型被称为集合类。但是,Java类库中使用了Collection来指代集合类中的子集{List,Queue,Set},所以集合类也被称为容器。容器提供了完善的方法来保存对象。 二 类型安全的容器 java采用泛型保证我们不会向容器中插入不正确的类型,但是java的泛型只存在于程序源码中,在经过编译器编译就会将类型擦除。举一个例子: //经过编译前 List<String> list = new ArrayList<>(); list.add("ok"); System.out.println(list.get(0)); //经过编译后 List list = new ArrayList(); list.add("ok"); System.out.println((String)list

java面试:集合类型面试初探

别说谁变了你拦得住时间么 提交于 2019-11-26 11:27:35
Q:最常见的数据结构有哪些,在哪些场景下应用它们? A. 大部分人都会遗漏树和图这两种数据结构。树和图都是很有用的数据结构。如果你在回答中提及到它们的话,面试者可能会对你进行进一步进行的考核。 常见的数据结构 数组 是最常用的数据结构。数组的特点是长度固定,可以用下标索引,并且所有的元素的类型都是一致的。数组常用的场景有把:从数据库里读取雇员的信息存储为EmployeeDetail[],把一个字符串转换并存储到一个字节数组中便于操作和处理,等等。尽量把数组封装在一个类里,防止数据被错误的操作弄乱。另外,这一点也适合其他的数据结构。 列表 和数组很相似,只不过它的大小可以改变。列表一般都是通过一个固定大小的数组来实现的,并且会在需要的时候自动调整大小。列表里可以包含重复的元素。常用的场景有,添加一行新的项到订单列表里,把所有过期的商品移出商品列表,等等。一般会把列表初始化成一个合适的大小,以减少调整大小的次数。 集合 和列表很相似,不过它不能放重复的元素。当你需要存储不同的元素时,你可以使用集合。 堆栈 只允许对最后插入的元素进行操作(也就是后进先出,Last In First Out – LIFO)。如果你移除了栈顶的元素,那么你可以操作倒数第二个元素,依次类推。这种后进先出的方式是通过仅有的peek(),push()和pop()这几个方法的强制性限制达到的