java oop第07章_集合框架
一、 什么是集合:
在Java中提供了一些可以保存同一数据类型的数据集称为集合,就是规定了一些集合的规范(接口、抽象类、实现类)及方法,
方便我们程序在保存数据时进行增、删、改、查操作,编程更加高效。
二、 List集合:
List集合特性:List集合(ArrayList、LinkedList)是可重复的、有序的(是原始顺序)
1、ArrayList实现类:底层采用数组实现,查询可以通过下标快速点位,查询速度快,针对添、删、改速度慢
2、LinkedList实现类:底层采用双向链表实现,添加、删除时通过修改操作元素的前后索引值即可,效率高;
针对查询就需要从第一个查询到最后一个,查询效率低
package com.oop.ch07.test; import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.junit.Test;
import com.oop.ch07.Dept; /**
*练习List集合的使用:ArrayList、LinkedList
*
*/
public class ListTest { //测试arraylist的基本用法
@Test
public void testArrayList1() {
List arrayList1 = new ArrayList();
//将元素值追加到集合中
arrayList1.add("aa");
arrayList1.add("gg");
arrayList1.add("bb");
arrayList1.add("cc");
//将元素值插入到index(从0开始)指定的位置,其他的元素往后挪
arrayList1.add(1, "mm");
for (Object a : arrayList1) {
System.out.println(a);
}
System.out.println("----------------------");
Integer element0 = (Integer) arrayList1.get(0);
System.out.println(element0); } //泛型
@Test
public void testArrayList2() {
//在创建实现类ArrayList的对象时,Java7.0及以上的版本泛型会参考左边
List<String> arrayList1 = new ArrayList<String>();
//将元素值追加到集合中
arrayList1.add("aa");
arrayList1.add("gg");
arrayList1.add("bb");
arrayList1.add("cc");
//将元素值插入到index(从0开始)指定的位置,其他的元素往后挪
arrayList1.add(1, "mm");
for (Object a : arrayList1) {
System.out.println(a);
}
System.out.println("----------------------");
//添加泛型以后可以将运行时异常提前为检查性异常,更容易被发现此异常,并及时处理
//Integer element0 = (Integer) arrayList1.get(0);
String element0 = arrayList1.get(0);
System.out.println(element0); } //基本数据类型和包装数据类型
@Test
public void arrayList3() {
List<Float> studentNos = new ArrayList<Float>();
//自动装箱:能将基本数据类型(float)自动转换为包装数据类型(Float)
studentNos.add(1.0F);
studentNos.add(2.0F);
//自动拆箱:能将包装数据类型自动转换为基本数据类型
float no1 = studentNos.get(1);
System.out.println(no1);
} /**
* 练习List(ArrayList、LinkedList)集合中提供的常用方法
*/
@Test
public void arrayList4() {
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("aaa"); //在集合中从前向后查找指定的元素值对应的索引位置
int index1 = list.indexOf("aaa"); //从前往后
System.out.println(index1); //在集合中从后向前查找指定的元素值对应的索引位置
int index2 = list.lastIndexOf("aaa"); //从后往前
System.out.println(index2); //判断集合中是否包含指定的元素,包含为true
//list.contains("ccc");
System.out.println(list.contains("ccc")); //通过索引删除指定位置的元素,返回删除的元素值
list.remove(3);
System.out.println(list.remove(3)); //通过元素删除对应的元素,返回是否删除成功
//list.remove("bbb");
System.out.println(list.remove("bbb")); //返回集合元素个数
System.out.println(list.size()); //Iterator迭代器,循环遍历元素
/*
* 返回该集合的所有元素,并把他们放置到一个iterator迭代器中,
* it.hasNext():返回迭代器中是否还有下一个元素
* it.net():返回正在迭代的元素值,将指针向下移动一个单位
*/
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
} /**
* 练习LinkedList集合中提供的常用方法
*/
@Test
public void testLinledList() {
List<String> list = new LinkedList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("aaa"); for (String element : list) {
System.out.println(element);
} //在集合中从前向后查找指定的元素值对应的索引位置
int index1 = list.indexOf("aaa"); //从前往后
System.out.println(index1); //在集合中从后向前查找指定的元素值对应的索引位置
int index2 = list.lastIndexOf("aaa"); //从后往前
System.out.println(index2); //判断集合中是否包含指定的元素,包含为true
//list.contains("ccc");
System.out.println(list.contains("ccc")); //通过索引删除指定位置的元素,返回删除的元素值
list.remove(3);
System.out.println(list.remove(3)); //通过元素删除对应的元素,返回是否删除成功
//list.remove("bbb");
System.out.println(list.remove("bbb")); //返回集合元素个数
System.out.println(list.size()); //Iterator迭代器,循环遍历元素
/*
* 返回该集合的所有元素,并把他们放置到一个iterator迭代器中,
* it.hasNext():返回迭代器中是否还有下一个元素
* it.net():返回正在迭代的元素值,将指针向下移动一个单位
*/
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
} /*
* 在List中放实体,实体类代码放在最后
*/
@Test
public void testArrayListEntity() {
List<Dept> deptList = new ArrayList<Dept>();
deptList.add(new Dept("人事部","北京"));
deptList.add(new Dept("财务部","上海"));
deptList.add(new Dept("公关部","昆明"));
deptList.add(new Dept("综合部","山东")); for (Dept dept : deptList) {
System.out.println(dept);
}
}
}
三、 Set集合:
1、HashSet实现类:不可重复的、是无序的,Hash算法就是随机算法。
package com.oop.ch07.test; import java.util.*; /*
* 练习HashSet集合的使用
*/
public class HashSetTest { public static void main(String[] args) {
Set<String> set = new HashSet<String>(); System.out.println("set集合是否为空:" + set.isEmpty()); set.add("aaa");
set.add("bbb");
set.add("ccc");
set.add("ddd");
set.add("eee");
set.add("aaa"); for (String element : set) {
System.out.println(element);
}
System.out.println("---------"); //只能通过值删除
set.remove("eee");
for (String element : set) {
System.out.println(element);
} //集合的长度
System.out.println("Set集合的长度:" + set.size()); //Iterator迭代器,遍历set
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next()); }
} }
2、TreeSet实现类:不可重复的、是有序的(自然顺序,a-z、0-9)
package com.oop.ch07.test; import java.util.*; /*
* 练习TreeSet集合的使用:自然顺序
TreeSet集合的大多数方法都和HashSet一样的
*/
public class TreeSetTest {
public static void main(String[] args) {
Set<String> set = new TreeSet<String>();
set.add("aaa");
set.add("ccc");
set.add("bbb");
set.add("ddd");
set.add("eee");
set.add("aaa"); for (String element : set) {
System.out.println(element);
}
}
}
四、 Map集合:
Map集合采用“键值对”的entry结构,每一个元素由key(键)和value(值)构成,可以通过指定key方便的获取value。
1、 HashMap实现类:是无序的(Hash是一种随机算法),针对Key是不可重复的,若放相同的Key,
新的entry会替换老的entry;针对value没有限制(可重复)。
2、 TreeMap实现类:针对key是自然排序,不可重复,若key重复,新的entey会替换老的entry。针对value没有限制(可重复)。
package com.oop.ch07.test; import java.util.Map.*;
import java.util.*;
import org.junit.Test;
import com.oop.ch07.Dept; /*
* 练习map集合的使用:HashMap、TreeMap
*/
public class MapTest {
/**
* 练习HashMap
*/
@Test
public void testHashMap() {
Map<Object, Object> map = new HashMap<Object, Object>();
map.put("k1","k1的值");
map.put("k2","k2的值");
map.put("k3","k3的值");
map.put("k4","k4的值");
map.put("k3","k3的新值");
map.put("k5","k3的值"); //通过key获取该entry中的value
System.out.println(map.get("k3")); //entry的个数
System.out.println("entry的个数:" + map.size()); //map.keySet():将Map集合中所有entry的key都获取并放置到Set集合中
Set<Object> keySets = map.keySet();
for (Object key : keySets) {
//针对放置了Map集合中所有Key的Set集合进行遍历,可以取到Key值,再通过get(Object Key)方法获取到对应的value
System.out.println("键:" + key + ",值:" + map.get(key));
} //entrySet():将Map集合中的所有entry(key和Value)一次性取出来放到一个Set集合中,
//再通过entry的getKey和getValue方法,获取到Map集合中放置的Key和value
//Entry<Object, Object>:相当于一个object
System.out.println();
Set<Entry<Object, Object>> entrySet = map.entrySet();
for (Entry<Object, Object> entry : entrySet) {
System.out.println("键:" + entry.getKey() + ",值:" + entry.getValue());
} //containsKey(Object key):Map集合的Key中是否包含key,包含为true
System.out.println(map.containsKey("k2"));
//containsValue(Object value):Map集合的Value中是否包含value
System.out.println(map.containsValue("K2")); } /**
* 练习TreeMap
*/
@Test
public void testTreeMap() {
Map<Object, Object> map = new TreeMap<Object, Object>();
map.put("k1","k1的值");
map.put("k2","k2的值");
map.put("k3","k3的值");
map.put("k4","k4的值");
map.put("k3","k3的新值");
map.put("k5","k3的值"); //通过key获取该entry中的value
System.out.println(map.get("k3")); //entry的个数
System.out.println("entry的个数:" + map.size()); //map.keySet():将Map集合中所有entry的key都获取并放置到Set集合中
Set<Object> keySets = map.keySet();
for (Object key : keySets) {
//针对放置了Map集合中所有Key的Set集合进行遍历,可以取到Key值,再通过get(Object Key)方法获取到对应的value
System.out.println("键:" + key + ",值:" + map.get(key));
} //entrySet():将Map集合中的所有entry(key和Value)一次性取出来放到一个Set集合中,
//再通过entry的getKey和getValue方法,获取到Map集合中放置的Key和value
//Entry<Object, Object>:相当于一个object
System.out.println();
Set<Entry<Object, Object>> entrySet = map.entrySet();
for (Entry<Object, Object> entry : entrySet) {
System.out.println("键:" + entry.getKey() + ",值:" + entry.getValue());
} //containsKey(Object key):Map集合的Key中是否包含key,包含为true
System.out.println(map.containsKey("k2"));
//containsValue(Object value):Map集合的Value中是否包含value
System.out.println(map.containsValue("K2")); } @Test
/*
* 在HashMap中放实体
*/
public void testHashMapEntity() {
Map<String,Dept> deptMap = new HashMap<String, Dept>();
deptMap.put("dept1", new Dept("人事部","北京"));
deptMap.put("dept2", new Dept("财务部","上海"));
deptMap.put("dept3", new Dept("公关部","昆明"));
deptMap.put("dept4", new Dept("综合部","山东")); //打印一个value
System.out.println(deptMap.get("dept1")); //使用entrySet遍历Map集合
System.out.println("使用entrySet遍历Map集合");
for (Entry<String, Dept> map : deptMap.entrySet()) {
System.out.println(map);
} //使用keySet遍历集合
System.out.println("使用keySet遍历集合");
//Set<String> key = deptMap.keySet();
for (String map : deptMap.keySet()) {
System.out.println(map + "=" + deptMap.get(map));
}
}
}
实体类:
package com.oop.ch07; /**
* 练习封装tb_dept表对应的实体类Dept 八种基本数据类型对应的有八种引用数据类型(包装数据类型),
* byte short int long loat double char boolean
* Byte Short Integer Long Float Double Character Boolean
*
*/
public class Dept {
private Integer deptNo; // 部门编号
private String dName; // 部门名称
private String loc; // 部门所在地
//setter、getter方法的区域:
public void setDeptNo(Integer deptNo) {
this.deptNo = deptNo;
}
public Integer getDeptNo() {
return deptNo;
} public void setDName(String dName) {
this.dName = dName;
}
public String getDName() {
return dName;
} public void setLoc(String loc) {
this.loc = loc;
}
public String getloc() {
return loc;
} //构造方法的区域:
//默认的构造方法,当手动写了一个带参的构造方法,默认的就会失效
public Dept() { }
//有参的构造方法
public Dept(Integer deptNo) {
this.deptNo = deptNo;
}
public Dept(String dName,String loc) {
this.dName = dName;
this.loc = loc;
}
public String method1() {
return null;
} /*
* 重写toString()方法,在Object类中就定义过该方法,一个类若重写了toString()方法
* 当输出该类的对象信息时,就会以toString方法的格式输出该类中“属性名 = 属性值”的格式,更方便我们观察对象的属性信息
* 此方法不需要手动调用,而是在输出对象时,JVM会自动调用
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Dept [deptNo=" + deptNo + ", dName=" + dName + ", loc=" + loc + "]";
}
}
五、 泛型:
在集合框架中默认放置的数据都是Object类型(让集合可以存放任何类型的数据),但实际运用过程中通常需要将类型具体化,
更利于代码的编写,因此Java提供了泛型来指定集合中放置数据的真实类型,以避免后期数据类型转换异常。
java oop第07章_集合框架的更多相关文章
- Java oop 第13章_多线程
第13章_多线程 一. 多线程相关的概念: 程序:由某种编程语言开发可执行某些功能的代码组合,它是静态的概念. 进程:当程序被执行时的过程可以理解为讲程序从外存调入内存的过程,会为每一个程序 ...
- java oop第11章_反射、BaseDao的进一步改造
引言:从Java5开始,Java中引用了一个新的概念反射,当程序运行时,能动态感知到程序中拥有的所以信息,这个获取信息的过程是采用反射机制来完成. 一. Class类: Class类用 ...
- java oop第06章_异常处理
一. 异常的概念: 若程序都按我们事先设定的计划运行为正常执行,但通常会出现我们事先预料之外的其他情况,称为程序发生异常, 在java中会对一些可能出现异常的代码进行分类,达到尽量对可能发生的异常进行 ...
- Java oop第05章_多态、接口
一. 为什么需要接口? Java中当一个类继承父类时,最多也只能继承一个父类,扩展性会受到一定的限制,为了弥补这一缺陷,Java又提供了一种新的引用数据类型分类,叫接口. 一个类只能继承一个父类,但可 ...
- java OOP第03章_继承、抽象类和抽象方法
一. 为什么需要继承: 若多个类中都需要一些属性和方法,那么就可以将属性和方法抽取到一个父类中,需要的子类可以通过extends关键字去继承这个父类后拥有相应的属性和方法. 类.数组.方法----引用 ...
- Java OOP——第六章 框架集合
1.集合框架包含的主要内容及彼此之间的关系: 图1: 集合框架:是为了表示和操作集合而统一规定的一种统一的标准体系结构. 包含三大块的内容:对外的接口.接口的是实现和对 ...
- Java之旅_高级教_集合框架
摘自:http://www.runoob.com/java/java-collections.html Java 集合框架 早在Java2之前,java 就提供了特设类.比如:Dictionary,V ...
- JavaSE学习总结第15天_集合框架1
15.01 对象数组的概述和使用 public class Student { // 成员变量 private String name; private int age; // 构造方法 publ ...
- JavaSE学习总结第16天_集合框架2
16.01 ArrayList存储字符串并遍历 ArrayList类概述:底层数据结构是数组,查询快,增删慢,线程不安全,效率高 ArrayList类是List 接口的大小可变数组的实现.实现了所 ...
随机推荐
- SonarQube搭建和使用教程
我想使用 SonarQube 查阅代码 请问怎么做,现在只有一个要审查代码的项目
- 改变IntelliJ IDEA 中的system和config/plugins的默认C盘的路径
1,问题,在为idea在线安装插件时,如JProfiler,会默认安装到C盘,而本人则是希望安装到软件所在的D盘目录下,那么如何修改呢: C:\Users\xxx\.IntelliJIdea\conf ...
- 高级UI晋升之常用View(三)上篇
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将先从以下两个内容来介绍常用View: [RecycleView] [Ca ...
- 内网渗透_linux_socks代理_reGeorg+proxychains
过程演示 测试前提是目标服务器已经getshell. 1.将 reGeorgSocksProxy 中的 tunnel.jsp 文件放置到目标服务器web目录,查看能否正常访问(如图). 2.设置kal ...
- Codeforces 1151E 统计贡献
题意:给你一个数组a,设函数f(l, r)为数组a中权值在[l, r]之间的连通块的数目,比如a = [1, 3, 2, 1], f(1, 2) = 2, 连通块是位置1和位置3,4.问Σ(i = 1 ...
- RedHat版本Linux安装chrome-stable配合chromeDriver进行自动化测试环境准备
一.Linux机器安装google-chrome-stable 1.设置google-chrome软件源 sudo vim /etc/yum.repos.d/google-chrome.repo [g ...
- PHP算法之最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例如,给定数 ...
- Codeigniter 列出所有控制器和控制器的方法(类似路由列表)
我的思路是: 读取控制器文件夹下的所有 php 文件 获取父级的控制器的方法的不应该出现在每个控制器的路由中,所以需要排除父级控制器的方法 读取 控制器文件夹下的 php文件的类名和方法 下面的代碼是 ...
- .net Core使用EFCore连接数据库
一.SQL Service 1.创建实体类 public class Student { public int Id { get; set; } [Required] [Display(Name =& ...
- IDEA中@Autowired 注解报错~图文