集合

如何存储每天的新闻信息?每天的新闻总数是不固定的,太少浪费空间,太多空间不足。

如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,可以使用Java集合框架。

Java 集合框架提供了一套性能优良、使用方便的接口和类,位于 java.util 包中。

接口 Collection 存储一组不唯一,无序的对象,它有两个子接口 List和Set。List 接口存储一组不唯一,有序(插入顺序)的对象。Set 接口存储一组唯一,无序的对象。

接口 Map 存储一组键值对象,提供 key 到 value 的映射

List 接口的实现类

ArrayList

ArrayList 实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高。

下面演示使用及常用方法

//Book类存储书的信息
public class Book { private String name;//书名
private float price;//价格 public Book() {
super();
} public Book(String name, float price) {
super();
this.name = name;
this.price = price;
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}

测试类

import java.util.ArrayList;
import java.util.List; public class TestArrayList {
public static void main(String[] args) {
List books=new ArrayList();//创建集合
//向集合中添加元素
books.add(new Book("80天环游世界",34.6f));
books.add(new Book("Java核心技术",88));
books.add(new Book("Java编程思想",122));
//获取集合的长度
System.out.println("集合的长度:"+books.size());
//指定索引移除一个元素
books.remove(0);
System.out.println("移除后集合的长度:"+books.size());
//for循环遍历 ArrayList
for (int i = 0; i < books.size(); i++) {
Book book=(Book) books.get(i);
System.out.println("书名:"+book.getName()+" 价格:"+book.getPrice());
}
//foreach 遍历 ArrayList
for (Object object : books) {
Book book=(Book) object;
System.out.println("书名:"+book.getName()+" 价格:"+book.getPrice());
}
//插入元素到指定索引,其余元素自动后移
books.add(0, new Book("明朝那些事儿",55));
//移除指定索引元素
books.remove(2);
//清空所有元素
books.clear();
System.out.println("清空集合的长度:"+books.size());
}
}

这里面的方法在 Java API 文档中都能查到,一定要学会查看帮助文档。

LinkedList

LinkedList 采用链表存储方法。插入、删除元素时效率比较高。LinkedList提供了对头部和尾部元素进行添加和删除的方法。

下面看一下操作链表集合

import java.util.LinkedList;

public class TestLinkedList {
public static void main(String[] args) { LinkedList books=new LinkedList();//创建链表集合
//向集合中添加元素
books.add(new Book("80天环游世界",34.6f));
//向集合首部添加元素
books.addFirst(new Book("Java核心技术",88));
//向集合尾部添加元素
books.addLast(new Book("Java编程思想",122));
System.out.println(books.size());
//获取第一个
Book book1=(Book) books.getFirst();
System.out.println("书的名字:"+book1.getName());
//获取最后一个
Book lastBook=(Book) books.getLast();
System.out.println("最后一本书的名字:"+lastBook.getName());
//移除第一个元素
books.removeFirst();
System.out.println("集合长度:"+books.size());
//移除最后一个元素
books.removeLast();
System.out.println("集合长度:"+books.size());
}
}

LinkedList也实现于List接口,所以在ArrayList示例中使用的方法LinkedList都有,LinkedList独有的方法在上例中,单独记忆即可。

Map

Map接口专门处理键值映射数据的存储,可以根据键实现对值得操作,最常用的实现类是HashMap,Map的键不允许重复。

import java.util.HashMap;
import java.util.Map; public class TestMap {
public static void main(String[] args) {
Map map=new HashMap();
map.put("h", "hello");//向集合中添加键和值的映射
map.put("b1", new Book("Java核心技术",88));
System.out.println("集合长度:"+map.size());
map.remove("h");//通过指定的键移除键和值
//根据键获取指定的值
Book book=(Book) map.get("b1");
System.out.println("书名:"+book.getName());
//遍历Map的值的集合
for (Object temp : map.values()) {
System.out.println(temp);
}
//清空集合
map.clear();
System.out.println("集合长度:"+map.size());
}
}

泛型集合

下面代码在使用时有没有问题:

Book book=(Book) books.get(i);

List和Map添加元素时都是Object类型,在强制类型转换时容易发生异常。JDK1.5使用泛型改写了集合框架中的接口和类。

使用泛型时要加上一对“<>”,在尖括号内写上限定的数据类型。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class Test {
public static void main(String[] args) {
List<String> names=new ArrayList<String>();
names.add("张三");//只能添加 String 类型元素
names.get(0).substring(0);//返回的类型也是指定的类型
//Map在使用时需要同时指定键和值的类型
Map<String,String> map=new HashMap<String,String>();
map.put("h", "hello");//键和值都只能是指定的类型
}
}

指定完类型后,元素就是指定的类型的元素,那这样在存数据和取数据都是指定类型,不需要类型转换。

使用泛型后,集合的遍历也更加方便,其中演示了foreach遍历Map的三种方法。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; public class TestEach {
public static void main(String[] args) {
//List的遍历
List<Book> books=new ArrayList<Book>();
books.add(new Book("80天环游世界",34.6f));
books.add(new Book("Java核心技术",88));
books.add(new Book("Java编程思想",122));
//books.add("aaa");//去掉注释试试
for (Book book : books) {
System.out.println(book.getName());
}
//Map的遍历
Map<String,Book> bookMap=new HashMap<String,Book>();
bookMap.put("java", new Book("Java入门到精通",122));
bookMap.put("docker", new Book("docker入门到精通",122));
//1.遍历键获取值
for (String key : bookMap.keySet()) {
Book book=bookMap.get(key);
System.out.println(book.getName());
}
System.out.println("==============");
//2.遍历值
for (Book book : bookMap.values()) {
System.out.println(book.getName());
}
System.out.println("--------------");
//3.同时遍历键和值
for (Entry<String, Book> entry : bookMap.entrySet()) {
String key=entry.getKey();
Book value=entry.getValue();
System.out.println("key:"+key+" value:"+value.getName());
}
}
}

map.keySet() 返回的是一个 Set 集合,这也是Map的键不能重复的原因。entrySet()方法返回了Entry的集合,Entry包含了键和值。

迭代器 Iterator

迭代器用来迭代集合,常用的两个方法:hasNext()返回布尔值,判断是否存在另一个可访问的元素。next()返回要访问的下一个元素,可以指定为泛型,这样不需要类型转换。

下面看一下 List 集合和 Map 使用迭代器。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; public class TestIterator { public static void main(String[] args) {
List<Book> books=new ArrayList<Book>();
books.add(new Book("80天环游世界",34.6f));
books.add(new Book("Java核心技术",88));
books.add(new Book("Java编程思想",122));
//获取迭代器
Iterator<Book> i=books.iterator();
while(i.hasNext()) {
Book book=i.next();
System.out.println("图书名字:"+book.getName());
}
//Map可以迭代键或值
Map<String,Book> bookMap=new HashMap<String,Book>();
bookMap.put("java", new Book("Java入门到精通",122));
bookMap.put("docker", new Book("docker入门到精通",122));
//获取键的迭代器
Iterator<String> iKey=bookMap.keySet().iterator();
while(iKey.hasNext()) {
String key=iKey.next();
System.out.println(key);
}
//值的迭代器写法类似
Iterator<Book> iValue=bookMap.values().iterator();
while(iValue.hasNext()) {
Book value=iValue.next();
System.out.println(value.getPrice());
}
}
}

迭代器可以和其他循环用法结合,大家可以自己尝试。

包装类

先看一下这段代码是否能编译呢?

List<int> nums=new ArrayList<int>();

编译器会提示只能写引用类型,java为每个基本数据类型都提供了引用类型。

基本类型 引用类型
int Integer
double Double
float Float
byte Byte
long Long

这些引用类型赋值时可以赋值对应的基本类型

Integer i=1;
Float f=2.2f;

也可以像引用类型那样初始化为null

Integer i=null;

这些包装类的方法过多,大家可以查阅文档。

欢迎将查阅到的包装类的方法发表到留言区

Java入门系列-19-泛型集合的更多相关文章

  1. 快速入门系列--CLR--03泛型集合

    .NET中的泛型集合 在这里主要介绍常见的泛型集合,很多时候其并发时的线程安全性常常令我们担忧.因而简述下.NET并发时线程安全特性,其详情请见MSDN. 普通集合都不支持多重并发写操作 部分支持单线 ...

  2. Java入门教程十二(集合与泛型)

    在 Java 中数组的长度是不可修改的.然而在实际应用的很多情况下,无法确定数据数量.这些数据不适合使用数组来保存,这时候就需要使用集合. Java 的集合就像一个容器,用来存储 Java 类的对象. ...

  3. Java入门系列(七)Java 集合框架(JCF, Java Collections Framework)

    Java 集合概述 List.Set.Map可以看做集合的三大类 java集合就像一个容器,可以将多个对象的引用丢进该容器中. Collection和Map是java集合的根接口. List List ...

  4. Java入门——(6)集合

       关键词:Collection接口.Map接口.Iterator接口.泛型.Collections工具类.Arrays工具类   一.集合概述      当数据多了需要存储,需要容器,而数据的个数 ...

  5. java io系列19之 CharArrayWriter(字符数组输出流)

    本章,我们学习CharArrayWriter.学习时,我们先对CharArrayWriter有个大致了解,然后深入了解一下它的源码,最后通过示例来掌握它的用法. 转载请注明出处:http://www. ...

  6. Java入门系列-26-JDBC

    认识 JDBC JDBC (Java DataBase Connectivity) 是 Java 数据库连接技术的简称,用于连接常用数据库. Sun 公司提供了 JDBC API ,供程序员调用接口和 ...

  7. Java入门系列 泛型

    前言 <Java编程思想>第四版足足用了75页来讲泛型——厚厚的一沓内容,很容易让人头大——但其实根本不用这么多,只需要一句话:我是一个泛型队列,狗可以站进来,猫也可以站进来,但最好不要既 ...

  8. Java入门系列之集合LinkedList源码分析(九)

    前言 上一节我们手写实现了单链表和双链表,本节我们来看看源码是如何实现的并且对比手动实现有哪些可优化的地方. LinkedList源码分析 通过上一节我们对双链表原理的讲解,同时我们对照如下图也可知道 ...

  9. Java入门系列之集合ArrayList源码分析(七)

    前言 上一节我们通过排队类实现了类似ArrayList基本功能,当然还有很多欠缺考虑,只是为了我们学习集合而准备来着,本节我们来看看ArrayList源码中对于常用操作方法是如何进行的,请往下看. A ...

随机推荐

  1. Arduino I2C + 温湿度传感器Si7021

      Si7021是Silicon Labs生产的温湿度传感器芯片.其主要特性: 湿度精度:误差典型值+/-2%RH,最大值+/-3%RH(0~80%RH),出厂已校正 温度精度:误差典型值+/-0.3 ...

  2. 给刚玩Hadoop的朋友一些建议

    随着两会中间央视新闻天天说大数据,很多人纷纷开始关注大数据和Hadoop以及数据挖掘和数据可视化了,我现在创业,遇到很多传统数据行业往Hadoop上面去转型的公司和个人,提了很多问题,大多数问题还都是 ...

  3. 三个数组求中位数,以及中位数的中位数----java算法实现

    求三个数组的中位数,以及中位数的中位数.   import java.util.Arrays; public class median { public static void main(String ...

  4. 【连载】redis库存操作,分布式锁的四种实现方式[三]--基于Redis watch机制实现分布式锁

    一.redis的事务介绍 1. Redis保证一个事务中的所有命令要么都执行,要么都不执行.如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行.而一旦客户端发 ...

  5. “全栈2019”Java第四十章:this关键字

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. bzoj1875 HH去散步

    题目链接 一开始特别天真, $Folyd$传递闭包写了一下过了样例就交上去了 然后$gg$ $qwq$ 想了想$……$ 还要写一点东西 最后统计答案的时候有细节要注意 /*************** ...

  7. utf 8无bom和utf 8什么区别

    今天在上传CSV文件的时候,Windows下调试一切正常.妈的一到Linux下面,就出现问题,第一行数据总是读取不出来, 利用print_r()打印出读取文件的内容,发现有一个很奇怪的字符在作怪.为什 ...

  8. [ActionScript 3.0] 通过BitmapData将对象保存成jpg图片

    此方法需要用到JPGEncoder.as和BitString.as这两个类,是将BitmapData对象转换成ByteArray,然后通过FileStream把此ByteArray写入到文件保存成jp ...

  9. 【数据结构】10分钟教你用栈求解迷宫老鼠问题超详细教程附C++源代码

    问题描述 给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口.如下图所示: 该图是一个矩形区域,有一个入口和出口.迷宫内部包含不能穿越的墙壁或者障碍物.这些障碍物沿着行和列放置,与迷宫的边界 ...

  10. Python中的正斜杠/与反斜杠\

    知识点: 1. "/"左倾斜是正斜杠,"\"右倾斜是反斜杠,可以记为:除号是正斜杠 2. 对于目录分隔符,Unix和Web用正斜杠/,Windows用反斜杠\. ...