目的:
今天来学习和了解Java中的集合概念。
技术:
- Collection抽象接口
- Map(集合)接口
- List接口
- Set"集合"
技术实际运用:
- List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
- Set下有HashSet,LinkedHashSet,TreeSet
- List下有ArrayList,Vector,LinkedList
- Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
在Java中,数组可以储存多个对象 。可以这样来定义它:
int[] score={1,2,3};
int[] score=new int[10];
我们通常在定义数组的时候,就会给数组里面赋值,把它的内容确定下来。但这样的数组却有一个弊端,那就是数组长度不可边,内容可变。
我们在实际开发中需要一个随时能够改变的数组。此时,就可以用到Java中的集合——collection
- 集合表示一组被称为其元素的对象。 一些集合允许重复元素,而其他集合不允许。
public class MyClass {
public static void main(String[] args) {
//Collection接口的方法
Collection<String> t1 = new ArrayList();
t1.add("Jack");
t1.add("Marry");
System.out.println(t1);
//删除一个对象
t1.remove("Jack");
System.out.println(t1);
//获取元素个数
System.out.println(t1.size());
//判断是否包含一个元素,可用contains来操作
if (t1.contains("Marry")){
System.out.println("有Marry");
}else{
System.out.println("没有Marry");
}
//判断是否为空
if(t1.isEmpty()){
System.out.println("is empty");
}else{
System.out.println("not empty");
}
//判断两个集合是否相同
Collection<String> t2=new ArrayList<>();
t2.add("Jack");
t2.add("Marry");
if (t1.equals(t2)){
System.out.println("两个集合相同");
}else{
System.out.println("两个集合不相同");
}
//清空
t1.clear();
System.out.println(t2);
在集合中的元素是可以变化的。
- 添加元素 add addAll
- 删除元素 remove():删除一个对象
- 插入元素
- 访问元素
- 获取元素个数 size
- 是否包含一个元素 contains
- 是否为空 isEmpty
- 集合比较 equals
- 清空 clear
集合的遍历
1.使用Iterator来遍历
//hasNext 判断是否有元素
//next 获取下一个对象
//remove 删除当前遍历过后的对象
迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。
Iterator iterator=t2.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
while (iterator.next()!=null){
System.out.println(iterator.next());
}
2.for-each 增强for循环
for (String obj:t2){
System.out.println(obj);
}
3.for-i
for (int i=0; i < t2.size(); i++){
System.out.println(((ArrayList<String>) t2));
}
List接口
List接口 extends Collection
有序集合(也称为序列 )。 该界面的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。
与集合不同,列表通常允许重复的元素。 更正式地,列表通常允许元素e1和e2成对使得e1.equals(e2) ,并且如果它们允许空元素,它们通常允许多个空元素。 有人可能希望实现一个禁止重复的列表,当用户尝试插入时会抛出运行时异常,但是我们预计这种使用是罕见的。
该List接口放置额外的约定,超过在Collection指定接口上的iterator,add,remove,equals和hashCode方法合同。 其他继承方法的声明也包括在这里以方便。
- ArrayList和 LinkedArrayList
它们一个是Array(动态数组)的数据结构,一个是Link(链表)的数据结构,此外,它们两个都是对List接口的实现。
前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列 - ArrayList: 可调整大小的数组的实现List接口。 实现所有可选列表操作,并允许所有元素,包括null 。 除了实现List 接口之外,该类还提供了一些方法来操纵内部使用的存储列表的数组的大小。 (这个类是大致相当于Vector,不同之处在于它是不同步的)。
每个ArrayList实例都有一个容量 。 容量是用于存储列表中的元素的数组的大小。 它总是至少与列表大小一样大。 当元素添加到ArrayList时,其容量会自动增长。 - LinkedArrayList:
ArrayList<Integer> score = new ArrayList<>();
score.add(2);
score.add(3);//在末尾添加
score.add(0,1);//在指定位置插入
//访问指定元素
score.get(1);
//修改一个指定元素
score.set(0,0);
System.out.println(score);
//删除指定元素
score.remove((Integer) 2);//删除指定位置的对象
System.out.println(score);
score.clear();//删除所有 清空
System.out.println(score);
ArrayList<Integer> a2 =new ArrayList<>();
a2.add(1);
a2.add(2);
a2.add(3);
//将一个集合里面的内容添加到当前集合中
score.addAll(a2);
System.out.println(score);
ArrayList<Integer> a3 = new ArrayList<>();
a3.add(1);
a3.add(2);
score.retainAll(a3);//去两个集合的交集
System.out.println(score);
//访问某个对象在集合里面的索引
ArrayList<Integer> a4 = new ArrayList<>();
a4.add(1);
a4.add(2);
a4.add(2);
a4.add(4);
System.out.println(a4.indexOf(1));//第一次出现的位置
System.out.println(a4.lastIndexOf(2));//最后一次出现的位置
//集合里面只能存放对象
//byte char int long float double boolean
//包装4类
//Byte Char Int Long Float Double Boolean
//自动将基本数据类型包装为对应的类
有时候在一些Dmeo中就需要把将ArrayList转化为普通数组。那么怎样来进行转换呢。
Integer[] objects = new Integer[a4.size()];
a4.toArray(objects);
for (Integer i:objects){
System.out.println(i);
}
Iterator iterator =a4.iterator();//遍历数组
while (iterator.hasNext()){
System.out.println(iterator.next());
}
删除某个范围内的对象
block
Lambda表达式
return (var1) -> {
return !this.test(var1); };
return 20;
获取集合某个 范围内的子集和
List<Integer> integers=a4.subList(1,3);
System.out.println(integers);
ArrayList<Integer> nums= new ArrayList<>();
nums.add(1);
nums.add(2);
nums.add(3);
nums.add(4);

表达式
// nums.removeIf(obj -> obj % 2 == 0);
for (int i=0; i< nums.size(); i++) {
Integer obj = nums.get(i);
if (obj % 2 == 0) {
nums.remove(i);
}
}
System.out.println(nums);
闭包 Closure(就是Lambda表达式把函数作为一个方法的参数)
class ArrayClass{
public void test(int[] target,Show s){
for (int element:target){
s.customShow(element);
}
//必须是接口,这个接口里面只有一个方法(这里就像我们做一件事情做不了,就需要通过其他的人来做)
interface Show{
void customShow(int element);
}
怎么去使用上面的方法呢,也就是 test方法。
1.使用方式:定义一个类实现接口
ArrayClass ac= new ArrayClass();
int[] num={1,2,3,4,5,6};
yjxClass yc= new yjxClass();
ac.test(num,yc);//这里让yc去把这个数组里面的内容弄出来,也就是把对象告诉它,在它执行的时候,就去照这个对象
//2.使用匿名类
ArrayClass ac= new ArrayClass();
int[] num={1,2,3,4,5,6};
ac.test(num, new Show() {
@Override
public void customShow(int element) {
System.out.println(element);
}
});
//3.
ArrayClass ac= new ArrayClass();
int[] num={1,2,3,4,5,6};
ac.test(num,(int element)->{
System.out.println(element);
});
//5.如果代码块里面只有一行语句 ,大括号可以省略
ArrayClass ac= new ArrayClass();
int[] num={1,2,3,4,5,6};
ac.test(num,element -> System.out.println(element));
继承这个yc接口 ac.test(num,yc);
class yjxClass implements Show{
@Override
public void customShow(int element) {
System.out.println(element);
}
}
总结:今天讲得有点多了,一下搞不过来。有点枯燥乏味,但还是要学的,只能加油了。