高端企业网站价位,wordpress 固定连接中文转换插件,wordpress职场博客,免费开放代理概念与作用
集合概念
现实生活中#xff1a;很多事物凑在一起
数学中的集合#xff1a;具有共同属性的事物的总体
java中的集合类#xff1a;是一种工具类#xff0c;就像是容器#xff0c;储存任意数量的具有共同属性的对象 在编程时#xff0c;常常需要集中存放多个…概念与作用
集合概念
现实生活中很多事物凑在一起
数学中的集合具有共同属性的事物的总体
java中的集合类是一种工具类就像是容器储存任意数量的具有共同属性的对象 在编程时常常需要集中存放多个数据当然我们可以使用数组来保存多个对象。但数组长度不可变化一旦初始化数组时指定了数组长度则这个数组长度是不可变的如果需要保存个数变化的数据数组就有点无能为力了而且数组无法保存具有映射关系的数据如成绩表语文-79数学-80这种数据看上去像两个数组但这个两个数组元素之间有一定的关联关系。 为了保存数量不确定的数据以及保存具有映射关系的数据也被称为关联数组java提供集合类。集合类主要负责保存、盛装其他数据因此集合类也被称为容器类。所有集合类都位于java.util包下。 集合类和数组不一样数组元素既可以是基本类型的值也可以是对象实际上保存的是对象的引用变量而集合里只能保存对象实际上也是保存对象的引用变量但通常习惯上认为集合里保存的是对象。 集合的作用 集合与数组对比 集合框架的体系结构
Java的集合类主要由两个接口派生而出Collection和Map
Collection和Map是Java集合框架的根接口这两个接口又包含了一些子接口或实现类。 图7.1是Collection接口、子接口及其实现类的继承树。 图7.1中的粗线圈出的Set和List接口是Collection接口派生出的两个子接口它们分别代表了无序集合和有序集合阴影部分HashSet和ArrayList是两个主要的实现类。 图7.2是Map体系的继承数所有的Map实现类用于保存具有映射关系的数据也就是前面介绍的关系数组 图7.2中显示了Map接口的众多实现类这些实现类在功能、用法上存在一定的差异但它们都有一个功能特征Map保存的每项数据都是Key-value对也就是有key和value两个值组成。就像前面介绍的成绩单语文-79数学-80每项成绩都由2个值组成。Map里的key是不可重复的key用于标识集合里每项数据如果需要查阅Map中数据时总是根据Map的key来获取。 根据图7.1和图7.2中粗线标识的3个接口我们可以把java的所有集合分成三大类其中Set集合类似于一个罐子把一个对象添加到Set集合时Set集合无法记住这个元素的顺序所以Set里的元素不能重复否则系统无法准确识别这个元素List集合非常像一个数组它可以记住每次添加元素的顺序只是List的长度是可变的。Map集合也像一个罐子只是它里面的每项数据都由两个值组成。 如果访问List集合中的元素可以直接根据元素的索引来访问如果需要访问Map集合中的元素可以根据每项元素的key来访问其value如果希望访问Set集合中的元素则只能根据元素本身来访问这也是Set集合里元素不允许重复的原因。 对于List、Set和Map三种集合最常用的实现类在图7.1、7.2中以灰色区域覆盖分别是HashSet、ArrayList和HashMap三个实现类。
Collection接口和List接口简介 List接口是一个有序集合其元素以线性方法存储集合中允许存放重复的元素。
List接口及其实现类——ArrayList ArrayList 类是数组列表类实现了可变长度的数组允许对集合中的元素进行快速的访问但向ArrayList 集合中插入或删除速度较慢。。需要移动元素
ArrayList 集合允许所有的元素包括null。
每一个ArrayList 实例都有一个默认的容量即存储元素的个数这个容量可以随着元素的增加而自动变大。
链表类LinkedList类
LinkedList 是链表类采用链表结构保存元素。链表结构的优点是便于向集合中插入和删除元素。
因为在插入或删除元素时不需要移动任何元素。
List的增删改查的方法
实现功能 创建Course类 真正工程中应将所有的属性私有化通过get和set方法去访问属性 创建学生类
学生能选课就有很多课程信息把他的课程信息存放在set类型的属性courses里 因为Set是一个接口所以不能直接实例化通过HashSet这个实现类来进行实例化。 创建一个备选课程类ListTest类
创建List类型的属性courseToselect(用于存放备选课程的List)
添加ListTest构造方法并初始化courseToselect属性因为List是一个接口所以在构造方法中不能直接实例化而通过它的实现类ArrayList来实例化。 对象存入集合当中的时候都会变成Object类型取出时需要进行类型转换 如果添加到List中的长度大于他目前的长度则系统会出现异常即数组下表越界异常。 List是接口所以在构造方法中不能直接实例化而通过ArrayList实例化。 用ArrayList的addall方法时需要将添加的数据转换为列表类型用asList方法。Arrays.asList(a) 将a由数据类型转变为列表类型list。 用List的add(Object e)和add(int index,Object e)可以向List中添加单个元素用addall(Collextion c)和addall(int index,Collextion c)可以添加集合多个元素。若在index位置有元素则此元素及后面的元素向下移动。 用List的add(Object e)和add(int index,Object e)可以想List中添加单个元素用addall(Collextion c)和addall(int index,Collextion c)可以添加集合多个元素 通过get()方法可以把List中相应的索引位置上的元素给取出来。那么如果想要取得List中每一个元素的值需要用一个for循环像遍历数组一样遍历List。 创建一个testGet方法为依次遍历List中的元素首先我们需要取得List的长度通过调用List的Size()方法来实现。 1.用for循环配合get()方法遍历集合 迭代器获取集合迭代器lt--while(lt.hasNext())循环遍历集合--将lt.Next()强转成集合元素类型并用其接收。注意迭代器只遍历不存储必须依赖集合存在。 Iterator本身也是一个接口Iterator接口。有一个hasNext方法参数布尔类型
foreach循环遍历for(object obj:集合名) 修改List中的元素
List中有个set方法
set(int index, E element)方法修改列表中的元素 参数index - 要替换的元素的索引element - 要在指定位置存储的元素
返回以前在指定位置的元素 删除List中的元素 removeObject e removeint index removeAll() 泛型 创建一个TestGeneric类(测试泛型)
添加一个带有泛型的List类型的属性。在构造器中初始化courses属性 测试循环遍历用forCourse cr: courses
是把元素作为Course类型取出来而不是作为Object类型取出来 泛型集合不仅可以存入泛型类型的对象实例还可以添加泛型的子类型的对象实例
新建一个继承Course类的ChildCourse类。Course类如果只有含参构造器的话编译器就不会自动添加隐式的无参构造器。子类中必须调用父类的隐式构造器ChildCourse类就会报错。需要手动的在父类中加一个无参构造器。
在TestGeneric类中添加一个testChild方法
泛型集合可以添加泛型的子类型的对象实例 泛型集合中不能添加泛型规定的类型及其子类型以外的对象否则会报错。
泛型应该注意的地方 1.泛型集合中的限定类型不能使用基本数据类型。必须是引用数据类型。 2.如果非要使用基本数据类型时必须使用它们的包装类 如int-Integer Set
Set接口及其实现类--HashSet list有序的Set无序的 所以Set没有set()这个给定指定索引位置去修改元素的方法。 案例功能 创建一个SetTest类
将Student类中Set类型的属性修改一下添加一个Course类型的泛型。
在SetTest类添加一个带有泛型Course的List类型的属性courseToSelect创建SetTest的构造器初始化courseToSelect属性 因为课程的ID是一个字符串是一个对象用equals方法跟输入的字符串比较是否相等。
set特点无序不可重复
无序循环遍历set时只能用foreach或者迭代器iterator方法不能用get()方法因为set是无序的没有index。遍历输出也是乱序的。
不可重复如果添加几个相同的元素则只会保留一个 散列级HashSet 类
HashSet类是按照哈希算法来存取集合中的元素的使用哈希算法可以提高存取的效率。当向HashSet 集合中添加元素时就会调用该元素的hashCode() 方法获取哈希码值然后根据这个哈希码值计算出该元素的存放位置。
HashSet 集合具有以下特点
不能保证元素的排列顺序集合中元素的顺序随时有可能发生改变。集合中最多允许存在一个null元素HashSet 集合不是线程同步的。
Map和HashMap简介
Collection存储的都是单个元素。而Map提供了一种映射的关系key到value的映射。
因此Map集合中保存这两组值一组用于保存key,另一组用于保存value,key和value都可以是任何引用数据类型。Map集合中的key不允许重复每一个key只能映射一个value。 Map接口 通过put()方法添加一个键值对的映射
put
V put(K key, V value)
将指定的值与此映射中的指定键关联可选操作。如果此映射以前包含一个该键的映射关系则用指定值替换旧值当且仅当 m.containsKey(k) 返回 true 时才能说映射 m 包含键 k 的映射关系。
参数
key - 与指定值关联的键
value - 与指定键关联的值
返回
以前与 key 关联的值如果没有针对 key 的映射关系则返回 null。如果该实现支持 null 值则返回 null 也可能表示此映射以前将 null 与 key 关联。
Map接口提供三种方法1. SetK keySet() 返回此映射中包含的键的 Set 视图。
2. CollectionV values() 返回此映射中包含的值的 Collection 视图。
3. SetMap.EntryK,V entrySet() 返回此映射中包含的映射关系的 Set 视图。
HashMap类 案例功能 集合工具类Collections
Collections 类是用于操作List、Set和Map等集合的工具类该类提供了大量的方法可以对集合元素进行排序、查询和修改等操作。
Collections 类是java.util包下的。它所提供的方法均为静态方法可以直接通过“类名.方法”的形式调用。小结 集合的长度是可变的但是只能存放引用数据类型的数据不能存放基本数据类型的数据Collection 是集合类的基本接口其主要的子接口有List 和 Set。而Map 不是其子接口。Collection 接口声明所有集合类的核心方法一般情况下都不会使用Collection 接口而是使用其子类List和Set集合。List 是有序的Collection使用List 接口可以精确地控制每个元素插入的位置也可以通过索引来访问List集合中的元素。List接口常用的实现类有ArrayList 和LinkedList。List 集合允许存放重复的元素。Set 是一个不包含重复元素的CollectionSet允许包含null元素但不能包含重复的元素。一般重写类的equals() 和 hashCode() 方法来区别Set集合中元素是否相同。Set 接口常用的子类有HashSet 和TreeSet其中HashSet 是按照哈希算法来存取集合中的元素的其存取的效率高。HashSet 类是无序存放元素的而TreeSet 是有序存放元素的但是需要使用Comparable 进行排序操作。集合的输出有多种方式其中使用Iterator 迭代器是标准的输出方式在JDK1.5 之后集合也支持了foreach 方式。Map 没有继承Collection 接口可以用于保存具有映射关系的数据其提供的是key 到value的映射。Map接口常用实现类有HashMap 和TreeMap。HashMap 类是基于哈希表的Map接口的实现对于元素的添加和删除有着较高的效率。TreeMap 集合主要是对所有的key进行排序从而保证所有的key-value 映射关系处于有序状态。TreeMap 集合在元素的添加、删除和定位映射性能较低。