相关疑难解决方法(0)

[L数组符号 - 它来自哪里?

我经常看到使用[L类型来表示数组的消息,例如:

[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

(上面是我刚刚拔出的任意例子.)我知道这表示一个数组,但语法来自何处?为什么开始[但没有关闭方括号?为什么L?这纯粹是武断的还是还有其他一些历史/技术原因?

java arrays

76
推荐指数
5
解决办法
3万
查看次数

Java Arrays.equals()为二维数组返回false

我只是很想知道 - 为什么Arrays.equals(double [] [],double [] [])返回false?实际上,当数组具有相同数量的元素并且每个元素是相同的?

例如,我进行了以下测试.

double[][] a,  b;
int size =5;

a=new double[size][size];
b=new double[size][size];

for( int i = 0; i < size; i++ )
    for( int j = 0; j < size; j++ ) {
        a[i][j]=1.0;
        b[i][j]=1.0;
    }

if(Arrays.equals(a, b))
    System.out.println("Equal");
else
    System.out.println("Not-equal");
Run Code Online (Sandbox Code Playgroud)

返回false并打印"不相等".

另一方面,如果我有这样的事情:

double[] a,  b;
int size =5;

a=new double[size];
b=new double[size];

for( int i = 0; i < size; i++ ){
    a[i]=1.0;
    b[i]=1.0;
} 

if(Arrays.equals(a, b))
    System.out.println("Equal");
else
    System.out.println("Not-equal");
Run Code Online (Sandbox Code Playgroud)

返回true并打印"Equal".该方法仅适用于单个尺寸吗?如果是这样,Java中的多维数组是否有类似的东西?

java arrays

39
推荐指数
1
解决办法
4万
查看次数

改造void方法以返回其论点以促进流畅性:打破变化?

"API设计就像性:做出一个错误并在你的余生中支持它" (Josh Bloch在Twitter上)

Java库中存在许多设计错误.Stack extends Vector(讨论),我们无法在不造成破损的情况下解决这个问题.我们可以尝试弃用Integer.getInteger(讨论),但它可能会永远存在.

尽管如此,某些类型的改装可以在不造成破损的情况下完成.

有效的Java第2版,第18项:首选接口到抽象类:现有的类可以很容易地进行改进,以实现新的接口".

例如:String implements CharSequence,Vector implements List,等.

有效的Java第2版,第42项:明智地使用varargs:您可以改进现有方法,该方法将数组作为其最终参数,而不是对现有客户端采取varags.

一个着名的例子是Arrays.asList引起混淆(讨论),但没有破坏.

这个问题是关于不同类型的改造:

您是否可以在void不破坏现有代码的情况下改进返回方法的方法?

我最初的预感指向是,因为:

  • 返回类型不会影响在编译时选择哪个方法
  • 即使你使用反射,Class.getMethod也不会在返回类型上区分

但是,我希望听到其他在Java/API设计方面经验丰富的人进行更全面的分析.


附录:动机

正如标题中所建议的那样,一个动机是促进流畅的界面风格编程.

考虑这个简单的代码片段,它打印一个混洗的名称列表:

    List<String> names = Arrays.asList("Eenie", "Meenie", "Miny", "Moe");
    Collections.shuffle(names);
    System.out.println(names);
    // prints e.g. [Miny, Moe, Meenie, Eenie]
Run Code Online (Sandbox Code Playgroud)

已经Collections.shuffle(List)被宣布为返回输入列表中,我们可以这样写:

    System.out.println(
        Collections.shuffle(Arrays.asList("Eenie", …
Run Code Online (Sandbox Code Playgroud)

java jvm api-design binary-compatibility

14
推荐指数
1
解决办法
2302
查看次数

为什么L是引用类型的前缀(而不是其他一些字母)?

为什么L选择类型签名中引用的前缀?是否L代表某种东西,如B代表byte,I代表int什么?或者它被选中是因为C已经分配给了char

例如,

System.out.println( new String[0].getClass().getName() );
Run Code Online (Sandbox Code Playgroud)

产量:

[Ljava.lang.String;
Run Code Online (Sandbox Code Playgroud)

我已经知道Java规范Class.getName方法 javadoc 中的解释.

java

9
推荐指数
1
解决办法
2770
查看次数

如何将对象转发到java.util.Map?

我在Object类型的代码中有一个对象: Object o

实例的类是Object:o.getClass()赋予Object.

现在,它应该是一张地图!我如何将其转换为地图?

我试过了: Map<String, Object> map = (HashMap<String,Object>)o

但是这会返回:java.lang.ClassCastException:[Ljava.lang.Object; 无法强制转换为java.util.HashMap

实例"o"来自XMLRPC请求.该请求不能正确地限定变量

请看看这个!?

编辑:

现在我有以下问题: o.getClass().getName()java.util.ArrayList,

o.get(0)[Ljava.lang.Object;@739e8329,

o.get(0).getClass().getName()给出java.lang.String.

我不知道该怎么做..

EDIT2:

最后我发现了发生了什么.创建此对象的软件将数据结构展平为String(valueOf()).所以,当我打印变量时,它返回了一个[Ljava.util.Object,它实际上是一个包含这些信息的String.

多谢你们!

java casting object map

4
推荐指数
2
解决办法
2万
查看次数

Java:split()返回[Ljava.lang.String; @ 186d4c1],为什么?

我不明白为什么!

我基本上有一个STRING(是的,不是数组),它具有以下内容:

[something, something else, somoething, trallala, something]
Run Code Online (Sandbox Code Playgroud)

我想把它变成一个String [].所以首先关闭第一个和最后一个字符的substring()以摆脱括号[].然后我使用split()函数用逗号分割.我试过用"\ |" 和","和"\",结果相同.

这就是我得到的:

[Ljava.lang.String;@186d4c1
Run Code Online (Sandbox Code Playgroud)

这是它的代码.我把它变成了一个单行:

String[] urlArr = ((matcher.group(3).toString()).substring(1, (matcher.group(3).length()-1))).split(",");
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,第一部分是(matcher.group(3).toString()),它会返回一个有效的字符串(就像我上面发布的例子一样).所以我不明白为什么它不起作用.

有任何想法吗?

编辑:

我澄清了一下代码:

String arrString = matcher.group(3).toString();
int length = arrString.length();
String[] urlArr = (arrString.substring(1, length-1)).split(",");
System.out.println(urlArr);
Run Code Online (Sandbox Code Playgroud)

java split

3
推荐指数
2
解决办法
2万
查看次数

什么是"L","["和";" 在smali代码中意味着什么?

我正在努力深入了解smali语言.我发现了一个页面谈论操作码在线,但它永远不会谈论这些特殊符号,它是L,;并且[,如

invoke-static {v2, v3}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
Run Code Online (Sandbox Code Playgroud)

那么,这些符号在这里意味着什么?例如[Ljava/lang/Object;Ljava/lang/String;

java android smali

3
推荐指数
1
解决办法
2385
查看次数

在Java 8中读取文件以获取2d数组

我试图读取一个看起来像这样的简单文本文件:

operationName1 Value
operationName2 Value
Run Code Online (Sandbox Code Playgroud)

操作名称是字符串(只有两种可能的操作),值是整数.

我的目标是将数组作为输出,如下所示:

[[1,10],[2,5]]
Run Code Online (Sandbox Code Playgroud)

在指定的数组中,我将operationName1转换为1,将operationName2转换为2,并使用相应的值.

这是我试过的:

try{
    Path path = Paths.get("./myFile.txt");
    String[][] array = Files.lines(path)
                    .map(s -> s.split("\\s+", 2))
                    .map(a -> new String[]{a[0], a[1]})
                    .toArray(String[][]::new);

    System.out.println(Arrays.toString(array));
    }catch(IOException e){  
}
Run Code Online (Sandbox Code Playgroud)

我没有在这段代码中将名称更改为整数,我只是尝试获取一个字符串数组,我可以打印以查看我是否正确读取文件.

我的输出如下:

[[Ljava.lang.String;@682a0b20, [Ljava.lang.String;@3d075dc0, [Ljava.lang.String;@214c265e, [Ljava.lang.String;@448139f0, [L ...
Run Code Online (Sandbox Code Playgroud)

我只得到一个流而不是字符串?

路径是正确的,我可以使用标准语法正常读取文件.但我真的很想理解从右脚开始的语法,因为理解它似乎很有帮助.

我的问题:您是否知道如何纠正这个问题,或者更好的是,如何使用最新语法获得预期输出?(如果可能,Java 8?)

PS:我也看到了这种语法,但我不知道如何完成它以获得我的结果,我不确定这是好还是坏(但它似乎是Java 8).

Files.lines(Paths.get(ClassLoader.getSystemResource("myFile.txt")
    .toURI())).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

java arrays file java-8

1
推荐指数
1
解决办法
923
查看次数

为什么这个java字符串例程不打印答案?

我一直在研究Project Euler问题4.我是java的新手,并且相信我找到了答案(906609 = 993*913,使用Excel!).

当我打印出注释掉的那一行时,我可以说我的字符串操作有效.我已经研究了一些比较字符串的方法,以防我没有多少东西,但这个例程并没有给我一个结果.

请帮我确定一下为什么不打印答案?

詹姆士

public class pall{
    public static void main(String[] args){

    int i;
    int j;
    long k;
    String stringProd;

    for(i=994;i>992; i--){
        for (j=914;j>912; j--){
            k=(i*j);
            stringProd=String.valueOf(k);
            int len=stringProd.length();

            char[] forwards=new char[len];
            char[] back = new char[len];

            for(int l=0; l<len; l++){
                forwards[l]=stringProd.charAt(l);
            }

            for(int m=0; m<len;m++){
                back[m]=forwards[len-1-m];

            } 

            //System.out.println(forwards);
            //System.out.println(back);

            if(forwards.toString().equals(back.toString())){
                System.out.println(k);}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

java string

0
推荐指数
1
解决办法
1038
查看次数

如何将[[Ljava.lang.String; @ 7defb4fb]转换为字符串

我正在尝试打印String,下面是代码:

Object[] objArr = data.get(key);
for (Object obj : objArr)
{
    System.out.println(obj);
    cell.setValue(obj);
}
Run Code Online (Sandbox Code Playgroud)

但我在控制台中得到以下输出:

[[Ljava.lang.String;@7defb4fb]
Run Code Online (Sandbox Code Playgroud)

我尝试了以下代码片段:

System.out.println(Arrays.toString(objArr));
System.out.println(Arrays.asList((objArr)));
System.out.println(objArr[k]);
Run Code Online (Sandbox Code Playgroud)

但是所有这些都给出了类似的奇怪输出:

[[Ljava.lang.String;@7defb4fb]
[[Ljava.lang.String;@7defb4fb]
[Ljava.lang.String;@7defb4fb
Run Code Online (Sandbox Code Playgroud)

如何从中获取字符串值?

**

编辑:

**我的问题是用Java打印和数组化的数组。第一件事是认识到它的嵌套数组,因此当我尝试遍历该数组并打印其元素时,它是在打印地址而不是元素的地址。

[Ljava.lang.String; @ 7defb4fb]

我的问题是将其识别为数组,然后再次遍历此数组以打印元素。因此,这是解决方案

if (obj instanceof String[]) {
        String[] strArray = (String[]) obj;
        System.out.println(Arrays.toString(strArray));
        // System.out.println(obj);
    }
Run Code Online (Sandbox Code Playgroud)

java arrays

0
推荐指数
1
解决办法
2万
查看次数

标签 统计

java ×10

arrays ×4

android ×1

api-design ×1

binary-compatibility ×1

casting ×1

file ×1

java-8 ×1

jvm ×1

map ×1

object ×1

smali ×1

split ×1

string ×1