一、Java集合框架的产生和组成
(一)、Java集合框架产生
程序内部的数据都是需要进行处理的,即对数据进行有效的、合理的进行组织;而数据存储在计算机内部的结构是多样的,如:链表数据结构、散列表数据结构等(这些数据结构都是可以存放若干个对象)——但是如果每一次编写程序用到数据结构进行删除、插入等操作时,都需要开发人员自己手撸删除、插入等算法,很是繁琐、不方便——所以Java提供了实现常见数据结构的类(ArrayList、LinkedList、Stack),这些类里面有相关的删除、插入等方法,当开发程序要使用数据结构并操作时——就可以直接用这些已经定义好的类声明一个对象来调用相关操作方法了,非常方便明了。——这些类也称为Java集合框架——后来Java集合框架有可以支持泛型了。
集合是用来存储不同类型的对象
(二)、Java集合框架组成
1、iterator迭代器 接口
Java中的迭代器:iterator是一个接口
迭代器意思:相当于一个指针来指向第一个集合的对象(结点)的地址。
迭代器作用:用于遍历集合的元素,迭代器找到集合中的一个对象(结点)同时,也得到了下一个的对象(结点),因此可以快速地遍历集合。
迭代器里面两个重要的的方法:hasNext()——判断下一个对象(结点)是否为空、next()——获取集合对象(结点)里面的数据。
Iterator<String> iter = list.iterator(); //list.iterator()可以获取一个迭代器Iterator对象
while(iter.hasNext()){
String te = iter.next();
}
2、Collection接口
Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
3、接口:List、Set
- List:元素有序可以存放重复的内容
- Set:元素无序不能存放重复的内容,重复内容靠hashCode()和equals()两个方法区分
4、实现接口 List、Set 的类
实现 List 接口的三个类
- ArrayList
- LinkedList
- Vector
回顾知识点——实现接口
接口里面有抽象方法,一个类来实现接口,该类的对象需要赋值给接口变量,此时使用接口变量来调用该类里面的方法。
实现 Set 接口的三个类
- TreeSet——有序的存放
- HashSet——无序的存放,可以去除重复的元素
5、常见操作方法
- add():添加元素
- get():读取元素
- size():统计元素个数
- remove():删除元素
6、Collections类
Collections则是上面集合类的一个工具类/帮助类,其中提供了一系列类方法,用于对集合中元素进行排序、查找、重排序、旋转。
sort()、shuffle()……
使用方法:Collection.sort(List、Set接口变量);
7、一般书写格式
接口(List、Set)<泛型> 接口变量 = new 集合类<泛型>( ) —— List<String> list = new LinkedList<String>( );
// new LinkedList<String>()是创建一个对象, List<String> list 是创建一个接口变量,整句就是对象赋值给接口变量,下面使用接口变量调用类对象的方法(上面红字实现接口知识点)。
二、Java泛型
概念:泛型就是广泛的数据类型,当我们不知道接下来需要使用哪一种数据类型时,我们可以用泛型来代替而不是使用具体的数据类型来指定。
作用:建立具有类型安全的集合框架,如链表、散列映射等数据结构。
为什么需要泛型,还要多写<>???——
- 有了泛型后,建立的数据结构就不必进行强制类型转换,即不要求在运行时进行类型检查了。
- 泛型类就是把泛型定义在类上,用户使用该类的时候,才把类型明确下来….这样的话,用户明确了什么类型,该类就代表着什么类型…用户在使用的时候就不用担心强转的问题,运行时转换异常的问题了。
- 简单理解泛型就是——用户想要使用哪种类型,就在创建的时候指定类型。使用的时候,该类就会自动转换成用户想要使用的类型了。
泛型类声明:class 类名称<泛型列表>——class People<E> // 泛型列表E可以是类对象和接口,但不能是原生基本数据类型 int 等。
泛型类声明对象:与普通类声明对象相比,泛型类声明对象时要在类名称后面加上——<泛型列表>
class A;
A a = new A(); //普通类声明对象
A<> a = new A<>(); //泛型类声明对象
三、实战项目
项目内容:创建一副扑克牌52张
项目要求:实现扑克牌的生成、实现扑克牌洗牌打乱顺序、实现抽取两种扑克牌来比较大小
代码如下:
(一)、Card类
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package core;
/**
*
* @author 14476
*/
public class Card {
private String face;//声明扑克牌的面值变量,私有成员变量-隐藏数据保护数据
private String suit;//声明扑克牌的花色变量,私有成员变量-隐藏数据保护数据
public Card(String face, String suit) {//构造函数
this.face = face;
this.suit = suit;
}
public String getFace() {//get方法是获取该类里面私有变量的值;
//因为该类成员变量是私有的,不能直接-对象.私有变量-获取该私有变量的值;
//只能通过get()方法获取私有变量的值
return face;
}
public String getSuit() {
return suit;
}
@Override//输出扑克牌
public String toString() {
return "Card{" + "face=" + face + ", suit=" + suit + '}';
}
//比较两张扑克牌大小
public int compareTo(Card o) {//比较函数的参数类型是一个Card对象
//声明数组f和s,两种赋初值方法
String[] f = new String[]{"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
String[] s = {"红桃", "方块", "黑桃", "梅花"};
int indA = -1, indB = -1;
for (int i = 0; i < f.length; i++) {
if (this.face == f[i]) {//调用该比较方法的对象的face面值值 是否 等于该比较方法里面定义的新数组
indA = i;
}
if (o.getFace().equals(f[i])) {//判断传进来的参数对象里面的面值 是否 等于数组f里面的元素
indB = i;
}
}
//以上部分已经获取了两张扑克牌的下标即面值大小,现在只需要比较花色即可
if (indA == indB) {//如果上面抽取的两张牌面值一样大,比较花色
for (int i = 0; i < s.length; i++) {
if (this.suit.equals(s[i])) {
indA = i;
}
if (o.getSuit().equals(s[i])) {
indB = i;
}
}
}
return indA - indB;//正数A大,负数B大,0相等;
}
}
(二)、Game类
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package core;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
*
* @author 14476
*/
public class Game {
String[] f = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};//声明字符串数组和赋初值
String[] s = {"红桃", "方块", "黑桃", "梅花"};
//使用接口List,用ArrayList数组类存放以上两个字符串数组的组合,即一张扑克牌需要面值和花色
//声明接口变量deck,把ArrayList数组类创建的对象引用赋值给接口变量,通过接口变量来调用该类里面的方法
List<Card> deck;//泛型列表是string类型
public Game() {//构造函数
deck = new ArrayList<Card>();
}
//给接口变量deck里面的数组元素对象赋值扑克牌面值和花色的组合
public void GenerateDeck() {
for (int i = 0; i < f.length; i++) {
for (int j = 0; j < s.length; j++) {
deck.add(new Card(f[i], s[j]));
}
}
}
//获取迭代器接口变量来遍历输出扑克牌,把deck获取的迭代器对象引用赋值给迭代器接口变量
//迭代器相当于指针,开始时声明迭代器接口变量,获取当前第一个对象元素的引用,同时获得了下一个对象元素引用
public void Print() {
for (Iterator it = deck.iterator(); it.hasNext();) {//hasNext()判断下一个对象元素结点是否是空的
System.out.print(it.next() + " ");//next()获取当前元素对象的数据
}
}
//Collections是工具类,里面有许多算法方法,用来辅助方便集合类,有排序sort、查找、重排序shuffle、
public void XP() {//洗牌函数-打乱上一次扑克牌顺序
Collections.shuffle(deck);
}
public void Play() {//Card类里面已经设计好了比较方法
if (deck.isEmpty()) {
System.out.println("游戏结束");
}
Card A = deck.get(0);//获取牌堆第一张牌给对象A,
deck.remove(0);//取完后删除
if (deck.isEmpty()) {
System.out.println("游戏结束");
}
Card B = deck.get(0);//获取牌堆第一张牌给对象B,
deck.remove(0);//取完后删除
System.out.println("\nA同学抽牌:" + A);
System.out.println("B同学抽牌:" + B);
if (A.compareTo(B) > 0) {
System.out.println("A同学赢了");
} else {
System.out.println("B同学赢了");
}
}
}
(三)、主类
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package homework;
import core.Game;
/**
*项目内容:创建一个扑克牌52张
*项目工作:实现52张扑克牌输出,实现扑克牌重洗,实现取两张扑克牌比较大小
* @author 14476
*/
public class Homework {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Game game = new Game();//创建game对象
game.GenerateDeck();//调用获得一副扑克牌方法
game.Print();//输出扑克牌
System.out.println("\n===洗牌后===");
game.XP();//洗牌后的扑克
game.Print();//输出扑克牌
game.Play();//开始比较大小
}
}