Java必须知道的一般用法 publicclassMyArrayList为什么使用 / Java必须知道的一般用法 publicclassMyArrayList为什么使用

 public class PrinterVar {    //该方法接收一个T类型的变量,打印并返回该变量    public  T print(T var) {        System.out.println(var);        return var;    }    public static void main(String[] args) {        PrinterVar printerVar = new PrinterVar();        String var = printerVar.print("aa");//String类型        Integer var1 = printerVar.print(12);//int类型        System.out.println(var + " " + var1);    }

其实,当类是普通类时,我们仍然能够使用泛型方法。下面是一个例子:

当我们声明了一个泛型类后,可以很自然地在类内部使用泛型方法。

泛型方法
 f(3) = 3*3+1 = 10

该过程就相当于向数学函数中代入数值:

 MyArrayList myArrayList = new MyArrayList(4);

当我们需要实例化泛型类时,就使用具体的类型来替换类型变量(T):

 public class MyClass  {    //......}

当然,一个泛型类可以有多个类型变量:

 private T[] elementData;public void add(T o) {    //.......}public T get(int index) {//......}

泛型类中的成员变量、方法参数和返回值的类型都使用类型变量代替:

类型变量的名称可以随便取,一般使用大写字母表示,比如E、K、V、T等。

 f(x) = 3x + 1

如何理解类型变量?它就类似于数学中函数中的变量x,用来代替具体的值:

 public class MyArrayList  {    //......}

泛型类的声明方式:引入一个类型变量,如T,然后使用将其括起来,放在类名后。

经过改造,我们把MyArrayList类改为了一个泛型类,它是一个具有多个类型变量的类。

 public class Test {    public static void main(String[] args) {        //myArrayList 给int元素使用        MyArrayList myArrayList = new MyArrayList(4);        myArrayList.add(111); //向数组中添加3个int元素//        myArrayList.add("222"); //添加非Integer元素报错        int i = myArrayList.get(1); //无需强制转型        System.out.println(i);      }}

测试:

 public class MyArrayList  {    private T[] elementData;    private int size = 0;    public MyArrayList(int capacity) {        elementData = (T[]) new Object[capacity];    }    public void add(T o) { //向数组中添加元素        if (size == elementData.length) {            throw new IndexOutOfBoundsException("数组已满");        }        elementData[size++] = o;    }    public T get(int index) { //从数组中获取元素        if (index  size - 1) {            throw new IndexOutOfBoundsException("超出范围");        }        return elementData[index];    }    @Override    public String toString() {        return "MyArrayList{" +                "elementData=" + Arrays.toString(elementData) +                '}';    }}

使用泛型改造MyArrayList:

泛型类

有!用泛型!

那这个问题有没有解决办法呢?

 int i = (int)myArrayList.get(1); //本来是String类型的值,但我提前不知道,拿int变量接收,报错

这就导致了当我们从数组中获取某个元素时,很难知道它的确切类型,往往会强转类型失败。

myArrayList.add(111); //int类型myArrayList.add("222"); //String类型myArrayList.add(true); //布尔类型

第二:同一个数组可以添加各种类型的元素。

int i = (int) myArrayList.get(0);

第一:从数组中获取元素时,需要强制转换类型才行。

但是这样又出现了两个问题:

发现可以向数组中添加和获取int或String类型的元素,这证明该类的数组和方法同时对各种类型的数据都有用,不必再添加额外代码。

public class Test {    public static void main(String[] args) {        //myArrayList 给int元素使用        MyArrayList myArrayList = new MyArrayList(4);        myArrayList.add(111); //向数组中添加3个int元素        myArrayList.add(222);        myArrayList.add(333);        int i = (int) myArrayList.get(0); //获取        System.out.println(i);        //myArrayList 给String元素使用        MyArrayList myArrayList1 = new MyArrayList(4);        myArrayList1.add("aaa");        myArrayList1.add("bbb");        myArrayList1.add("ccc");        String str = (String) myArrayList1.get(1);        System.out.println(str);    }}

再测试一下:

public class MyArrayList {    private Object[] elementData;     private int size = 0;    public MyArrayList(int capacity) {        elementData = new Object[capacity];    }    public void add(Object o) { //向数组中添加元素        if (size == elementData.length) {            throw new IndexOutOfBoundsException("数组已满");        }        elementData[size++] = o;    }    public Object get(int index) { //从数组中获取元素        if (index  size - 1) {            throw new IndexOutOfBoundsException("超出范围");        }        return elementData[index];    }    @Override    public String toString() {        return "MyArrayList{" +                "elementData=" + Arrays.toString(elementData) +                '}';    }}

我们知道,Object类是所有类的父类,Object类型的变量能够引用任何类型的对象。所以可以将类型改为Object:

这样太麻烦了!有没有解决办法?有!

此时,就得需要再写一份代码,该份代码较之前的并无大修改,只是把int改为String。如果场景继续变怎么办?那就再写一份新代码!

很显然,继续使用该类会报错,报错的原因很简单:我们向数组中添加的元素是String类型的,而数组和方法参数类型是int类型。

但是如果我们的场景不再需要int类型的元素,而是需要String类型的,那怎么办?

向数组中添加3个int类型的元素并能获取,这没问题。

public class Test {    public static void main(String[] args) {        MyArrayList myArrayList = new MyArrayList(4);        myArrayList.add(111); //向数组中添加3个int元素        myArrayList.add(222);        myArrayList.add(333);        int i = myArrayList.get(0); //获取        System.out.println(i);//以上正常运行        myArrayList.add("行小观"); //添加一个String元素,类型不匹配,报错    }}

下面测试一下:

该类很简单:有两个成员变量,elementData是一个数组,size是数组中元素的数量。add和get方法能添加和获取元素。

public class MyArrayList {    private int[] elementData;    private int size = 0;    public MyArrayList(int capacity) {        elementData = new int[capacity];    }    //向数组中添加元素    public void add(int i) {         if (size == elementData.length) {            throw new IndexOutOfBoundsException("数组已满");        }        elementData[size++] = i;    }    //从数组中根据下标获取元素    public int get(int index) {         if (index  size - 1) {            throw new IndexOutOfBoundsException("超出范围");        }        return elementData[index];    }    @Override    public String toString() {        return "MyArrayList{" +                "elementData=" + Arrays.toString(elementData) +                '}';    }}

为了说明问题,本类写的尽量简陋,请把目光主要放在类型上。

看下面一个例子:

为什么使用泛型

文章:

在移动应用开发领域,iOS平台一直以其卓越的性能和用户体验而闻名。无论是为iPhone、iPad还是其他苹果设备开发应用程序,了解iOS开发者选项是提升开发效率的关键。本文将介绍iOS开发者选项的重要性,并讨论如何充分利用这一秘密武器。

iOS开发者选项是一组隐藏的设置,旨在帮助开发人员调试和优化应用程序。默认情况下,这些选项在设备设置中是隐藏的,只有通过一些简单的步骤才能启用它们。一旦开发者选项启用,您将获得许多有用的功能和工具,使您能够更好地理解和优化您的应用程序。

首先,iOS开发者选项提供了详细的性能分析工具。您可以使用这些工具来监测应用程序的运行状态,包括CPU使用率、内存占用和电池消耗等指标。这些数据对于优化应用程序的性能和效率至关重要。通过分析性能数据,您可以找出潜在的问题,并采取适当的措施来改进应用程序的响应速度和资源利用率。

其次,iOS开发者选项还提供了调试和测试应用程序的强大功能。您可以启用调试模式,获得更详细的错误日志和堆栈跟踪信息,从而更容易定位和修复应用程序中的bug。此外,开发者选项还允许您模拟不同的网络环境和硬件配置,以确保您的应用程序在各种条件下都能正常运行。

除了调试和性能优化之外,iOS开发者选项还提供了一些高级功能,可以帮助您更好地了解和探索iOS平台。例如,您可以启用"显示触摸"选项,在屏幕上显示出用户的触摸位置,这对于用户交互设计和调试来说非常有用。此外,您还可以查看应用程序的视图层次结构,以便更好地理解和修改应用程序的界面。