我经常看到使用[L类型来表示数组的消息,例如:
[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
(上面是我刚刚拔出的任意例子.)我知道这表示一个数组,但语法来自何处?为什么开始[但没有关闭方括号?为什么L?这纯粹是武断的还是还有其他一些历史/技术原因?
我只是很想知道 - 为什么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中的多维数组是否有类似的东西?
"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不破坏现有代码的情况下改进返回方法的方法?我最初的预感指向是,因为:
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) 为什么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 中的解释.
我在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.
多谢你们!
我不明白为什么!
我基本上有一个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) 我正在努力深入了解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;
我试图读取一个看起来像这样的简单文本文件:
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) 我一直在研究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) 我正在尝试打印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)