GVKun编程网logo

如何将新元素添加到 Java 二维数组中的下一个空索引?(java向二维数组添加数据)

2

本文将介绍如何将新元素添加到Java二维数组中的下一个空索引?的详细情况,特别是关于java向二维数组添加数据的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉

本文将介绍如何将新元素添加到 Java 二维数组中的下一个空索引?的详细情况,特别是关于java向二维数组添加数据的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于4-1 如何定义 Java 中的方法;Java 中无参无返回值方法的使用;Java 中无参带返回值方法的使用;、5-2 Java 中的 static 使用之静态变量 ;;Java 中的 static 使用之静态方法;;Java 中的 static 使用之静态初始化块、ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]、Error:java: Internal compiler error: java.lang.Exception: java.lang.NoClassDefFoundError 解决的知识。

本文目录一览:

如何将新元素添加到 Java 二维数组中的下一个空索引?(java向二维数组添加数据)

如何将新元素添加到 Java 二维数组中的下一个空索引?(java向二维数组添加数据)

如何解决如何将新元素添加到 Java 二维数组中的下一个空索引?

我有一个数组:

  1. String[][] ProductAllData1 = new String[10][6]; //This array takes input 10 times

这个数组通常会得到一个像 {"John","Mary","Bonny","Sadie","Dutch","Arthur"}

这样的输入

我的问题是如何在数组的下一个空索引上插入另一个这样的输入?

我认为可能需要一个递增的索引,但我不知道如何在下一次迭代中使用 for 循环(就像每次迭代一样,一个新的输入将被插入到下一次空索引。

解决方法

正如您所说,使用 for 循环并有一个循环变量,每次迭代都会增加。使用这个变量作为数组的索引。

  1. for(int i=0;i<size;i++){
  2. String[] input = null; // replace this null with the input
  3. array[i] = input;
  4. }

您可以使用具有不同循环变量的类似循环来获取 input 数组的元素

,

数组被定义为一个 String[][],有 10 行,每行有 6 个元素。

提供的第一行有六个名称。

如果数组必须有另外 9 个元素,您需要一种方法来增加第一个索引。最简单的方法是使用变量。

  1. String[][] arr = new String[10][6];
  2. boolean moreInput = true;
  3. for (int i = 0; i < 10 && moreInput; i++) {
  4. arr[i] = ... ; // get the input you need for index i
  5. moreInput = ... ; // ask the user or whatever process it is that is populating the array if there is more input to read into the array
  6. }
,

您需要遍历外部数组并找到具有空内部数组的下一个元素。您可以通过测试外部元素是指向 null 还是指向没有元素的数组来实现这一点。

  1. for (int i = 0; i < ProductAllData1.length; i++) {
  2. if (ProductAllData1[i] == null || ProductAllData1[i].length == 0) {
  3. ProductAllData[i] = inputArray;
  4. }
  5. }
  • ProductAllData1[i] == null -> 外层元素什么都没有
  • ProductAllData1[i].length == 0 -> 外部元素指向一个没有元素的内部数组

4-1 如何定义 Java 中的方法;Java 中无参无返回值方法的使用;Java 中无参带返回值方法的使用;

4-1 如何定义 Java 中的方法;Java 中无参无返回值方法的使用;Java 中无参带返回值方法的使用;

1.一般情况下,定义一个方法的语法是:

访问修饰符 返回值类型 方法名(参数列表){
方法体
}

1、 访问修饰符:方法允许被访问的权限范围, 可以是 public、protected、private 甚至可以省略 ,其中 public 表示该方法可以被其他任何代码调用,其他几种修饰符的使用在后面章节中会详细讲解滴

2、 返回值类型:方法返回值的类型,如果方法不返回任何值,则返回值类型指定为 void ;如果方法具有返回值,则需要指定返回值的类型,并且在方法体中使用 return 语句返回值

3、 方法名:定义的方法的名字,必须使用合法的标识符

4、 参数列表:传递给方法的参数列表,参数可以有多个,多个参数间以逗号隔开,每个参数由参数类型和参数名组成,以空格隔开 

根据方法是否带参、是否带返回值,可将方法分为四类:

Ø 无参无返回值方法

Ø 无参带返回值方法

Ø 带参无返回值方法

Ø 带参带返回值方法

public class HelloWorld {
    
    //定义了一个方法名为 print 的方法,实现输出信息功能
    public void print() {
        System.out.println("Hello World");
    }
    
    public static void main(String[] args){
        
        //在 main 方法中调用 print 方法
        HelloWorld test=new HelloWorld();
        test.print();
    }
}

2.Java 中无参无返回值方法的使用(如果方法不包含参数,且没有返回值,称为无参无返回值的方法。

方法的使用分两步

例如:下面代码定义了一个方法名为 show ,没有参数,且没有返回值的方法,执行的操作为输出 “ welcome to imooc. ”

注意:

1、 方法体放在一对大括号中,实现特定的操作

2、 方法名主要在调用这个方法时使用,需要注意命名的规范,一般采用第一个单词首字母小写,其它单词首字母大写的形式

第二步,调用方法

当需要调用方法执行某个操作时,可以先创建类的对象,然后通过  对象名.方法名();  来实现(关于类和对象的概念在后面章节中会详细讲解滴,先熟悉语法,表着急哦~~)

例如:在下面的代码中,我们创建了一个名为 hello 的对象,然后通过调用该对象的 show( ) 方法输出信息

运行结果为:  welcome to imooc.

3.Java 中无参带返回值方法的使用

如果方法不包含参数,但有返回值,我们称为无参带返回值的方法。

例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值为 int 类型的方法,执行的操作为计算两数之和,并返回结果

     在 calSum( ) 方法中,返回值类型为 int 类型,因此在方法体中必须使用 return 返回一个整数值。

运行结果为: 两数之和为:17

不容忽视的“小陷阱”:

1、 如果方法的返回类型为 void ,则方法中不能使用 return 返回值!

2、 方法的返回值最多只能有一个,不能返回多个值

3、 方法返回值的类型必须兼容,例如,如果返回值类型为 int ,则不能返回 String 型值

 

 

 

 

 

 

 

 

5-2 Java 中的 static 使用之静态变量 ;;Java 中的 static 使用之静态方法;;Java 中的 static 使用之静态初始化块

5-2 Java 中的 static 使用之静态变量 ;;Java 中的 static 使用之静态方法;;Java 中的 static 使用之静态初始化块

1.Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。当然,鉴于他作用的特殊性更推荐用类名访问

使用 static 可以修饰变量、方法和代码块。

    

2. 与静态变量一样,我们也可以使用 static 修饰方法,称为静态方法或类方法。其实之前我们一直写的 main 方法就是静态方法。静态方法的使用如:

         

注意:

1、 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如:

    

如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。如:

2、 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量,如下所示:

3、 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。如:

          

3.Java 中的 static 使用之静态初始化块

Java 中可以通过初始化块进行数据赋值。如:

   在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。

注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量  

 

 

 

 

 

 

ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]

ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]

错误堆栈:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]
    at android.support.v4.util.SimpleArrayMap.allocArrays(SourceFile:183)
    at android.support.v4.util.SimpleArrayMap.put(SourceFile:437)

错误原因:
由于SimpleArrayMap 里面使用了一个静态变量的缓存,mBaseCache,

    static Object[] mBaseCache;

该变量默认有两个数据,第1个元素是一个object[],用于存放上次的缓存的mBaseCache
第二个元素是int[],用于存在hash。具体赋值代码可以看下面

synchronized (ArrayMap.class) {
                if (mBaseCacheSize < CACHE_SIZE) {
                    array[0] = mBaseCache;
                    array[1] = hashes;
                    for (int i=(size<<1)-1; i>=2; i--) {
                        array[i] = null;
                    }
                    mBaseCache = array;
                    mBaseCacheSize++;
                    if (DEBUG) Log.d(TAG, "Storing 1x cache " + array
                            + " now have " + mBaseCacheSize + " entries");
                }
            }

使用该数组的地方在:
SimpleArrayMap 的allocArrays 方法里

synchronized (ArrayMap.class) {
                if (mBaseCache != null) {
                    final Object[] array = mBaseCache;
                    mArray = array;
                    mBaseCache = (Object[])array[0];
                    mHashes = (int[])array[1];
                    array[0] = array[1] = null;
                    mBaseCacheSize--;
                    if (DEBUG) Log.d(TAG, "Retrieving 1x cache " + mHashes
                            + " now have " + mBaseCacheSize + " entries");
                    return;
                }
            }

下面这段代码是有风险的,如果mBaseCache 在多线程被修改了,就会把ClassCastException 异常。

        mBaseCache = (Object[])array[0];

解决方法:
如果项目某个地方报这个错误,请把这个地方的ArrayMap替换成 HasMap. HasMap 多线程不会崩溃,虽然,他不是特别完好的支持。不需要把项目中所有的地方都替换掉,没有必要。单独线程,ArrayMap 完全没有问题。

错误复现:这个复现起来超级麻烦,我花了一周的时间,才找到复现的漏洞,分享给大家:

    /**
     * 复现该问题  用了四个线程
     *     java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]
     *         at android.support.v4.util.SimpleArrayMap.allocArrays(SimpleArrayMap.java:157)
     *         at android.support.v4.util.SimpleArrayMap.put(SimpleArrayMap.java:399)
     *         at com.example.fragment.MainFragment$14.run(MainFragment.java:280)
     *        1.首先 线程1 执行到put 方法的

     *         mArray[index<<1] = key;
     *         mArray[(index<<1)+1] = value;
     *         mSize++;
     *         return null;
     *         最上面这个位置  目的是让这个数组不再是空的
     *
     *         2.执行线程2  也执行到
     *         mArray[index<<1] = key;
     *         mArray[(index<<1)+1] = value;
     *         mSize++;
     *         return null;
     *         最上面这个位置  目的是让这个put 的东西,放在第0个位置,因为put里面会生成index,
     *         让两个线程都放到index 是0 的位置
     *
     *         3.把线程1执行完,这样数据里面已经放进去一个数据了
     *
     *         4.执行线程3 到removeAt 方法的 freeArrays 的  mBaseCache = array; 之前
     *             public V removeAt(int index) {
     *              final Object old = mArray[(index << 1) + 1];
     *              if (mSize <= 1) {
     *             // Now empty.
     *             if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to 0");
     *             freeArrays(mHashes, mArray, mSize);
     *
     *             mBaseCache = array;----------- freeArrays
     *
     *             这个的目的是调用freeArray 方法,让当前的map释放当前的数组。这样就可以生成mBaseCache了
     *
 *             5.把线程2  执行完
 *             这样就会把mBaseCache 赋值的数组,重新赋值
 *
 *             6.把线程3执行完
 *             ok,现在mBaseCache已经被污染了
 *
 *             7.执行线程4
 *
 */
    private void CMETestCastException() {
        final ArrayMap testArrayMap = new ArrayMap();
        final ArrayMap testArrayMap2 = new ArrayMap();

        new  Thread("线程1"){
            @Override
            public void run() {
                super.run();
                    testArrayMap.put("2324","fffff");
            }

        }.start();

        new  Thread("线程2"){
            @Override
            public void run() {
                super.run();
                    testArrayMap.put("test","string");
            }

        }.start();

        new  Thread("线程3"){
            @Override
            public void run() {
                super.run();
                    testArrayMap.removeAt(0);
            }

        }.start();

        new  Thread("线程4"){
            @Override
            public void run() {
                super.run();
                    testArrayMap2.put("aaa","string");
            }

        }.start();
    }

复现这个问题的时候,关键是把mBaseCache 污染掉。这里四个线程的话,需要调试,调试步骤就是上面我注释的。

总结:
如果当前的map 会有多个线程访问,请使用HasMap. 该问题,google 并没有解决。在高版本上,直接扔CME ConcurrentModificationException.

Error:java: Internal compiler error: java.lang.Exception: java.lang.NoClassDefFoundError 解决

Error:java: Internal compiler error: java.lang.Exception: java.lang.NoClassDefFoundError 解决

Error:java: Internal compiler error: java.lang.Exception: java.lang.NoClassDefFoundError 解决

IDEA 发现一个奇怪的错误
今天用 IDEA2018.1 运行 SpringBoot 项目报错如下:
Error:java: Internal compiler error: java.lang.Exception: java.lang.NoClassDefFoundError: org/springframework/boot/configurationprocessor/metadata/ConfigurationMetadata at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:169)
解决方案:
分下看这个跟 Eclipse 有关,可是这个不是 Eclipse 项目(没有 Eclipse 的 Workspeace 信息),后来查找发现跟 Eclipse 有关设置就是之前自己设置锅编译器,改过来问题得到解决。解决步骤:IDEA 中 File-->settings-->Bulid Execution Deloyment-->Complier-->Java Complier 中的 user complier 有原来的 Eclipse 改为 javac 即可

关于如何将新元素添加到 Java 二维数组中的下一个空索引?java向二维数组添加数据的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于4-1 如何定义 Java 中的方法;Java 中无参无返回值方法的使用;Java 中无参带返回值方法的使用;、5-2 Java 中的 static 使用之静态变量 ;;Java 中的 static 使用之静态方法;;Java 中的 static 使用之静态初始化块、ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]、Error:java: Internal compiler error: java.lang.Exception: java.lang.NoClassDefFoundError 解决的相关知识,请在本站寻找。

本文标签: