如何使Java数组的行为类似于JavaScript数组?

如何使Java数组的行为类似于JavaScript数组?,java,Java,在JavaScript中,我可以编写如下代码: var a = new Array(); a[2] = 'a'; a[20] = 'b'; char[] array = new char[30]; array[2] = 'a'; array[20] = 'b'; List<Character> list = new ArrayList<>(); list.add('a'); list.add('b'); Map<Integer,Character> my

在JavaScript中,我可以编写如下代码:

var a = new Array();
a[2] = 'a';
a[20] = 'b';
char[] array = new char[30];
array[2] = 'a';
array[20] = 'b';
List<Character> list = new ArrayList<>();
list.add('a');
list.add('b');
Map<Integer,Character> myMap = new HashMap<Integer,Character>(); 

// insert mappings int -> char
myMap.put(0, 'a');
myMap.put(1, 'b');
myMap.put(20, 'c');
这在Java上不起作用,关键是我不想为它指定确切的长度

在编写java时如何保持这种愉快的风格?

像这样

char arr[]=new char[30]; //declares an array which can hold 30 characters
    arr[2]='a';
    arr[20]='b';

但是如果您不想指定长度,那么arraylist可以帮助您完成任务,因为Java和JavaScript是两种不同的语言,数组的大小总是固定的。你不能在两种情况下都做同样的事情

Java
中,您可以编写

char[] arr=new char[2];
arr[0]='a';
arr[1]='b';
如果不想指定长度,可以在
Java
中使用
List

List<Character> list=new ArrayList<>();
list.add('a');
list.add('b');
List List=new ArrayList();
列表。添加('a');
列表。添加('b');

当您需要一个字符数组时,可以这样做:

var a = new Array();
a[2] = 'a';
a[20] = 'b';
char[] array = new char[30];
array[2] = 'a';
array[20] = 'b';
List<Character> list = new ArrayList<>();
list.add('a');
list.add('b');
Map<Integer,Character> myMap = new HashMap<Integer,Character>(); 

// insert mappings int -> char
myMap.put(0, 'a');
myMap.put(1, 'b');
myMap.put(20, 'c');

这取决于,如果要使用固定大小的数组,可以使用:

char myarray[]=new char[50];
myarray[2]='a';
myarray[20]='b';

如果要动态更改数组的大小,可以使用类似ArrayList的集合(查看文档),并在所需位置插入字符

如果不想指定长度,可以使用如下列表:

var a = new Array();
a[2] = 'a';
a[20] = 'b';
char[] array = new char[30];
array[2] = 'a';
array[20] = 'b';
List<Character> list = new ArrayList<>();
list.add('a');
list.add('b');
Map<Integer,Character> myMap = new HashMap<Integer,Character>(); 

// insert mappings int -> char
myMap.put(0, 'a');
myMap.put(1, 'b');
myMap.put(20, 'c');
List List=new ArrayList();
列表。添加('a');
列表。添加('b');

您不能。Java对于Javascript就像火腿对于仓鼠一样重要。没有理由相信它们有相同的语法

如果需要稀疏数组,请使用
贴图

final Map<Integer, Character> a = new LinkedHashMap<>();
a.put(2, 'a');
a.put(20, 'b');
class MyArray2<T> extends HashMap<Object, T> {
    public MyArray2<T>() { super(); }
    public void add(Object o, T value) { set(o, value); }
}
final Map a=newlinkedhashmap();
a、 将(2,'a');
a、 put(20,'b');

正如其他人已经指出的那样:Java和JavaScript是两种不同的东西。对于大小可变的容器,有以下选项

但谁来选择呢?这取决于你需要什么。根据你的问题,我可以想象两种情况:

可变大小的索引容器: 基本上是一个类似数组的列表。在Java中,除了其他列表实现之外,还使用了
ArrayList
,如下所示:

List<Character> myList = new ArrayList<Character>(); 

// insert element at the end of the list
myList.add('a');

// insert element at specific position in list
myList.add(1, 'b');

// this will fail, because there's no element at position 2!!!
myList.add(3, 'c')

每个容器都有不同的用途。我建议你阅读这本书,以便能够选择最合适的一本。同时,看看TuuuXi的答案,因为他提出了一个模拟希望的Beavior的解决方案,但是考虑到(正如他自己说)<强>这不是java做事情的方式!你可以自己写。您将无法获得语法,但大部分味道仍然存在

请注意,就效率而言,这是一个糟糕的想法。通过学习“Java方式”可以编写更好的代码。所有语言都是如此:针对语言的纹理编程肯定会给您带来痛苦

但代码如下:

class MyArray<T> extends ArrayList<T> {
    public MyArray<T>() { super(); }
    public void add(int i, T value) { 
        if (size() < i) { 
            ensureCapacity(i+1); // grow at most once instead of multiple times 
            while (size() < i)) { 
                add(null); // extend with a null object
            }
            add(value);
        } else {
            add(i, value);
        }
    }            
}
请记住,JavaScript数组可以被任意对象索引,而不仅仅是整数——如果可能的话,JavaScript VM会尝试使用数字索引数组。对于任意索引,您需要使用Java
HashMap

final Map<Integer, Character> a = new LinkedHashMap<>();
a.put(2, 'a');
a.put(20, 'b');
class MyArray2<T> extends HashMap<Object, T> {
    public MyArray2<T>() { super(); }
    public void add(Object o, T value) { set(o, value); }
}
类MyArray2扩展了HashMap{
公共MyArray2(){super();}
公共void add(对象o,T值){set(o,值);}
}
然后,您将使用:

MyArray2<Character> c = new MyArray2<>()
c.add("anything", '?');
c.get("anything"); // returns '?'
MyArray2 c=newmyarray2()
c、 加上(“任何东西”、“?”);
c、 获取(“任何东西”);//返回“?”

噢,谢谢你,但我的意思是我不想在定义数组时指定长度。你不能。。。数组的大小在Java中总是固定的。通常不使用数组,而是在这里使用List的实现—通常是ArrayList,但有很多其他可用的替代方案。当然,作为最后一步,您可以从列表中创建一个数组,或者只是更改方法的签名以返回一个列表作为开始。也可以看到这一点。谢谢,当我不想指定长度时,我可以做什么?我可以不为它定义长度吗?@igonejack您可以在
Java
中使用
列表
“您必须…”
ammm…可能是
“你可以…”
,他也可以实现其他集合。。!!!我可能错了,但是你使用数组的方式似乎表明你实际上想要一个映射——也就是说,当你放入
2
时,你似乎想要得到
'a'
,当放入
20
时,你想要得到
'b'
。在JavaScript中,你有一个数组——它做了很多事情。在Java中,您可以(也应该)在普通数组、集合、列表和映射之间进行选择,仅列举几个主要集合。有专门用于特定操作的容器。所有这些选择都允许您编写比JavaScripts“一刀切”方法更快、更高效的应用程序?或者你想给我们更精确的信息吗?谢谢大家,这对我来说有点疯狂,因为我花了很多时间在JavaScript上。我不认为映射是用作数组的更好结构。它还有其他用途…@Dani抱歉什么?
Map
是一个非常好的稀疏数组,用于此目的。毕竟,除了
映射的特例之外,数组是什么?这只是一种观点。当然,你可以使用一个映射作为数组,我认为映射是一个数据结构,用来存储与某个键相关的值,而键通常有另一种含义,即仅仅是列表中的一个位置。这是一种主观的东西,sorry@Dani那么这是一个错误的观点。我不明白你是从哪里来的。为什么使用带有
50
空格的数组来存储两个值要比使用专门为任务设计的
Map
更好?通常,如果使用数组,您将使用它的所有位置,它可以增加或减少,但不会留下空位置。当然,如果你打算留下很多空位置,map会更好,但是在这种情况下,首先考虑数组是很奇怪的,map的键可能除了一个简单的索引之外还有另一个含义。如果使用and数组是因为索引只对将一个元素放在另一个元素的左边或右边很重要,这只是一个排序问题。如果钥匙有另一种含义,那么钥匙可能不会