黑马程序员技术交流社区
标题:
发现一个有趣的问题,求帮忙解决。。。
[打印本页]
作者:
吴小铁你好
时间:
2012-7-10 09:12
标题:
发现一个有趣的问题,求帮忙解决。。。
本帖最后由 吴小铁你好 于 2012-7-10 09:21 编辑
package com.day03;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class RandomTest {
/**
* 随机生成密码矩阵
*/
public static void main(String[] args) {
int k=0;
Random r = new Random();
Set<String> s = new HashSet<String>();
<FONT style="BACKGROUND-COLOR: red"> /*
* 需求:问题在下面,我想生成一个9*9的随机密码矩阵。
* 当我用for循环时,数组角标越界,用while时没问题。而当我把"i<81"变为"i<1000"时又可以输出
* 这个数组。
* 当我在for循环中加入System.out.println(s.size());时看机会大小,发现i<81时机会大小为60,i<100
* 集合大小为100.这是为什么呢???
*还有集合内存是怎样分配的啊,求解???
*
</FONT> * */
for (int i = 0; i < 81; i++) {
String str = "" + r.nextInt(10) + r.nextInt(10);
s.add(str);
//System.out.println(s.size());
}
/*while(s.size()<81){
String str = "" + r.nextInt(10) + r.nextInt(10);
s.add(str);
}*/
Object[] arr= s.toArray();
String [][]pass=new String[9][9];
for(int x=0;x<9;x++){
for(int y=0;y<9;y++){
pass[x][y]=(String) arr[k];
k++;
}
}
for(int i=0;i<pass.length;i++){
System.out.println(Arrays.toString(pass[i]));
}
}
}
/*
* 需求:问题在下面,我想生成一个9*9的随机密码矩阵。
* 当我用for循环时,数组角标越界,用while时没问题。而当我把"i<81"变为"i<1000"时又可以输出
* 这个数组。
* 当我在for循环中加入System.out.println(s.size());时看机会大小,发现i<81时机会大小为60,i<100
* 集合大小为100.这是为什么呢???
*还有集合内存是怎样分配的啊,求解???
*
* */
复制代码
作者:
何旭栋
时间:
2012-7-10 11:14
Set集合每添加一个元素是会调用该元素的equals方法和集合中已存在的每个元素进行比较,如果equals()返回值为true,则Set集合认为改元素已存在,就不再添加该元素。
String str = "" + r.nextInt(10) + r.nextInt(10),随机生成str容易出现重复,重复时s.add(str)是无效的,所以会出现s<81是会出现size是60,每次添加元素前进行判断就可以了
for (int i = 0; i < 81; i++) {
String str ;
do{
str = "" + r.nextInt(10) + r.nextInt(10);
}while(s.contains(str));
s.add(str);
}
集合也是new产生的对象,所以集合也是存在堆元素中,集合中的元素都是地址值而不是实体对象
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2