BigInteger

package APIlearn;

import java.math.BigDecimal;
import java.math.BigInteger;

public class Intergertest {
    public static void main(String[] args) {
//Integer-learning
        Integer i = Integer.valueOf("200");
        System.out.println(i);

        int num = i.intValue();
        System.out.println(num);
        //字符串转化为整数,不能有字母
        int num2 = Integer.parseInt("123");
        System.out.println(num2);
        //十转二
        String Str1 = Integer.toBinaryString(18);
        System.out.println(Str1);
        //十转八
        String Str3 = Integer.toOctalString(26);
        System.out.println(Str3);
//bigInteger-learning
        //创建对象,构造,无限长
        BigInteger b1 = new BigInteger("134");
        System.out.println(b1);
        //静态方法获取对象,有限长度long
        BigInteger b2 = BigInteger.valueOf(134);
        System.out.println(b1 == b2);//false
//成员方法,知道即可

        //BigDecimal
        char[] c1 = {'1', '2', '3'};
        BigDecimal bd1 = new BigDecimal(c1);
        System.out.println(bd1);
        BigDecimal bd2 = new BigDecimal("1.3");
        System.out.println(bd2);
        //静态方法
        BigDecimal bd3 = BigDecimal.valueOf(134.78);
    }
}

匿名内部类

package APIlearn;

public class innertest {
    public static void main(String[] args) {
        //匿名内部类
        new Swim(){

            @Override
            public void swim() {
                System.out.println("重写了游泳的方法");
            }
        };
        //继承关系
        new Animal(){
            @Override
            //方法的重写
            public void eat() {
                //super.eat();
                System.out.println("重写了eat方法");
            }
        };
//        Dog d=new Dog();
//        method(d);
        //dog类我只要用一次,那么还需要单独定义一个类太麻烦
        method(
                new Animal() {
                    @Override
                    public void eat() {
                        System.out.println("狗吃骨头");
                    }
                }


        );
       
    }
    //要自己写一个子类

        public static void  method(Animal a){
            a.eat();
        }

}
package APIlearn;

public abstract class Animal {
    public void eat(){}

}
package APIlearn;

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
}
package APIlearn;

public interface Swim {
     public abstract void swim();

}
package APIlearn;

public class Person implements Swim{

    @Override
    public void swim() {
        System.out.println("重写游泳的方法");
    }
}

lambda表达式:

前置知识:

Java集合框架方法体系详解

完全可以,这些方法不是凭空冒出来的,它们都属于 Java 集合框架(Java Collections Framework, JCF)这套完整的体系里。我从「顶层设计 → 分层职责 → 具体方法来源」给你串一遍,你就能清楚它们从哪来、为什么存在、各自属于哪一层。


一、先搭整体框架:集合相关的东西分两大类

你接触到的所有集合相关代码,本质就两类,先把这个边界分清:

类别

作用

代表例子

调用方式

集合本身(容器)

存数据、管理数据

List、ArrayList、Set、HashMap

对象.方法(),比如 fruits.add(...)

集合工具 / 扩展能力

对容器做通用操作

Collections 工具类、接口默认方法

工具类:Collections.xxx(集合); 默认方法:集合.xxx()

你困惑的两个方法刚好分属两类:

  • fruits.forEach() → 属于集合自身继承来的默认方法

  • Collections.sort() → 属于外部工具类提供的静态方法

下面我们从上到下捋清楚每一层的职责,你就知道它们为什么会出现。


二、第一大类:集合自身的方法体系(层层继承而来)

Java 的集合是严格的接口继承体系,方法是从上往下一层层继承下来的,不是每个类自己随便加的。核心继承链:

Iterable(最顶层:可遍历) ↓ 继承 Collection(通用集合:增删改查) ↓ 继承 List / Set / Queue(三大分支,各有特性) ↓ 实现 ArrayList / LinkedList / HashSet...(具体实现类)

每一层接口只定义自己这一层该有的能力,下层自动继承上层的所有方法。

1. 最顶层:Iterable 接口 —— 定义「能被遍历」的能力

  • 职责:只要实现了这个接口,就代表「这个东西可以被循环遍历」。

  • 原生核心方法:iterator() —— 返回一个迭代器,用来逐个取元素。

  • Java 8 新增默认方法:forEach() 这就是你看到的 fruits.forEach() 的来源!

因为 Iterable 是所有集合的顶层父接口,所以所有 List、Set 集合天生就带 forEach 方法,不是 ArrayList 自己写的,是从最顶层继承下来的。

  • 设计目的:把「循环遍历每个元素」的模板代码统一封装好,使用者只需要传「每个元素做什么」的逻辑。

  • 方法参数:Consumer<T> 函数式接口 → 所以可以传 Lambda 表达式。

2. 第二层:Collection 接口 —— 定义所有集合的通用能力

  • 职责:定义所有集合都具备的基础操作,和具体是 List 还是 Set 无关。

  • 核心方法(你天天会用到):

    • add() / remove() / clear():增删

    • size() / isEmpty() / contains():查询判断

    • toArray():转数组

这些方法所有集合都有,就是因为继承自 Collection。

3. 第三层:List 接口 —— 有序、可重复集合的专属能力

  • 职责:在通用集合能力之上,增加「有序、按索引访问」的专属特性。

  • 特有方法:

    • get(int index) / set(int index, E element):按索引读写

    • add(int index, E element):按位置插入

    • sort(Comparator c):Java 8 新增,自己就可以排序

也就是说,从 Java 8 开始,List 自己就带 sort 方法了,你可以直接写 fruits.sort(比较器),不一定非要用 Collections.sort。

4. 第四层:具体实现类 —— 真正落地的容器

比如 ArrayList、LinkedList、HashSet,它们负责把上面接口定义的方法真正实现出来,各自用不同的数据结构(数组、链表、哈希表),性能特点不同。


三、第二大类:Collections 工具类 —— 集合的「公共工具箱」

1. 它是什么

java.util.Collections 是一个纯静态工具类(构造方法私有,不能实例化),它自己不存任何数据,专门给各类集合提供通用的、公共的操作方法。

2. 为什么要单独搞一个工具类?

这是早期 Java 的设计习惯:

  • 接口只能定义方法声明,不能写实现代码(Java 8 之前没有 default 方法)

  • 很多操作是所有 List 通用的(比如排序、反转、找最大值),如果每个实现类都写一遍,代码严重重复

  • 所以把这些通用操作抽出来,做成一个公共工具类,所有集合都可以调用

这就是 Collections.sort() 的由来 —— 它不是集合的方法,是工具箱里专门给 List 做排序的工具函数。

3. Collections 里常用的方法(都是静态方法,调用格式统一)

Collections.方法名(集合, 可选参数)

常用的几类:

  • 排序相关:sort()、reverse()(反转)、shuffle()(打乱顺序)

  • 查找极值:max()、min()

  • 替换填充:fill()、replaceAll()

  • 安全相关:synchronizedList()(把普通集合变成线程安全的)

4. 补充:Collections.sort 和 List.sort 的关系

Java 8 之后 List 自己加了 sort 默认方法,两者的关系是:

  • 老写法:Collections.sort(list, 比较器)

  • 新写法:list.sort(比较器)

  • 底层关系:现在 Collections.sort 内部其实就是直接调用 list.sort(),属于兼容老代码的历史写法


四、把你问的两个方法放回体系里

1. fruits.forEach()

  • 归属:Iterable 接口的默认方法,被 List 继承下来

  • 为什么会有:Java 8 为了配合函数式编程,给最顶层的可遍历接口统一增加了遍历方法,避免每个集合自己写循环

  • 参数为什么能写 Lambda:方法参数是 Consumer<T> 函数式接口,符合单抽象方法规则

2. Collections.sort()

  • 归属:Collections 工具类的静态方法

  • 为什么会有:早期 Java 接口不能写实现,排序这种通用操作只能放在工具类里,是历史遗留的经典写法

  • 参数为什么能写 Lambda:第二个参数是 Comparator<T> 函数式接口


五、新手学习的体系化顺序建议

按这个顺序学,就不会觉得知识点是零散冒出来的:

  1. 先记整体继承树:Iterable → Collection → List/Set → 实现类

  2. 学每层接口的核心职责和常用方法(从上往下学)

  3. 学 Collections 工具类的通用操作

  4. 学 Java 8 新增:forEach、List.sort、Stream 流

  5. 最后深入每个实现类的底层数据结构和性能区别


六、一个最容易搞混的点再强调一遍

  • Collection(单数):是集合的顶层父接口,代表「集合」这个抽象概念

  • Collections(复数,带 s):是操作集合的工具类,全是静态方法

Java List 集合常用方法分类速查清单

下面直接为你整理好完整的速查内容,每个方法同时标注它在集合继承体系中的归属,呼应前面讲的层级逻辑:

一、增:添加元素(2 个)

  1. boolean add(E e)

    1. 归属:Collection 接口(所有集合通用)

    2. 作用:在集合末尾追加一个元素

    3. 示例:fruits.add("grape");

  2. void add(int index, E element)

    1. 归属:List 接口(List 特有,有序集合才有索引)

    2. 作用:在指定索引位置插入元素,后续元素整体后移

    3. 示例:fruits.add(1, "mango");

二、删:删除元素(3 个)

  1. E remove(int index)

    1. 归属:List 接口

    2. 作用:删除指定索引位置的元素,返回被删除的元素

    3. 示例:fruits.remove(0);

  2. boolean remove(Object o)

    1. 归属:Collection 接口

    2. 作用:删除集合中第一个匹配的指定元素,删除成功返回 true

    3. 示例:fruits.remove("apple");

  3. void clear()

    1. 归属:Collection 接口

    2. 作用:清空集合中所有元素

    3. 示例:fruits.clear();

三、改:修改元素(1 个)

  1. E set(int index, E element)

    1. 归属:List 接口

    2. 作用:替换指定索引位置的元素,返回被替换的旧元素

    3. 示例:fruits.set(0, "peach");

四、查:查询与判断(3 个)

  1. E get(int index)

    1. 归属:List 接口

    2. 作用:根据索引获取对应位置的元素

    3. 示例:String first = fruits.get(0);

  2. int size() / boolean isEmpty()

    1. 归属:Collection 接口

    2. 作用:分别获取集合元素个数、判断集合是否为空

    3. 示例:

      int num = fruits.size(); boolean empty = fruits.isEmpty();

  3. boolean contains(Object o)

    1. 归属:Collection 接口

    2. 作用:判断集合中是否包含指定元素

    3. 示例:boolean hasApple = fruits.contains("apple");

五、遍历:循环处理元素(1 个)

  1. void forEach(Consumer<? super E> action)

    1. 归属:Iterable 接口(最顶层,所有可遍历集合通用)

    2. 作用:遍历集合每个元素,执行自定义逻辑,支持 Lambda 表达式

    3. 示例:fruits.forEach(s -> System.out.println(s));

六、排序:自定义排序(1 个)

  1. void sort(Comparator<? super E> c)

    1. 归属:List 接口(Java 8 新增默认方法)

    2. 作用:按指定比较规则对集合元素排序

    3. 示例:fruits.sort((s1, s2) -> s1.length() - s2.length());

以上方法覆盖了 List 绝大多数日常操作,其中标注「Collection 归属」的方法,Set 等其他集合也同样拥有;标注「List 归属」的,只有 List 系列有序集合可以使用。

lambda 举例

List<String> list = new ArrayList<>(List.of("apple", "banana", "pear", "orange"));

list.sort(new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        // 升序:前减后;降序反过来
        return s1.length() - s2.length();
    }
});
list.sort((String s1, String s2) -> {
    return s1.length() - s2.length();
});

练习题

1.排序comparator接口

package APIlearn;

import java.util.Arrays;
import java.util.Comparator;

public class test10 {


    public static void main(String[] args) {
        Boys b1=new Boys("zhang",19,178);
        Boys b3=new Boys("wang",20,179);
        Boys b2=new Boys("li",30,189);
        Boys[] arr={b1,b2,b3};
//
//        Arrays.sort(arr,new Comparator<Boys>(){
//          @Override
//          public int compare(Boys bb1,Boys bb2){
//            double  temp=bb1.getAge()-bb2.getAge();
//           temp= temp ==0? bb1.getHeight()-bb2.getHeight() : temp ;
//
//            temp=temp==0?bb1.getName().compareTo(bb2.getName()):temp;
//
//
//            if(temp>0)return 1;
//            else if(temp<0)return -1;
//              else return 0;
//
//          }
//
//
//        });
//
//        Arrays.sort(arr,(Boys bb1,Boys bb2)->{
//                double  temp=bb1.getAge()-bb2.getAge();
//                temp= temp ==0? bb1.getHeight()-bb2.getHeight() : temp ;
//
//                temp=temp==0?bb1.getName().compareTo(bb2.getName()):temp;
//
//
//                if(temp>0)return 1;
//                else if(temp<0)return -1;
//                else return 0;
//
//
//
//
//        });


        Arrays.sort(arr,(bb1, bb2)->{
            double  temp=bb1.getAge()-bb2.getAge();
            temp= temp ==0? bb1.getHeight()-bb2.getHeight() : temp ;

            temp=temp==0?bb1.getName().compareTo(bb2.getName()):temp;


            if(temp>0)return 1;
            else if(temp<0)return -1;
            else return 0;




        });


        System.out.println(Arrays.toString(arr));
    }

}

2.神兔

package APIlearn;

public class tset11 {
    public static void main(String[] args) {
//        int [] arr=new int[12];
//        arr[0]=1;
//        arr[1]=1;
//        for (int i = 2; i < arr.length; i++) {
//            arr[i]=arr[i-1]+arr[i-2];
//        }
//        System.out.println(arr[11]);

        //递归的方法
        //1.递归的出口
        //2.找到递归的规律
        //Fn(12)=Fn(10)+Fn(11)
        System.out.println(getSum(12));;
    }
    public static int getSum(int month){
        if(month==1||month==2)return 1;
       return getSum(month-1)+getSum(month-2);
    }
}

3.递归

package APIlearn;

public class test12 {
    public static void main(String[] args) {
        System.out.println(getCount(1));
    }
    public static int getCount(int day){
        if(day>=11 ||day<=0){
            System.out.println("时间错误");
            return -1;
        }
        //递归的出口
        if(day==10){
            return 1;
        }
        return (getCount(day+1)+1)*2;
    }
}

更多推荐