我偶尔听说过,通用泛型,Java并没有把它弄好.(最近的参考,这里)
原谅我的经验不足,但是什么会让他们变得更好?
可能重复:
在Java集合中存储原始值?
在java中我使用以下内容: -
public HashMap<char, int> buildMap(String letters)
{
HashMap<char, int> checkSum = new HashMap<char, int>();
for ( int i = 0; i < letters.length(); ++i )
{
checkSum.put(letters.charAt(i), primes[i]);
}
return checkSum;
}
Run Code Online (Sandbox Code Playgroud)
我收到与不适当类型有关的错误.我分别使用Character和Integer而不是char和int解决了我的问题.但是,我无法弄清楚为什么HashMap无法处理原始数据类型.
这不是什么是装箱和拆箱的问题,而是为什么像Java和C#这样的语言需要呢?
我非常熟悉C++,STL和Boost.
在C++中,我可以很容易地写出这样的东西,
std::vector<double> dummy;
Run Code Online (Sandbox Code Playgroud)
我有一些Java经验,但我真的很惊讶,因为我必须写这样的东西,
ArrayList<Double> dummy = new ArrayList<Double>();
Run Code Online (Sandbox Code Playgroud)
我的问题,为什么它应该是一个对象,在谈论泛型时,在技术上如此难以包含原始类型?
可能重复:
在java集合中存储原始值?
我的Java教科书说集合的元素,例如ArrayList,不能是原始类型.是否有一个原因?我的意思是Sun的某个人是否决定了这一点,或者是否存在阻碍这样做的障碍?我理解我的例子半答案我的问题,因为ArrayList需要一个对象,而原语不是对象.但后来我想为什么它们也不能有原始类型呢?
我需要创建一个记录两列{int,String}的List.我认为ArrayList是我需要的,但我无法理解它.我从数据库中提取了字符串,而int是我需要识别字符串位置以供日后使用的索引值.
List<List<String>> strArray = ArrayList<List<String>>;
然后我可以为我从数据库中提取的每一行执行类似strArray.add().add()的操作吗?
你好这里是一些检查有效字符的代码,虽然代码不起作用.即使'operand'是有效字符,它也永远不会打印是,并返回false.无论什么即使角色有效,它也只是不识别它并且总是转到else语句.请帮忙!
public static boolean checkValidOperands(char operand) {
char[] validOperators = {'+', '-', '*', '/', 'q'};
List<char[]> validOp = Arrays.asList(validOperators);
if (validOp.contains(operand)) {
System.out.println("Yes");
return false;
} else {
System.out.println("Please enter valid operand");
return true;
}
}
Run Code Online (Sandbox Code Playgroud) 我在接受采访时问了这个问题.
我知道原始类型将被转换为包装类对象以存储在任何数据结构中.
但是面试官问我,我不希望它成为一个包装类对象,它应该存储为原始类型.
我们怎么做?
Java 程序可能非常消耗内存。例如,一个Double对象有 24 个字节:8 个字节的数据和 16 个字节的 JVM 施加的开销。一般来说,表示原始类型的对象非常昂贵。
Java 标准库中的任何集合都会发生同样的情况。甚至还有一些违反直觉的事实,例如 aHashSet比 a 更需要内存HashMap,因为 aHashSet包含HashMap内部 ( http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html )。
在高性能设置中对数据进行建模和对象委派时,您能否提出一些建议,以便减轻 Java 的这些“弱点”?
我正在开发一个java应用程序,我在其中使用Hashmap,它将字符串作为键,并将double作为值,但我知道Hashmap不能将原始类型作为泛型,但它可以使用double [].我可以知道为什么吗?
Java不支持使用基元创建集合,因此后续构造会出现编译错误("参数不能是基本类型):
List<int> ints = new ArrayList<int>();
Run Code Online (Sandbox Code Playgroud)
另一方面,允许创建数组或基元的集合,因此以下构造是可以的:
List<int[]> ints = new ArrayList<int[]>();
Run Code Online (Sandbox Code Playgroud)
这背后的逻辑是什么?
编辑:问题实际上是关于基元数组,而不是基元,所以请不要解释为什么我不能将基元存储在集合中,而是为什么我可以在集合中编写基元数组?
使用Java,我有一个类,它将网页检索为字节数组.然后我需要删除一些内容(如果存在).(该应用程序监视网页的变化,但需要从PHP创建的html中删除会话ID,并且意味着每次访问该页面时都会检测到更改).
一些生成的字节数组可能是1000个字节长的10.它们不是这样存储的 - 存储了16字节的MD5页面.但是,它是需要处理的原始全尺寸字节数组.
(更新 - 代码不起作用.请参阅下面的AH评论)显示我的代码的测试:
public void testSessionIDGetsRemovedFromData() throws IOException
{
byte[] forumContent = "<li class=\"icon-logout\"><a href=\"./ucp.php?mode=logout&sid=3a4043284674572e35881e022c68fcd8\" title=\"Logout [ barry ]\" accesskey=\"x\">Logout [ barry ]</a></li>".getBytes();
byte[] sidPattern = "&sid=".getBytes();
int sidIndex = ArrayCleaner.getPatternIndex(forumContent, sidPattern);
assertEquals(54, sidIndex);
// start of cleaning code
ArrayList<Byte> forumContentList = new ArrayList<Byte>();
forumContentList.addAll(forumContent);
forumContentList.removeAll(Arrays.asList(sidPattern));
byte[] forumContentCleaned = new byte[forumContentList.size()];
for (int i = 0; i < forumContentCleaned.length; i++)
{
forumContentCleaned[i] = (byte)forumContentList.get(i);
}
//end of cleaning code
sidIndex = ArrayCleaner.getPatternIndex(forumContentCleaned, sidPattern);
assertEquals(-1, …Run Code Online (Sandbox Code Playgroud) 你是如何做到这一点的?它说在功能addint中找不到可变AL.如何在不同的函数中添加int到Arraylist?
/**
* Constructor
*/
public Player()
{
ArrayList<int> AL = new ArrayList();
}
public void addint(int C){
AL.add(C);
}
Run Code Online (Sandbox Code Playgroud) java ×13
arraylist ×4
arrays ×2
generics ×2
hashmap ×2
performance ×2
android ×1
boxing ×1
c++ ×1
collections ×1
contains ×1
core ×1
memory-leaks ×1
search ×1
unboxing ×1