Java基础语法 - 集合
观看尚硅谷Java基础语法后的一些感想
一. 集合(Collection)
Java中的集合是一个名词,数据的一种容器,用于容纳数据
根据数据的不同,Java的集合分为2大体系:
1. 单一数据体系 :Collection
接口定义了相关的规则
2. 成对出现的数据体系 :Map
接口定义了相关的规则
所谓的成对的数据,就是2哥数据有关系,可以根据定义一个数据关联到第二个数据
也称为键值对数据 , (123123,zhangsan) => (key, value)
总结:对不确定的有关系的数据进行相同逻辑处理的场合,使用集合是一个不错的选择
二. Collection接口
常用子接口
- List : 按照插入顺路保存数据,数据可以重复
具体的实现类:ArrayList,LinkedList- Set : 集,无序保存,数据不能重复
具体的实现类 HashSet- Queue : 队列
具体的实现类: ArrayBlockingQueue
2.1 Collection - List
List
接口的一些常用方法包括:
add(E e)
: 将元素添加到列表的末尾。add(int index, E element)
: 在指定的索引位置插入元素。get(int index)
: 返回指定索引位置的元素。remove(int index)
: 移除指定索引位置的元素。set(int index, E element)
: 用指定元素替换列表中指定索引位置的元素。size()
: 返回列表中的元素数量。isEmpty()
: 如果列表不包含元素,则返回true。indexOf(Object o)
: 返回指定元素在列表中首次出现的索引,如果列表不包含该元素,则返回-1。lastIndexOf(Object o)
: 返回指定元素在列表中最后出现的索引,如果列表不包含该元素,则返回-1。subList(int fromIndex, int toIndex)
: 返回列表中指定范围的子列表视图(不创建新列表)。
下面对这些方法做一些简单的实现
代码呈现
import java.util.ArrayList;
import java.util.List;
public class ListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
// 添加元素
list.add("a");
list.add("b");
list.add("c");
// 访问元素
System.out.println(list.get(0));
// 插入元素
list.add(2, "e");
// 移除元素
list.remove(2);
// 遍历列表
for (String fruit : list) {
System.out.println(fruit);
}
}
}
运行结果
a
a
e
c
2.1.1 Collection - List - ArrayList
List接口也有一些常见的实现类,
比如ArrayList
创建对象代码如下:
ArrayList lists = newArrayList();
对象的参数可以是无参new ArrayList()
,那么底层数组就是空数组,也可以是传int类型的参数new ArrayList(3)
,用于设定底层数组的长度。
方法实现
package chapter07;
import java.util.ArrayList;
public class Java04_Collection_List_ArrayList {
public static void main(String[] args) {
// TODO 集合 - Collection - List
// ArrayList的常用方法
ArrayList lists = new ArrayList();
lists.add("zhangsan");
lists.add("lisi");
lists.add("wangwu");
lists.add("zhangsan");
//add方法可以传递2个参数,第一个参数表示数据增加的位置(索引),第二个参数表示数据
lists.add(2,"zhaoliu");
ArrayList otherList = new ArrayList();
otherList.add("1");
otherList.add("2");
otherList.add("3");
lists.addAll(otherList);
// size方法表示集合内部数据的数量
System.out.println(lists.size());
// 判断集合中的数据是否为空
System.out.println(lists.isEmpty());
// 清空集合中的数据
// lists.clear();
// 删除指定集合中的数据
lists.removeAll(otherList);
// 用于判断集合中是否存在某条数九,返回的是布尔类型的值
System.out.println(lists.contains("zhangsan"));
// 用于获取数据在索引中第一个的位置,如果数据不存在,那么返回-1
// System.out.println(lists.indexOf("wangwu123"));
System.out.println(lists.indexOf("zhangsan"));
System.out.println(lists.lastIndexOf("zhangsan"));
// 把集合变成数组
Object[] objects = lists.toArray();
// 复制新集合
Object clone = lists.clone();
ArrayList list1 = (ArrayList) clone;
System.out.println(lists);
System.out.println(list1);
}
}
运行结果
8
false
true
0
4
[zhangsan, lisi, zhaoliu, wangwu, zhangsan]
[zhangsan, lisi, zhaoliu, wangwu, zhangsan]
2.1.2. Collection - List - LinkedList
看了尚硅谷的课,感觉LinkedList
的逻辑其实和c中的链表差不多。
常用方法
package chapter07;
import java.util.LinkedList;
public class Java05_Collection_List_LinkedList_1 {
public static void main(String[] args) {
// TODO 集合 - Collection - List
// LinkedList : Linked(连接) + List
// 构建集合对象
LinkedList list = new LinkedList();
// 追加数据
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
// 向指定位置增加数据
list.add(1,"zhaoliu");
list.addFirst("1");
list.addLast("2");
LinkedList list1 = new LinkedList();
list1.add("zhangsan1");
list1.add("lisi1");
list1.add("wangwu1");
list.addAll(list1);
System.out.println(list.remove("1"));
// System.out.println(list.remove()); // 删除第一个
// list.removeFirst();
// list.removeLast();
// list.remove(1);
System.out.println(list.size());
System.out.println(list.isEmpty());
// list.clear();
// list.contains("1");
// list.element(); // 获取第一个数据
// list.indexOf("");
// list.lastIndexOf("");
list.push("aaa"); // 添加数据
System.out.println(list.pop()); // 弹出数据
System.out.println(list);
}
}
运行结果
true
8
false
aaa
[zhangsan, zhaoliu, lisi, wangwu, 2, zhangsan1, lisi1, wangwu1]
2.2. Collection - Set
HashSet
底层数据结构为 :数据 + 链表
Set集合实现通常提供了添加、删除、查找和遍历元素等操作,但不允许有重复的元素,且输出的顺序可能不同。
案例
import java.util.HashSet;
HashSet<Integer> mySet = new HashSet<>();
mySet.add(1);
mySet.add(2);
mySet.add(3);
mySet.add(3); // 这行不会添加任何新元素,因为集合不允许重复
System.out.println(mySet); // 输出可能类似于: [1, 2, 3] (但顺序可能不同)
2.3 Collection - Map
在Java中,Map是一个接口,它描述了将键(key)映射到值(value)的对象。Map不允许出现重复的键;每个键最多只能映射到一个值。Map接口在java.util包中定义,并且Java标准库提供了几种实现,包括HashMap、LinkedHashMap、TreeMap和Hashtable等。
常用的增删查改方法
HashMap map = new HashMap();
// 添加数据:put
// 修改数据,put方法也可以修改数据,返回值就是被修改的数据
map.put("zhangsan","1");
map.put("lisi","2");
map.put("wangwu","3");
map.put("zhangsan","4");
// TODO 查询数据
System.out.println(map.get("zhangsan"));// 4
// TODO 删除数据
System.out.println(map.remove("zhangsan"));
System.out.println(map);
运行结果
4
4
{lisi=2, wangwu=3}
这里可以看到,我们添加了两个张三,为什么查询的时候,输出的是4,不是1?
答:因为在Map的实现中,它的key
是唯一的,所以当出现两个相同的
key值是,第二个会把第一个覆盖掉,就相当于做了一次修改的操作,修改了它们的value值,map.get()
方法也会返回最新给定的与键相关联的值。
HashMap 和 Hashtable 的区别
1. 实现方式不一样 : 继承的父类不一样
HashMap继承的父类是AbstractMap Hashtable继承的父类是Dictionary
2. 底层结构的容量不同: HashMap(16), Hashtable(11)
3. HashMap的k,v都可以为null, Hashtable的k,v不能是null
4. HashMap的数据定位采用的是Hash算法, 但是Hashtable采用的就是hashcode
5. HashMap的性能较高, 但是Hashtable较低