周一,我不知道的小知识!
//第一组
//1
String str1 = "hello";
str1 += ",world";
//2
StringBuilder sb1 = new StringBuilder("hello");
sb1.append(",world");
//第二组
//1
String str2 = "hello";
for (int i = 0; i < 3; i++) {
str2 += ",world";
}
//2
StringBuilder sb2 = new StringBuilder("hello");
for (int i = 0; i < 3; i++) {
sb2.append(",world");
}
问: 第一组的1和2的效率谁快谁慢。那第二组呢?
答:
第一组一样,1编译后编译器会优化成2一样;
第二组2快,1编译后每次循环都会创建一个StringBuilder对象然后toString一次。
周二,我竟然栽在继承上了。。
public class Test {
static class Base{}
static class Agg extends Base {
public String getFields() {
String name = "Agg";
return name;
}
}
public static void main(String[] args) {
Base b = new Agg();
System.out.println(b.getFields());
}
}
问: 上面程序有问题吗?有的话请写出正确写法,得到输出结果是“Agg”
答:
其实Base类没有那个方法,所以无法调用,编译报错
但是我想输出“Agg”我们可以把父类强转成子类,所以结果是:
System.out.println(((Agg)b).getFields());
周三,万恶的2,你能怎么这么。。。
public static void main(String[] args) {
//判断一个数是偶数 输出是true
System.out.println(test1(2));
//判断一个正整数是2的整数次幂 输出是false
System.out.println(test2(18));
}
//判断一个数是偶数
private static Boolean test1(Integer num) {
//TODO
}
//判断一个正整数是2的整数次幂
private static Boolean test2(Integer num) {
//TODO
}
问: 请用各用一段代码补全上面两个程序,使其具有相应的功能。
答:
return (num & 1) == 0;
return (num & num - 1) == 0;
第二个的解释吧,有点多,给你一篇我的文章https://mp.weixin.qq.com/s/7SSqiWt9bSnqZW8EgIB6nA
周四,求一个无序数组里有99个不重复的正整数,
//求一个无序数组里有99个不重复的正整数,
//1-100少了一个数,找出那个少的数。
public static void main(String[] args) {
List<Integer> list = geList();
list.remove(0);
//TODO,求出我移除的数字是多少
}
//用于生成 一个1-100 少一个数又不连续的list
private static List<Integer> geList() {
int[] z = IntStream
.iterate(1, i -> i + 1)
.limit(100).toArray();
int a,b;
Random r = new Random();
//随机交换values.length次
for(int i = 0;i < values.length;i++){
//随机产生一个位置
a = Math.abs(r.nextInt()) % (z.length-1);
//随机产生另一个位置
b = Math.abs(r.nextInt()) % (z.length-1);
//交换位置
if(a != b){
z[a] = z[a] ^ z[b];
z[b] = z[a] ^ z[b];
z[a] = z[a] ^ z[b];
}
}
List<Integer> collect = Arrays
.stream(z).boxed()
.collect(Collectors.toList());
return collect;
}
问: 补全程序,其实就是一个无序数组有99个不重复的正整数,1-100少了一个,求少的哪个?
答:
求和相减
System.out.println((1 + 100) * 50 - list.stream().mapToInt(Integer::intValue).sum());
周五,最简单的一道题?
public static void main(String[] args) {
List<String> strList =
Arrays.asList("小", "编", "是");
//TODO 补全代码
//希望得到的输出结果是
//[小, 编, 是, 笨, 蛋]
System.out.println(strList);
}
问: **不要给我留面子,请让它输出 “[小, 编, 是, 笨, 蛋]”
答:
其实这个就是考察Arrays.asList转成list后续不能调用list的方法因为,
看他是个list其实底层还是个数组,
所以一般都会这么写List<String> strList = new ArrayList<>Arrays.asList("小", "编", "是"));
《代表尖括号,微信转译有问题,不论怎么样都无法写成尖括号其实这个就是考察Arrays.asList转成list后续不能调用list的方法因为,
看他是个list其实底层还是个数组,所以一般都会这么写List<String> strList = new ArrayList<>Arrays.asList("小", "编", "是"));
周六,周六休息一下,来道脑力题
三个人合资买一件东西,这个产品原价是30元,
现在三个人每人出10元,到了商店,老板说今天
做活动,该产品只要25元,说完就给商店的营业
员5元钱,叫她还给三个客人,可是营业员偷藏
2元,将3元钱还给三位客人,现问三位客人每
人出了10元-退还的1元=9元.
3*9=27+营业员偷2元=29,
第一次三个人每人出了10(3*10=30),
现在这边只有29元,那还有一元钱是哪个人拿了?
问: 我的一块钱呢?
答:
回答者:一捧火山灰
三个客人每人出了10元,共30元,这30元包括:
①产品价格25元 ②营业员偷拿的2元 ③营业员返还的3元。
①+②+③=30元。
在营业员返还那3元后,③回到三人手里,三人付出的钱为①+②。
而上文中计算总钱数时却说"3*9=27+营业员偷2元"
相当于是①+②+②,并非总钱数。
因为营业员偷拿的钱是三人付出的钱的一部分,因此这里相加是不对的。
若要计算总钱数应为:三人付出的钱3*9+老板返还的3元=30元。