基础知识
1、在JAVA中,假设A有构造方法A(int a) ,则在类A的其他构造方法中调用该构造方法和语句格式应该为this(X)。
2、装箱、拆箱操作发生在引用类型和值类型之间
基本数据类型转化成包装类是装箱 (如: int --> Integer)。
包装类转化成基本数据类型就是拆箱 (如:Integer --> int)。
包装类就是引用类型,基本数据类型就是值类型
装箱——值类型转换为引用类型;拆箱——引用类型转换为值类型。
3、SimpleDateFormat是线程不安全的
4、ConcurrentHashMap不是使用synchronized关键字保证线程安全
5、HashMap实现了map接口
6、Array.asList方法返回对象是一个Arrays内部类,并没有实现集合的修改方法。 Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
7、关于泛型
1)虚拟机中没有泛型。只有普通类和普通方法
2)所有泛型类的类型参数在编译时都会被擦除
3)创建泛型对象时请指明类型,让编译器尽早的做参数检查
4)泛型的类型擦除机制能在运行时动态获取List中T的实际类型
编程
神奇的口袋
[编程题]23630-神奇的口袋
链接:https://www.nowcoder.com/questionTerminal/9aaea0b82623466a8b29a9f1a00b5d35
[神奇的口袋]有一个神奇的口袋,总的容积是40 ,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积
分别是a1 , 2… John可以从这些物品中选择-一些 ,如果选出的物体的总体积是40 ,那么利用这个神奇的口袋, John就可以得到这些物品。现在的问题
是,John有多少种不同的选择物品的方式。
【解题思路】:
采用递归思想:
①物品n个,物品体积逐一放入weight[]中
②递归函数count(int s,int n) : 其中s为剩余物品重量,n为剩余可选的物品个数
则分以下两步递归求解:
a.从后往前装,装上weight[n]后,若剩余物品仍然有解
则count(s-weight[n],n-1);
b.若装了weight[n]后,无解,则删除该包,尝试第n-1个
count(s,n-1);
import java.util.*;
public class Main {
static int[] weight;
static int N;
static int count=0;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (input.hasNext()) {
N = input.nextInt();
weight = new int[N+1];
for (int i = 1; i <= N; i++) {
weight[i] = input.nextInt();
}
count(40,N);
System.out.println(count);
}
}
public static void count(int s,int n) {
//如果正好装满
if(s==0) {
++count;
return ;
}
//是s<0或n<1则不能完成
if(s<0||(s>0&&n<1))
return ;
count(s-weight[n],n-1);
count(s,n-1);
}
}
用两个栈实现队列
[编程题]23281-用两个栈实现队列
链接https://www.nowcoder.com/questionTerminal/54275ddae22f475981afa2244dd448c6
【解题思路】:
栈1用来作入队列
栈2用来出队列,当栈2为空时,栈1全部出栈到栈2,栈2再出栈(即出队列)
【示例代码】:
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public int pop() {
while (!stack1.empty()){
stack2.push(stack1.pop());
}
int temp = stack2.pop();
while(!stack2.isEmpty()){
stack1.push(stack2.pop());
}
return temp;
}
}