Day 15
一、集合框架
1、集合框架图
2、数据结构:
①、逻辑结构;
在计算机科学中,逻辑结构是指数据元素之间的关系,它描述了数据元素之间的逻辑联系,而不是它们在计算机内存中的物理存储方式。逻辑结构可以分为以下三种类型:
-
线性结构:线性结构是一种有序的数据结构,其中数据元素按照线性顺序排列,每个元素都有一个前驱和后继。常见的线性结构包括数组、链表、栈和队列等。
-
非线性结构:非线性结构是一种无序的数据结构,其中数据元素之间没有明确的前驱和后继关系。常见的非线性结构包括树和图等。树是一种层结构,其中每个节点有一个父节点和零个或多个子节点。图是一种由节点和边组成的集合,其中节点表示对象,边表示节点之间的关系。
-
集合结构:集合结构是一种无序的数据结构,其中数据元素之间没有明确的前驱和后继关系,也没有层次结构。常见的集合结构包括散列表和集合等。散列表是一种基于哈希函数实现的数据结构,它可以快速地查找、插入和删除数据元素。集合是一种无序的数据结构,其中每个元素都是唯一的。
②、物理存储结构
在计算机科学中,物理存储结构是指数据在计算机内存中的实际存储方式。常见的物理存储结构包括以下三种类型:
-
顺序存储结构:顺序存储结构是一种将数据元素按照顺序存储在一段连续的内存空间中的方式。在顺序存储结构中,每个数据元素占用相同的存储空间,可以通过下标来访问元素。常见的顺序存储结构包括数组和线性表等。
-
链式存储结构:链式存储结构是一种将数据元素存储在不连续的内存空间中的方式。在链式存储结构中,每个数据元素包含一个数据域和一个指针域,指针域指向下一个元素的地址。常见的链式存储结构包括单链表、双向链表和循环链表等。
-
索引存储结构:索引存储结构是一种将数据元素存储在不连续的内存空间中的方式,同时还维护了一个索引表,用于快速访问数据元素。在索引存储结构中,索引表中的每个元素包含一个关键字和一个指针,指针指向对应数据元素的地址。常见的索引存储结构包括B树和B+树等。
3、collection接口:
①、在Java集合框架中,Collection是一个接口,它代表一组对象,这些对象被称为元素。Collection接口提供了一些通用的方法,例如添加元素、删除元素、判断元素是否存在、获取元素数量等等。它是所有集合类的根接口,包括List、Set和Queue等。
List是一个有序的集合,它允许重复元素。List接口提供了一些特定的方法,例如按索引访问元素、在指定位置插入元素、替换指定位置的元素等等。常见的List实现类有ArrayList和LinkedList。
Set是一个不允许重复元素的集合,它保证元素的唯一性。Set接口提供了一些特定的方法,例如添加元素、删除元素、判断元素是否存在等等。常见的Set实现类有HashSet和TreeSet。
Queue是一个队列,它按照一定的顺序存储元素,并提供了一些特定的方法,例如添加元素、删除元素、获取队列头部元素等等。常见的Queue实现类有LinkedList和PriorityQueue。
总之,Collection接口和它的实现类提供了一些非常有用的数据结构,可以帮助我们更方便地管理和操作一组对象。
②、Collection接口是Java集合框架中所有集合类的根接口,它提供了一些通用的方法,包括:
③练习:
import java.util.List;
import java.util.Objects;
public class test4 {
public static void main(String[] args) {
//动态数组
List list = new ArrayList();
ArrayList list1 = new ArrayList();
list1.add("A");
list1.add("B");
list1.add("C");
list1.add(5.1);
System.out.println(list1.size());
for (Object s:list1){
System.out.println(s);
}
System.out.println(list1.get(3));
}
}
out:
4
A
B
C
5.1
5.1
上面代码中list1中存放时存在小数类型,这样会在实际中造成一些不必要的麻烦,因此我们需要限制list1中只能放一种类型;
package test.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class test4 {
public static void main(String[] args) {
//动态数组
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add(5.1); //会报错:java: 不兼容的类型: double无法转换为java.lang.String
list.add("D");
System.out.println(list.size());
for (Object s:list){
System.out.println(s);
}
System.out.println(list.get(3));
}
}
将list.add(5.1); 注释后:
out:
4
A
B
C
D
D
4、泛型:
泛型是jdk1.5的一种新特性,是一种语法糖(语法糖:看起来很美好,其实不存在)本质上只存留在语法层面,一旦编译成字节码后,泛型就要被擦除掉,还原成Object类型状态。所以java中的泛型是一种语法糖,伪泛型;
泛型本质上是一种形式化参数,它允许在编译时指定集合中元素的类型,从而提高代码的类型安全性和可读性。泛型可以应用于类、接口、方法等,它的核心思想是参数化类型。
①、泛型的定义方法:
在Java泛型中,使用尖括号<>来指定类型参数,例如List表示一个只能存储字符串类型的List集合。在定义泛型类或方法时,可以使用任意标识符来表示类型参数,例如、、等等。
public class test4 {
public static void main(String[] args) {
A<String,Integer> a = new A<String,Integer>();
}
}
//类型泛型参数
class A<C,T>{
}
//方法泛型参数
class B{
public <C> void test(C a){
}
}
②、泛型的优点包括:
-
提高代码的类型安全性:泛型可以在编译时检查类型,避免了在运行时出现类型转换异常的情况。
-
提高代码的可读性:泛型可以让代码更加清晰明了,减少了类型转换的代码。
-
提高代码的重用性:泛型可以应用于不同类型的集合,提高了代码的重用性。
③、补充:
在Java中,Integer是一个包装类,它封装了一个基本数据类型int的值,并提供了一些有用的方法来操作这个值。Integer类是final的,因此不能被继承。
Integer类提供了许多方法来操作int类型的值,例如:
-
intValue():将Integer对象转换为int类型的值。
-
compareTo(Integer anotherInteger):比较两个Integer对象的值,如果当前对象小于anotherInteger,则返回负数;如果当前对象等于anotherInteger,则返回0;如果当前对象大于anotherInteger,则返回正数。
-
parseInt(String s):将字符串s解析为int类型的值。
-
valueOf(int i):返回一个Integer对象,它封装了指定的int类型的值。
-
toString():将Integer对象转换为字符串类型的值。
-
equals(Object obj):比较当前对象和另一个对象是否相等。
-
hashCode():返回当前对象的哈希码值。
-
MAX_VALUE:表示int类型的最大值。
-
MIN_VALUE:表示int类型的最小值。
需要注意的是,由于Integer是一个包装类,因此它可以作为参数传递给方法,也可以作为返回值返回。在Java中,自动装箱和拆箱机制可以自动地将int类型的值转换为Integer对象,或将Integer对象转换为int类型的值,使得使用Integer对象更加方便。
④、作业:
加入购物车时候,如果购物车中已经存在相关商品,购物车商品购买数量累计+1
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
class ShoppingCart {
private Map<String, Integer> items;
public ShoppingCart() {
items = new HashMap<>();
}
public void addItem(String itemName) {
if (items.containsKey(itemName)) {
int currentQuantity = items.get(itemName);
items.put(itemName, currentQuantity + 1);
} else {
items.put(itemName, 1);
}
}
public Map<String, Integer> getItems() {
return items;
}