java集合框架读取数据_Java集合框架

集合的概念:

Java中的集合类:是一种工具类,就像容器,储存具有共同属性的对象,而且数量不限

集合的作用:

1.在类的内部,对数据进行组织

2.简单有效的搜索大量数据

3.有的接口提供了一些排列有序的元素,可以在序列间快速的插入或者删除有关元素

4.有的接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一堆箱,而这个关键字可以是任意类型

集合类和数组的区别:

数组的长度是固定的,集合类的长度是可变的,而且数组中要查询一些元素只能通过遍历的方法查询,如果要处理的元素很复杂,则程序执行起来效率很低,但是集合中可以通过元素的映射查找元素。

集合框架的两大接口:Collection和Map

一、Collection存储一个个独立的对象,包括3个子接口:List(序列)、Queue(队列)、Set(集),其中List和Queue存储的数据是排列有序且可重复的,Set是无序且不可重复的,List和Set是比较常用的。

ArrayList数组序列: 是List下的一个常用实现类;

LinkedList链表: 是Queue的重要的实现类,同时也是List的一个实现类;

HashSet哈希集:是Set的实现类

二、Map提供映射关系,内部以这样的Entry键值对来存储数据,其中key和value可以是任意类型的对象

HashMap哈希表:是Map的实现类

ArrayList、HashSet、HashMap是使用频率最高的三个实现类。

Collection接口、子接口及其实现类

一、Collection接口

1.Collection接口是List、Set、Queue接口的父接口

2.Collection接口定义了可用于操作List、Set和Queue的方法--增删改查

二、List接口及其实现类--ArrayList

1.List是元素有序并且可以重复的集合,被称为序列

2.List可以精确的控制每个元素的插入位置,或删除某个位置元素

3.ArrayList--数组序列,是List的一个重要实现类

4.ArrayList底层是由数组实现的

以下三种方法都是用来取出List中元素的方法:

-----for循环-----

public void testGet(){

int size=coursesToSelect.size();

for(int i=0;i

Course cr=(Course) coursesToSelect.get(i);

System.out.println("取出的课程:"+cr.getId()+":"+cr.getName());

}

}

-----迭代器-----

Iterator是一个接口,依赖于集合存在的,本身不具备存储功能

Iterator it=courseToSelect.iterator();

while(it.hasNext()) {

Course cr=(Course) it.next();

System.out.println("课程:" + cr.id + ":" + cr.name);

}

-----for each(增强for循环)-----

凡是继承了Iterable接口的类所生成的对象都可以用for/each循环

for(Object obj:coursesToSelect){  //遍历集合中的每一个元素,作为每一个Object变量

Course cr=(Course) obj;

System.out.println("课程:" + cr.id + ":" + cr.name);

}

修改List中的元素

使用set(index,Object element)修改元素,index表示索引位置,element表示新对象。

修改List的元素:

public void testModify(){

coursesToSelect.set(4,new Course("7","毛概"));

}

删除List中的元素

1.调用get(元素下标)方法取得集合中的元素,类型强转后赋值给课程对象

通过集合属性名.remove(课程对象)方法删除集合中某个元素,括号中是课程对象

2.通过 集合属性名.remove(元素下标)方法直接删除集合中的某个元素

3.通过removeAll(Arrays.asList(集合中元素组成的数组的数组名))方法删除集合中的某些元素组成的数组

括号中的Arrays.asList()工具类把数组转化成集合

泛型

集合中的元素,可以是任意类型的对象(对象的引用)

如果把某个对象放入集合,则会忽略他的类型,而把它当做Object处理

取出使用时,需转换类型。

泛型则是规定了某个集合只可以存放特定类型的对象

会在编译期间进行类型检查,可以直接按指定类型获取集合元素。

可以直接取用,不必转换类型。

表示为:List 元素名称,例:

List courses;

实例化时应调用元素类型。例:

this.courses = new ArrayList

泛型集合可以添加泛型的子类型的对象实例。

泛型集合中,不能添加泛型规定的类型及其子类型以外的对象,否则会报错。

定义子类型的时候要在父类型中添加一个无参的构造方法,否则出错,因为调用子类型的构造方法时,系统会默认调用父类的无参构造方法(super();)。

泛型不能是基本类型的,必须是引用类型的,泛型集合的限定类型:

1.泛型集合中不能使用基本数据类型Listcourse。必须为引用类型List course

2.可以通过使用包装类限定允许存入的基本数据类型Listcourse。

Set接口及其实现类——HashSet

1、Set是元素无序并且不可以重复的集合,被称为集。

2、HashSet——哈希集,是Set的一个重要实现类。

Set不能通过一个索引位置去修改相应位置上的元素,因为Set是无序的。

循环遍历Set中的每一个元素,只能用foreach方法和iterator方法,而不能像List那样,调用它的get()方法。这是因为Set是无序的,不能查询指定索引位置的某个元素,只能通过foreach和iterator循环迭代出来,因为是无序的,所以每次迭代,出来的结果都是不太一样的。

Set中,添加某个对象,无论添加多少次,最终只会保留一个该对象(的引用),并且,保留的是第一次添加的那一个。

Set中,可以添加空对象null。

Map和HashMap

Map提供了一种映射关系,其中的元素是以键值对的形式存储的,能够实现根据key快速查找value。

Map中的键值对以Entry类型的对象实例形式存在。

键(key值)不可重复,value值可以。

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

Map接口提供了分别返回key值集合、value值集合以及Entry(键值对)集合的方法。

Map支持泛型,形式如:Map

HaspMap是Map的一个重要实现类,也是最常用的,基于哈希表实现。

HashMap中的Entry对象是无序排列的。

Key值和Value值都可以是null,但是一个HashMap只能有一个key值为null的映射(key值不可重复)。

keySet方法,获取Map中所有key的集合

entrySet方法,获取Map中所有键值对的集合

Set > entrySet = Object.entrySet();

获取键值对集合的键值:entry.getKey();

value值:entry.getValue().属性;

Entry是Map的一个内部类,Set> entrySet = students.entrySet();

Map增删改查:

增:map的put(key,value)方法添加。

查:

1.利用keyset()方法获得Map中key的集合,再遍历key的集合,利用Map的get(key)方法得到key对应的value值。

2.利用EntrySet方法获取May中Entry对象集:然后用foreach遍历集,再用Entry集的getkey()和getvalue()方法得到每一个key值和value值。

删:remove(object key)

改:put(原有的key,新的value)

通过entrySet可以返回Map中的所有键值对

Set>entrySet = students.entrySet();

利用put方法修改Map中的已有映射

public void testModify() {

// 提示输入要修改的学生ID

System.out.println("请输入要修改的学生ID:");

// 创建一个Scanner对象,去获取从键盘上输入的学生ID字符串

Scanner console = new Scanner(System.in);

while (true) {

// 取得从键盘输入的学生ID

String stuID = console.next();

// 从students中查找该学生ID对应的学生对象

Student student = students.get(stuID);

if (student == null) {

System.out.println("该ID不存在!请重新输入!");

continue;

}

// 提示当前对应的学生对象的姓名

System.out.println("当前该学生ID,所对应的学生为:" + student.name);

// 提示输入新的学生姓名,来修改已有的映射

System.out.println("请输入新的学生姓名:");

String name = console.next();

Student newStudent = new Student(stuID, name);

students.put(stuID, newStudent);

System.out.println("修改成功!");

break;

}

}

List的contains方法

List的contains(obj)方法返回的是boolean值,用于判断此对象是否在List序列表中。

contains原理是从序列容器中从头到尾抽出每一个元素,然后调用每个对象的equals方法与传入进来的对象相比较,相等equals返回true,则contains方法也返回true。(通过重写equals方法,从而在调用List的contains方法时 判断的是该List中的某个元素里(即对象)的某个属性是否相同)

Set的Contains方法

1.list中的contains()方法比较时会调用对象的equals()方法

2.set中的contains()方法会先调用对象的hashcode()方法,成立后再调用equals()方法比较,两者为true才返回true

Collection ->set->contains() 需要重写equals(obj)+hashCode()方法,在eclipse中可以在单击鼠标右键->源代码->equals(obj)+hashCode()中自动添加重写代码。

== 和 Equals 的区别

1. == 是一个运算符。

2.Equals则是string对象的方法,可以.(点)出来。

我们比较无非就是这两种 1、基本数据类型比较 2、引用对象比较

1、基本数据类型比较

==和Equals都比较两个值是否相等。相等为true 否则为false;

2、引用对象比较

==和Equals都是比较栈内存中的地址是否相等 。相等为true 否则为false;

需注意几点:

1、string是一个特殊的引用类型。对于两个字符串的比较,不管是 == 和 Equals 这两者比较的都是字符串是否相同;

2、当你创建两个string对象时,内存中的地址是不相同的,你可以赋相同的值。

所以字符串的内容相同。引用地址不一定相同,(相同内容的对象地址不一定相同),但反过来却是肯定的;

3、基本数据类型比较(string 除外) == 和 Equals 两者都是比较值;

List的indexOf方法

1.indexOf()返回的是序列容器中的索引值,原理和contains方法差不多,用equals方法来判断该对象是否存在,从头到尾遍历一次

2.lastindexOf()方法和indexOf()方法一样,不同的是从序列尾开始遍历。

3.若相同对象多次出现在序列集合中,indexOf则返回第一次出现的位置,因为查询到了就不会再向下查询了。

4.如果不存在则返回“-1”。

Map中,是否包含某个Key之或某个Value值

在Map中,用containsKey()方法,来判断是否包含某个Key值;用containsValue()方法,判断是否包含某个Value值

跟 List 的 contains()方法一样,Map 中的 containsValue()方法也会调用每个 Value 值的 equals()方法去和参数对象比较,需要重写hashCode()方法和equlas()方法。

Collections工具类

是Java集合框架中,用来操作集合对象的工具类。也是Java集合框架的成员。

sort() 排序方法

Comparable和Comparator接口

Java中,两个对象进行排序,必须是可以比较的

Comparable——默认比较规则

Comparator——临时比较规则

Comparable接口——可比较接口

实现该接口表示:这个类可以比较大小,可以进行自然排序;

自然排序可以理解为定义了默认的比较规则;

其实现类需要实现compareTo()方法,compareTo()方法返回正数表示大,负数表示小,0表示相等。

Comparator接口——比较工具接口

其实现类需要实现compare()方法

String类是已经实现了Comparable接口的,可以正常的用Collections.sort()方法进行排序;对一个类型的对象进行排序,需要实现Comparable接口,并override compareTo()方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值