Java基础编程题50道题

Posted 睿图方永

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础编程题50道题相关的知识,希望对你有一定的参考价值。

1、題目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

思路:微笑刚开始真的无从下手,这么难的,怎么可以说是基础呢,感觉这些应该是逻辑分析很强的,第一个月只有一对兔子,第二个月还是只有一对兔子,第三个月,就有两对了,第四个月3对,第五个月5对,第六个月8对,第七个月是13对。。。。。。规律出来了,你们发了没?

public class TestDay01 
    public static void main(String[] args) 
        /**
         * 规律是每个数字都是前面两个数字之和
         * i是表示月份,这里计算了36个月,也就是三年,兔子的数量
         */
        int i;
        long arr[] = new long[36];  //这个数组时用来计算每月有兔子的对数
        arr[0] = arr[1] = 1;
        System.out.println("第1个月兔子1对" + "," + "总数是" + 2);
        System.out.println("第2个月兔子1对" + "," + "总数是" + 2);
        for (i = 2; i < 35; i++) 
            arr[i] = arr[i - 1] + arr[i - 2];
            System.out.println("第" + i + "个月有兔子" + arr[i] + "对" + "," + "总数是" + 2 * arr[i]);
        
    

2、题目:判断101-200之间有多少个素数,并输出所有素数。

思路:素数又叫质数,就是除了1和它本身之外,再也没有整数能被它整除的数。也就是素数只有两个因子。

public class TestDay02 
    public static void main(String[] args) 
        int i, j, n, m, x;                        //n是用来存储余数的、m是用来统计具体一个数的因子、x是用来统计101~200直接素数的个数
        n = 0;
        m = 0;
        x = 0;
        for (i = 101; i < 200; i++)             //两重循环
            for (j = 1; j <= i; j++) 
                n = i % j;                       //去余数,如果余数为零,就是该数的因子
                if (n == 0)                     //统计某数有多少个因子
                    m = m + 1;
                
            
            if (m == 2)                         //如果某数的因子只有两个,那它就一定是素数,那这个数就应该输出
                System.out.println(i + " ");
                x = x + 1;
            
            m = 0;                               //清零,不清了会继续累加
        
        System.out.println();
        System.out.println("在101~200之间一共有素数:" + x + "个");

    

3、题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

第一种:

public class TestDay03 
    public static void main(String[] args) 
        /**
         *  java的运算符,立方要这样写,写成i^3这样,竟然运算不出来
         *  如果遇到高次的话可以使用循环算出来
         */
        int a, sum;                        //表示100~999
        int i, j, k;                        //分别表示百位、十位、各位
        for (a = 100; a <= 999; a++) 
            i = a / 100;
            j = (a - i * 100) / 10;
            k = a - i * 100 - j * 10;
            sum = i * i * i + j * j * j + k * k * k;
            if (sum == a) 
                System.out.println(sum);
            
        
    

第二种:

public class TestDay03 
    public static void main(String[] args) 
        int sum;
        int i,j,k;                     //分别表示百位、十位、各位
        for (i = 1; i <=9 ; i++) 
            for (j = 0; j <=9 ; j++) 
                for (k = 0; k <=9 ; k++) 
                    sum = i * i * i + j * j * j + k * k * k;
                    if (i*100+j*10+k==sum)
                        System.out.println(sum);
                    
                
            
        
    

4、题目:将一个正整数分解质因数。例如:输入90,打印出90=233*5。

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。

(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

public class TestDay04 
    public static void main(String[] args) 
        int x;
        Scanner scanner = new Scanner(System.in);  //定义从键盘输入
        System.out.println("请输出一个整数:");     //提示
        x = scanner.nextInt();    //将从键盘输入的数赋值给x
        new PrimeSplit(x);
    

    private static class PrimeSplit 
        int k = 2;    //将最小的质数赋值给K
        public PrimeSplit(int x)     //小于等于1的数不可以分解
            if (x <= 1) 
                System.out.println(x + "是无效的被分解数");
             else if (x == 2) 
                System.out.println(x + "分解后的质数为:1*" + x);   //如果输入的是最小质数2
             else 
                System.out.println(x + "分解后的质数为:1");   //1是所有的整数的质数
                while (k <= x)    //输入的数可以被K整除
                    if (x % k == 0) 
                        System.out.println("*" + k);    //将k添加到结果中
                        x = x / k;     //除以最小质数后重新循环
                     else 
                        k++;
                    
                
            
        
    

5、题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

public class TestDay05 
    public static void main(String[] args) 
        int score = 90;      //分数的值可以随便修改
        if (score >= 90) 
            System.out.println("A");
         else if (score >= 60) 
            System.out.println("B");
         else 
            System.out.println("C");
        
    

6、题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

public class TestDay06 
    public static void main(String[] args) 
        gcdlcm gcdlcm = new gcdlcm();
        System.out.println("两个数的最大公约数是:" + gcdlcm.gcd(10, 16));
        System.out.println("两个数的最小公约数是:" + gcdlcm.lcm(10, 16));
    

    private static class gcdlcm 
        int gcd(int m, int n) 
            if (m < n)    //这个判断是为了将大数放在前面
                int temp = n;
                n = m;
                m = temp;
            
            if (m % n == 0) 
                return n;
             else 
                m %= n;
                return gcd(m, n);  //这里也可以成gcd(n,m),就省掉了前面的判断了,会快一点
            
        

        int lcm(int m, int n) 
            int i = 1;
            if (m < n)    //这个判断是为了将大数放在前面
                int temp = n;
                n = m;
                m = temp;
            
            int lcm = m;
            while (lcm % n != 0) 
                lcm = m * i;
                i++;
            
            return lcm;
        
    

7、题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

public class TestDay07 
    public static void main(String[] args) 
        int abcCount = 0;        //英文字母个数
        int spaceCount = 0;      //空格键个数
        int numCount = 0;        //数字个数
        int otherCount = 0;      //其他字符个数
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输出:");     //提示
        String str = scanner.nextLine();
        char[] ch = str.toCharArray();
        for (int i = 0; i < ch.length; i++) 
            if (Character.isLetter(ch[i])) 
                //判断是否字母
                abcCount++;
             else if (Character.isDigit(ch[i])) 
                //判断是否数字
                numCount++;
             else if (Character.isSpaceChar(ch[i])) 
                //判断是否空格
                spaceCount++;
             else 
                //以上都不是则认为是其他字符
                otherCount++;
            
        
        System.out.println("字母个数:" + abcCount);
        System.out.println("数字个数:" + numCount);
        System.out.println("空格个数:" + spaceCount);
        System.out.println("其他字符个数:" + otherCount);
    

8、题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

public class TestDay08 
    public static void main(String[] args) 
        Scanner input = new Scanner(System.in);
        int num = 0, num1 = 0, num2 = 0, temp = 0;
        System.out.println("请输出数字:");
        num1 = input.nextInt();
        num = num1;
        temp = num1;
        System.out.println("请输入项数:");
        num2 = input.nextInt();
        for (int i = 0; i < num2; i++) 
            num = (num * 10 + num1);
            temp += num;
        
        System.out.println(temp);
    

### 9、题目:一个数如果恰好等于它的因子之和, 这个数就称为”完数”。例如6=1+2+3.编程找出1000以内的所有完数。

分析:没啥特别好分析的,注意类名尽量不要学我用拼音取名吧23333。

/**
 *题目:一个数如果恰好等于它的因子之和, 这个数就称为”完数”。例如6=1+2+3.编程找出1000以内的所有完数。
 */
public class TestDay09 

	public static void main(String[] args) 
		int sum = 0;
		for (int j = 2; j <= 1000; j++) 
			for (int i = 1; i < j; i++) 
				if (j % i == 0) 
					sum += i;
				
			
			if (j == sum) 
				System.out.println(j);
			
			sum = 0; // 置0留着下轮继续使用
		

	

10、题目:一球从h米高度自由落下,每次落地后反跳回原高度的一半;

再落下,求它在 第n次落地时,共经过多少米?第n次反弹多高?

分析:画个草图应该就能分析出来(本题为方便检验将高度h定位100米)。

/**
 *  一球从h米高度自由落下,每次落地后反跳回原高度的一半;
 *再落下,求它在 第n次落地时,共经过多少米?第n次反弹多高?
 */
public class TestDay10 

	public static void main(String[] args) 
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入n");
		int n = scanner.nextInt();
		int sum = 100;// 本题将高度定位100
		int x = 100;
		int i;
		for (i = 1; i < n; i++)  // 3表示第三次落地
			x /= 2;
			sum = sum + x;
		
		if (i == 1) 
			System.out.println("第" + n + "次落地反弹高度" + x / 2);
			System.out.println("第" + n + "次落地经过距离" + sum);
		 else 
			System.out.println("第" + n + "次落地反弹高度" + x); // 反弹高度
			System.out.println("第" + n + "次落地经过距离" + sum);
		 // 经过距离

	

11、题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

分析:别想的太复杂,利用for循环嵌套。

/**
 *题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
 */
public class TestDay11 

	public static void main(String[] args) 
		int count = 0;//用来统计最终结果的个数
		for (int i = 1; i < 5; i++) 
			for (int j = 1; j < 5; j++) 
				for (int k = 1; k < 5; k++) 
					if (i != j && i != k && j != k) 
						System.out.println(i + " " + j + " " + k);
						count++;
					
				
			
		
		System.out.println(count);

	

12、题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%; 40万到60万之间时高于40万元的部分,可提成3%; 60万到100万之间时,高于60万元的部分,可提成1.5%, 高于100万元时,超过100万元的部分按1%提成, 从键盘输入当月利润I,求应发放奖金总数?

分析:算是数学应用题23333。

/**
 *企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;
 *         利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;
 *         20万到40万之间时,高于20万元的部分,可提成5%; 40万到60万之间时高于40万元的部分,可提成3%;
 *         60万到100万之间时,高于60万元的部分,可提成1.5%, 高于100万元时,超过100万元的部分按1%提成,
 *         从键盘输入当月利润I,求应发放奖金总数?
 */
public class TestDay12 
	public static void main(String[] args) 
		Scanner s = new Scanner(System.in);
		System.out.println("请输入月利润(万):");
		int I = s.nextInt(); // 键盘输入利润I
		if (I <= 10) 
			System.out.println(I * 0.1 + "万");
		
		if (I > 10 && I <= 20) 
			System.out.println(1 + (I - 10) * 0.075 + "万");
		
		if (I > 20 && I <= 40) 
			System.out.println(1.75 + (I - 20) * 0.05 + "万");
		
		if (I > 40 && I <= 60) 
			System.out.println(2.75 + (I - 40) * 0.03 + "万");
		
		if (I > 60 && I <= 100) 
			System.out.println(3.35 + (I - 60) * 0.015 + "万");
		
		if (I > 100) 
			System.out.println(3.95 + (I - 100) * 0.01 + "万");
		

	

13、题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?(完全平方数:一个数=另一个数的平方,如121=11^11)。

分析:下面写的是在1-1000内找到符合题干要求的;for循环嵌套。

/**
 *题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
 */
public class TestDay13 
	public static void main(String[] args) 
		int i = 0;
		for (i = 1; i <= 1000; i++) 
			for (int k = 1; k <= 100; k++) 
				if (i + 100 == k * k) 
					// System.out.println(i + " " + k);
					for (int j = 1; j < 100; j++) 
						if (i + 268 == j * j) 
							System.out.println(i);
						
					
				
			
		

	

14、题目:输入某年某月某日,判断这一天是这一年的第几天?

分析:注意平年和闰年。

/**
 *输入某年某月某日,判断这一天是这一年的第几天?
 */
public class TestDay14 

	public static void main(String[] args) 
		Scanner s = new Scanner(System.in);
		System.out.println("请输入年:");
		int year = s.nextInt();
		System.out.println("请输入月:");
		int month = s.nextInt();
		System.out.println("请输入日:");
		int day = s.nextInt();
		int sum = 0;
		int[] arr =  31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ;
		for (int i = 0; i < month - 1; i++) 
			sum += arr[i];
		
		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0 && month >= 3) 
			System.out.println(sum + day + 1);
		 else 
			System.out.println(sum + day);
		

	

15、题目:输入三个整数x,y,z,请把这三个数由小到大输出。

分析:程序里取巧利用了Arrays的一个现成方法直接进行从小到大排序,算是偷懒了。。。

/**
 *题目:输入三个整数x,y,z,请把这三个数由小到大输出。
 */
public class TestDay15 
	public static void main(String[] args) 
		Scanner s = new Scanner(System.in);
		System.out.println("請輸入整數x:");
		int x = s.nextInt();
		System.out.println("請輸入整數y:");
		int y = s.nextInt();
		System.out.println("請輸入整數z:");
		int z = s.nextInt();
		int[] arr = new int[3];
		arr[0] = x;
		arr[1] = y;
		arr[2] = z;
		Arrays.sort(arr); // 利用sort方法。。。。
		for (int i = 0; i <= 2; i++) 
			System.out.print(arr[i]+" ");
		
	

16、题目:输出打印9*9口诀表。

分析:for循环嵌套,可利用"\\t"(制表符)使得输出好看些。

/**
 *输出9*9口诀
 */
public class TestDay16 

	public static void main(String[] args) 
		for (int i = 1; i <= 9; i++) 
			for (int j = 1; j <= i; j++) 
				System.out.print(j + "*" + i + "=" + (j * i)+"\\t");
			
			System.out.println();
		
	

17、题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾, 又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。 以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。 求第一天共摘了多少。

分析:利用递归。

/**
 *题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,
 *         又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
 *         以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。 求第一天共摘了多少。
 */
public abstract class TestDay17 
	public static void main(String[] args) 
		System.out.println("第一天摘了:" + fun(10, 1));
	

	public static int fun(int day, int num) 
		if (day - 1 == 0) 
			return num;
		 else 
			System.out.println("第" + (day - 1) + "天未吃前早上一看还有: " + ((num + 1) * 2));
			return fun(day - 1, (num + 1) * 2);
		
	

18、题目:两个乒乓球队进行比赛,甲队派出a,b,c;乙队派出x,y,z三人,已抽签决定比赛名单,打听到a说他不和x比,c说他不和x,z比,请编程找出三队赛手的名单。

分析:①c说他不和x,z比,说明他只和y比; ②a说他不和x比,但是y和c比了,所以他肯定是和z比; ③那剩下的x就是和b比了

public class TestDay18 
	public static void main(String[] args) 
		String a = null, b = null, c = null;// 甲队成员
		String[] racer =  "x", "y", "z" ;// 乙队成员
		for (int i = 0; i < 3; i++) 
			for (int j = 0; j < 3; j++) 
				for (int k = 0; k < 3; k++) 
					if (i != j && i != k && j != k) 
						a = racer[i];
						b = racer[j];
						c = racer[k];
						if (!a.equals("x") && !c.equals("z") && !c.equals("x")) 
							if (a.equals(racer[i]) && b.equals(racer[j]) && c.equals(racer[k])) 
								System.out.println("a的对手是:" + racer[i] + ",\\nb的对手是:" + racer[j] + ",\\nc的对手是:" + racer[k]);
							
						
					
				
			
		
	

19、题目:打印菱形。

分析:程序以”*“为例打印,找空格和星号之间的规律联系。

/**
 *题目:打印出如下图案(菱形):
   *		3个空格1个*
  ***		2个空格3个*
 *****		1个空格5个*
*******		0个空格7个*	中间最长必为奇数
 *****		1个空格5个*
  ***		2个空格3个*
   *		3个空格1个*
   			
 */
public class TestDay19 

	public static void main(String[] args) 
		String str = "";
		int k = 7 / 2; // 控制上半部分空格时有用
		int q = 1; // 控制下半部分空格时有用
		for (int i = 1; i <= 7; i++)  // 控制上部分
			for (int m = k; m >= 1; m--)  // 控制空格
				System.out.print(" ");
			
			k--;

			for (int j = i; j >= 1; j--) // 控制打印*的个数
				str += "*";
			
			System.out.println(str);
			str = ""; // 防止不断累积*
			i++;
		
		for (int i = 5; i >= 1; i--)  // 控制下部分
			for (int n = 1; n <= q; n++)  // 空格
				System.out.print(" ");
				if (q == 4) 
					break;
				
			
			q++;

			for (int j = i; j >= 1; j--)  // 控制打印*的个数
				str += "*";
			
			System.out.println(str);
			str = "";
			i--;
		

	

20、题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13… 求出这个数列的前20项之和。

分析:抓住分子与分母的变化规律后累加即可,下面参考代码中还用了递归处理。

/**
 *题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13… 求出这个数列的前20项之和。
 * 
 *         程序分析:请抓住分子与分母的变化规律。分数:fraction
 */
public class TestDay20 

	public static void main(String[] args) 
		double sum = 0;
		for (double i = 1; i <= 20; i++) 
			sum += (fun1(i) / fun2(i));
		
		System.out.println(sum);

	

	public static double fun1(double a)  // 递归处理分子
		if (a == 1) 
			return 2;
		
		if (a == 2) 
			return 3;
		 else 
			return fun1(a - 2) + fun1(a - 1);
		
	

	public static double fun2(double a)  // 递归处理分母
		if (a == 1) 
			return 1;
		
		if (a == 2) 
			return 2;
		 else 
			return fun2(a - 2) + fun2(a - 1);
		
	

21、题目:求1+2!+3!+…+20!的和。

分析:累乘后累加,阶乘处理。

/**
 *题目:求1+2!+3!+…+20!的和
 * 
 *         程序分析:累乘。
 */
public class TestDay21 

	public static void main(String[] args) 
		long sum = 0;
		for (int i = 1; i <= 20; i++) 
			sum += fun(i);
		
		System.out.println("1+2!+3!+…+20!的和:" + sum);
	

	public static int fun(int a) 
		int s = 1;
		for (int i = a; a >= 1; a--) 
			s *= a;
		
		return s;
	

22、题目:利用递归方法求5!

分析:还是递归,理解了递归的奥妙就好处理了。

/**
 *题目:利用递归方法求5!。
 */
public class TestDay22 
	public static void main(String[] args) 
		int sum = 1;
		sum *= fun(5);
		System.out.println(sum);
	

	public static int fun(int a) 
		if (a != 1) 
			return a * fun(a - 1);
		 else 
			return 1;
		
	

### 23、题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。 问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁 。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

分析:还是对递归的理解和使用。

/**
 *题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。
 *         问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁
 *         。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
 */
public class TestDay23 

	public static void main(String[] args) 

		System.out.println("第五个人的岁数:" + GetAge(5, 2));

	

	// 递归方法求第五个人的岁数

	private static int GetAge(int num, int ageMore) 

		if (num == 1) // 第一个人岁数为10

			return 10;

		

		return GetAge(num - 1, ageMore) + ageMore;// 每上一个人岁数加2

	

24、题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

分析:参考程序使用.charAt方法。

/**
 *给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
 */
public class TestDay24 
	public static void main(String[] args) 
		Scanner s = new Scanner(System.in);
		System.out.println("请输入一个不多于5的正整数");
		String str = s.nextLine();
		int num = str.length();
		System.out.println("该数是" + num + "位数");
		String newstr = "";
		for (int i = str.length() - 1; i >= 0; i--) 
			newstr += str.charAt(i);
		
		System.out.println("逆序打印:" + "" + newstr);
	

25、题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

题目:输入一个数,判断是否为回文数 如123321, 12321等。

分析:两头开始互相比较。

/**
 *输入一个数,判断是否为回文数 123321 12321
 */
public class TestDay25 

	public static void main(String[] args) 
		Scanner s = new Scanner(System.in);
		System.out.println("请输入一个数:");
		String str = s.nextLine();
		boolean flag = false;
		for (int i = 0, j = str.length() - 1; i < str.length() / 2; i++, j--) 
			char a = str.charAt(i);
			char b = str.charAt(j);
			if (a == b) 
				flag = true;
			 else 
				flag = false;
				break;
			
		
		System.out.println(flag);

	

26、题目:请输入星期几的第一个字母来判断一下是星期几, 如果第一个字母一样,则继续判断第二个字母。

分析:switch case 语句,参考代码以小写字母为例。

/**
 *题目:请输入星期几的第一个字母来判断一下是星期几, 如果第一个字母一样,则继续判断第二个字母。
 */
public class TestDay26 
	public static void main(String[] args) 

		System.out.println("请输入第一个英文字母:");

		Scanner scanner = new Scanner(System.in);

		String input = scanner.next();

		String input2 = "";

		switch (input) 

		case "m":

			System.out.println("Monday");

			break;

		case "t":

			System.out.println("请输入第二个字母:");

			input2 = scanner.next();

			if (input2.equals("u")) 

				System.out.println("Tuesday");

			 else if (input2.equals("h")) 

				System.out.println("Thursday");

			 else 

				System.out.println("你输入的字母有误!");

			

			break;

		case "w":

			System.out.println("Wednesday");

			break;

		case "f":

			System.out.println("Friday");

			break;

		case "s":

			System.out.println("请输入第二个字母:");

			input2 = scanner.next();

			if (input2.equals("u")) 

				System.out.println("Sunday");

			 else if (input2.equals("a")) 

				System.out.println("Saturday");

			 else 

				System.out.println("你输入的字母有误!");

			

			break;

		default:

			System.out.println("你输入的字母不正确!");

			break;

		

		scanner.close();

	

27、题目:求100以内的素数。

分析:素数老生常谈了。

/**
 * 题目:求100之内的素数
 */
public class TestDay27 
	public static void main(String[] args) 
		for (int i = 2; i <= 100; i++)  // 被除数
			boolean flag = true;
			for (int j = 2; j < i; j++)  // 除数
				if (i % j == 0) 
					flag = false;
					break;
				
			
			if (flag == true) 
				System.out.println("素数有:" + i);
			
		
	

28、题目:对10个数进行排序。

分析:for循环,比较交换。

/**
 *题目:对10个数进行排序
 */
public class TestDay28 
	public static void main(String[] args) 
		int[] arr =  7, 2, 3, 1, 9, 4, 6, 5, 8, 10 ; // 给十个数
		for (int j = 0; j < arr.length - 1; j++) 
			int max = arr[0];
			int temp = 0;
			for (int i = 1; i < arr.length; i++) 
				if (max > arr[i]) 
					temp = arr[i - 1];
					arr[i - 1] = arr[i];
					arr[i] = temp;
				 else 
					max = arr[i];
				
			
		
		for (int i = 0; i < arr.length; i++) 
			System.out.println(arr[i]);
		
	

29、题目:求一个3*3矩阵对角线元素之和。

1 2 3 

4 5 6

7 8 9

分析:考察二维数组。

/**
 *题目:求一个3*3矩阵对角线元素之和
 * 1 2 3 
 * 4 5 6 
 * 7 8 9
 */
public class TestDay29 
	public static void main(String[] args) 
		int sum = 0;
		int[][] arr =   1, 2, 3 ,  4, 5, 6 ,  7, 8, 9  ;
		for (int i = 0; i < arr.length; i++) 
			for (int j = 0; j < arr[i].length; j++) 
				if(i == j || i + j == 2) 	// 中间元素只加一遍!
				sum += arr[i][j];
				
			
		
		System.out.println(sum);
	

30、题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

分析:考察数组元素交换,参考程序原数组排序规律为从大到小。

/**
 *有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
 */
public class TestDay30 
	static int[] arr =  9, 7, 6, 2, 1 ;
	static int[] arr2 = new int[arr.length + 1];

	public static void main(String[] args) 
		Scanner s = new Scanner(System.in);
		System.out.println("请输入一个数:");
		int num = s.nextInt(); // 从键盘接一个数
		// 放入新数组:
		arr2[0] = num;
		for (int i = 1, j = 0; i <= arr.length; i++, j++) 
			arr2[i] = arr[j];
		

		if (arr[0] < arr[1])  // 正序
			fun();
		 else  // 倒序
			fun2();
		
	

	// 正序排序操作:
	public static void fun() 
		for (int j = 0; j < arr2.length - 1; j++) 
			int max = arr2[0];
			int temp = 0;
			for (int i = 1; i < arr2.length; i++) 
				if (max > arr2[i]) 
					temp = arr2[i - 1];
					arr2[i - 1] = arr2[i];
					arr2[i] = temp;
				 else 
					max = arr2[i];
				
			
		

		// 对加入新数字后的数组按原先规律操作完后输出查看
		for (int i = 0; i < arr.length + 1; i++) 
			System.out.print(arr2[i]+" ");
		
	

	// 倒序操作
	public static void fun2() 
		for (int j = 0; j < arr2.length - 1; j++) 
			int min = arr2[0];
			int temp = 0;
			for (int i = 1; i < arr2.length; i++) 
				if (min < arr2[i]) 
					temp = arr2[i - 1];
					arr2[i - 1] = arr2[i];
					arr2[i] = temp;
				 else 
					min = arr2[i];
				
			
		
		// 对加入新数字后的数组按原先规律操作完后输出查看
		for (int i = 0; i < arr.length + 1; i++) 
			System.out.print(arr2[i]+" ");
		
	

31、题目:将一个数组逆序输出。

分析:还是考察数组元素交换。

/**
 *  将一个数组逆序输出
 */
public class TestDay31 

	public static void main(String[] args) 
		int[] arr =  6, 2, 4, 5, 3 ;
		int temp = 0;
		for (int i = 0, j = arr.length - 1; i < arr.length / 2; i++, j--) 
			temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		
		for (int i = 0; i < arr.length; i++) 
			System.out.println(arr[i]);
		
	

32、题目:取一个整数a从右端开始的4~7位。

分析:将原来的整数到个序,转换后再求。

public class TestDay32 
    public static void main(String[] args) 
        int a = 12345;
        String str = "";
        String str2 = "";
        str += a;
        for (int i = 0; i < str.length(); i++) 
            str2 = str.charAt(i) + str2; // 将原数倒个序
        
        System.out.println(str2);
        for (int j = 3; j <= 6; j++) 
            System.out.println("第" + (j + 1) + "位為" + str2.charAt(j));// 当
        
    

33、题目:打印出杨辉三角形(要求打印出10行如下图)

1 ​ 1 1 ​ 1 2 1 ​ 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1


/**
*        1
​       1 1
​     1 2 1
​    1 3 3 1
   1 4 6 4 1
1 5 10 10 5 1 
*/
public class TestDay33 
    public static void main(String[] args) 
        int[][] arr = new int[10][10];  //定义一个二维数组
        for (int i = 0; i < 10; i++) 
            for (int j = 0; j < i; j++) 
                if (i >= 2 && j > 0) 
                    arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
                
                arr[i][0] = 1;  //控制最左列和斜边为1
                if (i == j) 
                    arr[i][j] = 1;
                
                System.out.println(arr[i][j] + " ");
            
            System.out.println();
        
    

34、题目:输入3个数a,b,c,按大小顺序输出。

分析:稍微繁琐一点的数值比较。

import java.util.Scanner;

public class TestDay34 
    public static void main(String[] args) 
        Scanner scanner = new Scanner(System.in);
        System.out.println("请依次请输入三个个数:");
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        int c = scanner.nextInt();
        if (a > b && a > c) 
            System.out.println(a + " ");
            if (b > c) 
                System.out.println(b + " " + c);
             else 
                System.out.println(c + " " + b);
            
        
        if (b > a && b > c) 
            System.out.println(b + " ");
            if (a > c) 
                System.out.println(a + " " + c);
             else 
                System.out.println(c + " " + a);
            
        
        if (c > b && c > a) 
            System.out.println(c + " ");
            if (b > a) 
                System.out.println(b + " " + a);
             else 
                System.out.println(a + " " + b);
            
        
    

35、题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

分析:数组元素交换。

public class TestDay35 
    public static void main(String[] args) 
        int[] arr = 5, 2, 6, 7, 3;  //初始化数组
        boolean flag = false;
        int max = arr[0], min = arr[0];
        int temp = 0;
        int i = 0;
        for (i = 1; i < arr.length; i++)   //max
            if (max > arr[i]) 
                continue;
             else 
                max = arr[i];
            
        
        for (i = 1; i < arr.length; i++)   //min
            if (min < arr[i]) 
                continue;
             else 
                min = arr[i];
            
        
        for (int j = 0; j < arr.length; j++)   //change max
            if (arr[j] == max) 
                temp = arr[0];
                arr[0] = arr[j];
                arr[j] = temp;
            
        
        for (int j = 0; j < arr.length; j++)    //change  min
            if (arr[j] == min) 
                temp = arr[arr.length - 1];
                arr[arr.length - 1] = arr[j];
                arr[j] = temp;
            
        
        System.out.println("max=" + max + " " + "min=" + min);
        System.out.println("处理后的结果为:");
        for (int k = 0; k < arr.length; k++) 
            System.out.println(arr[k]);
        
    

36、题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。

分析:还是数组元素交换处理。

public class TestDay36 
    public static void main(String[] args) 
        int[] arr = 1, 2, 3, 4, 5;
        int[] arr2 = new int[5];
        for (int i = 0; i < arr.length; i++) 
            if (i + 2 > 4) 
                arr2[i + 2 - 5] = arr[i];
             else 
                arr2[i + 2] = arr[i];
            
        
        for (int j = 0; j < arr2.length; j++) 
            System.out.println(arr2[j] + " ");
        
    

### 37、题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

分析:数组,循环。

public class TestDay37 
    public static void main(String[] args) 
        int[] arr = 1, 2, 3, 4, 5;
        int count = 0;
        int sum = 0;
        for (int i = 0; i < arr.length; i++) 
            if (arr[i] != 0) 
                count++;
            
            if (count % 3 == 0 && arr[i] != 0) 
                arr[i] = 0;
            
            if (i == 4) 
                i = -1;
            
            if (count == 12) 
                break;
            
        
        for (int j = 0; j < arr.length; j++) 
            System.out.println(arr[j] + " ");
        
    

38、题目:写一个函数,求一个字符串的长度, 在main函数中输入字符串,并输出其长度。

分析:算实考察方法调用吧。。。

public class TestDay38 
    public static void main(String[] args) 
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入字符串:");
        String str = scanner.nextLine();
        System.out.println("字符串长度为:" + fun(str));
    

    private static int fun(String str) 
        int length = str.length();
        return length;
    

39、题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n, 当输入n为奇数时,调用函数1/1+1/3+…+1/n(利用指针函数)。

分析:注意int和double吧。

public class TestDay39 
    public static void main(String[] args) 
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个数:");
        int num = scanner.nextInt();
        System.out.println(fun(num));
    

    private static double fun(int num) 
        double sum = 0;
        if (num % 2 == 0) 
            for (int i = 2; i <= num; i += 2) 
                sum += (double) 1 / i;
            
            return sum;
         else 
            for (int i = 1; i <= num; i += 2) 
                sum += (double) 1 / i;
            
            return sum;
        
    

### 40、题目:按字符串的长度和字母ASKII顺序排序。

分析:compareTo方法的使用。 

public class TestDay40 
    public static void main(String[] args) 
        String[] str = "fb", "abaac", "abaa", "fc", "fa";
        for (int i = str.length - 1; i >= 1; i++) 
            for (int j = 0; j <= i - 1; j++) 
                if (str[j].compareTo(str[j + 1]) < 0) 
                    String temp = str[j];
                    str[j] = str[j + 1];
                    str[j + 1] = temp;
                
            
            for (String subStr : str)
                System.out.println(subStr + " ");
            System.out.println();
        
    

41、题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个, 这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份, 又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

分析:还是递归的理解和使用。

public class TestDay41 
    public static void main(String[] args) 
        fun(5, 6);
    

    private static void fun(int monkynum, int peachnum) 
        if (monkynum != 0) 
            fun(monkynum - 1, peachnum * 5 + 1);
            System.out.println(monkynum + " " + peachnum);
         else 
            System.out.println(monkynum + " " + peachnum);
        
    

42、题目:809??=800??+9??+1 ??代表两位数;8??的结果为两位数,9??的结果为三位数。 求??代表的两位数,及809??后的结果。

分析:算是数学题吧。

public class TestDay42 
    public static void main(String[] args) 
        int x;
        for (x = 0; ; x++) 
            if (x >= 1.25 && x < 12.5 && 9 * x >= 100 && 9 * x < 1000) 
                System.out.println(x);
                break;
            
        
        System.out.println(809 * x);
    

43、题目:求0-7所能组成的奇数的个数。

分析:下面参考程序为简单粗暴的for循环

public class TestDay43 
    static int[] arr = 0, 1, 2, 3, 4, 5, 6, 7;

    public static void main(String[] args) 
        long count = 0;
        int I = 10000000, J = 1000000, K = 100000, M = 10000, N = 1000, X = 100, Y = 10;
        for (int i = 0; i < arr.length; i++) 
            for (int j = 0; j < arr.length; j++) 
                for (int k = 0; k < arr.length; k++) 
                    for (int m = 0; m < arr.length; m++) 
                        for (int n = 0; n < arr.length; n++) 
                            for (int x = 0; x < arr.length; x++) 
                                for (int y = 0; y < arr.length; y++) 
                                    for (int z = 0; z < arr.length; z++) 
                                        long a = arr[i] * I + arr[j] * J + arr[k] * K + arr[m] * M + arr[n] * N + arr[x] * X + arr[y] * Y + arr[z];
                                        if (a % 2 == 1) 
                                            count++;
                                        
                                    
                                
                            
                        
                    
                
            
        
        System.out.println(count);
    

44、题目:一个偶数总能表示为两个素数之和。

分析:基本还是算考察素数。

public class TestDay44 
    public static void main(String[] args) 
        int num = 20;   //一个偶数
        int[] arr = new int[num];   //定义一个数组放找到的所有素数
        int k = 0;  //控制数组下标
        /**
         * 求num以内的所有素数:
         */
        boolean flag = true;
        for (int a = 0; a < num; a++) 
            for (int i = 2; i < a; i++) 
                if (a % i == 0) 
                    flag = false;
                    break;
                
            
            if (flag) 
                System.out.println(a);  //打印看看有哪些是素数
                arr[k] = a;
                k++;//   是素数放进数组
             else 
                flag = true;
            
        
        System.out.println("-----------------");
        
        /**
         * 遍历查看数组中的素数并寻找满足加和为偶数的两个素数:
         */
        for (int i = 0; i < arr.length; i++) 
            for (int j = 0; j < arr.length; j++) 
                System.out.println(arr[i] + " " + arr[j]);
            
        
    

45、题目:字符串连接。

分析:字符串直接通过+号连接。

public class TestDay45 
    public static void main(String[] args) 
        String s1 = "Hello";
        String s2 = "World";
        String s3 = s1 + s2;
        System.out.println(s3);
    

46、题目:输入一个数(1-50),程序打印该数数量的*号。

分析:方法调用,for循环。

public class TestDay46 
    public static void main(String[] args) 
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个1-50的数:");
        int num = scanner.nextInt();
        fun(num);
    

    private static void fun(int num) 
        for (int i = 1; i <= num; i++) 
            System.out.println("*----" + i);
        
    

47、题目:计算字符串中子串出现的次数。

分析:下面参考程序使用了charAt()方法。

public class TestDay47 
    public static void main(String[] args) 
        int count = 0;
        String string = "Hello World! How are you?";
        for (int i = 0; i < string.length(); i++) 
            if (string.charAt(i) == ' ') 
                count++;
            
        
        System.out.println(count);
    

48、题目:输入一个整数后打印(金字塔):假如输入4打印如下:

1

121

12321

1234321

分析:找规律,注意空格即可。

public class TestDay48 
    public static void main(String[] args) 
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个数:");
        int n = scanner.nextInt();
        for (int i = 1; i < n; i++)    //控制行数
            for (int j = n - i; j >= 0; j--)    //控制空格
                System.out.println(' ');
            
            for (int k = 1; k <= 1; k++)     //控制正序
                System.out.println(k);
            
            for (int q = i - 1; q >= 1; q--)    //控制倒序
                System.out.println(q);
            
            System.out.println();
        
    

49、题目:输入一个整数打印,假如输入4打印如下:

1 2 3 4

8 7 6 5

9 10 11 12

16 15 14 13

分析:找规律,注意走S型。

public class TestDay49 
    public static void main(String[] args) 
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个数:");
        int n = scanner.nextInt();            //获取行数
        int x = 0, k;
        for (int i = 0; i < n; i++)          //控制行数
            if (i == 1)                      //控制第一行
                for (int j = 1; j <= n; j++) 
                    System.out.println(j + "\\t");
                    x = j;
                
            
            if (i != 1 && i % 2 == 0)      //控制双数行
                for (k = x + n; k >= x + 1; k--) 
                    System.out.println(k + "\\t");
                
                x = k + n;
            
            if (i != 1 && i % 2 == 1)   //控制单数行
                for (k = x + 1; k <= x + n; k++) 
                    System.out.println(k + "\\t");
                
                x = k - 1;
            
            System.out.println();
        
    

50、题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件"stud"中。

public class TestDay50 
    //定义学生模型
    String[] number = new String[5];
    String[] name = new String[5];
    float[][] grade = new float[5][3];
    float[] sum = new float[5];

    public static void main(String[] args) throws IOException 
        TestDay50 stud = new TestDay50();
        stud.input();
        stud.output();
    

    private void input() throws IOException 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        boolean isRecord = true;
        while (isRecord) 
            try 
                for (int i = 0; i < 5; i++) 
                    System.out.println("请输入学号:");
                    number[i] = br.readLine();
                    System.out.println("请输入名字:");
                    name[i] = br.readLine();
                    for (int j = 0; j < 3; j++) 
                        System.out.println("请输入第" + (j + 1) + "门课成绩:");
                        grade[i][j] = Integer.parseInt(br.readLine());
                    
                    System.out.println();
                    sum[i] = grade[i][0] + grade[i][1] + grade[i][2];
                
                isRecord = false;
             catch (NumberFormatException e) 
                System.out.println("请输入一个数字:");
            
        
    

    /**
     * 输出文件
     */
    private void output() throws IOException 
        FileWriter fw = new FileWriter("D://java50//stud.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write("No. " + "Name " + "grade1 " + "grade2 " + "grade3 " + "average");
        bw.newLine();
        for (int i = 0; i < 5; i++) 
            bw.write(number[i]);
            bw.write(" " + name[i]);
            for (int j = 0; j < 3; j++) 
                bw.write(" " + grade[i][j]);
                bw.write(" " + (sum[i] / 5));
                bw.newLine();
            
            bw.close();
        
    

干货 | 美团 Java 面试 154 道题分享!


  • Java集合22题
  • JVM与调优21题
  • 并发编程28题
  • spring 25题
  • 设计模式 10题
  • springboot 22题
  • Netty10题
  • Redis 16题

Java集合22题

  1. ArrayList 和 Vector 的区别。
  2. 说说 ArrayList,Vector, LinkedList 的存储性能和特性。
  3. 快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么?
  4. hashmap 的数据结构。
  5. HashMap 的工作原理是什么?
  6. Hashmap 什么时候进行扩容呢?
  7. List、Map、Set 三个接口,存取元素时,各有什么特点?
  8. Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用 == 还是 equals()? 它们有何区别?
  9. 两个对象值相同 (x.equals(y) == true),但却可有不同的 hash code,这句话对不对?
  10. heap 和 stack 有什么区别。
  11. Java 集合类框架的基本接口有哪些?
  12. HashSet 和 TreeSet 有什么区别?
  13. HashSet 的底层实现是什么?
  14. LinkedHashMap 的实现原理?
  15. 为什么集合类没有实现 Cloneable 和 Serializable 接口?
  16. 什么是迭代器 (Iterator)?
  17. Iterator 和 ListIterator 的区别是什么?
  18. 数组 (Array) 和列表 (ArrayList) 有什么区别?什么时候应该使用 Array 而不是 ArrayList?
  19. Java 集合类框架的最佳实践有哪些?
  20. Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 还是 equals()?它们有何区别?
  21. Comparable 和 Comparator 接口是干什么的?列出它们的区别
  22. Collection 和 Collections 的区别。

JVM与调优21题

  1. Java 类加载过程?
  2. 描述一下 JVM 加载 Class 文件的原理机制?
  3. Java 内存分配。
  4. GC 是什么? 为什么要有 GC?
  5. 简述 Java 垃圾回收机制
  6. 如何判断一个对象是否存活?(或者 GC 对象的判定方法)
  7. 垃圾回收的优点和原理。并考虑 2 种回收机制
  8. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
  9. Java 中会存在内存泄漏吗,请简单描述
  10. 深拷贝和浅拷贝。
  11. System.gc() 和 Runtime.gc() 会做什么事情?
  12. finalize() 方法什么时候被调用?析构函数 (finalization) 的目的是什么?
  13. 如果对象的引用被置为 null,垃圾收集器是否会立即释放对象占用的内存?
  14. 什么是分布式垃圾回收(DGC)?它是如何工作的?
  15. 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?
  16. 在 Java 中,对象什么时候可以被垃圾回收?
  17. 简述 Java 内存分配与回收策率以及 Minor GC 和 Major GC。
  18. JVM 的永久代中会发生垃圾回收么?
  19. Java 中垃圾收集的方法有哪些?
  20. 什么是类加载器,类加载器有哪些?
  21. 类加载器双亲委派模型机制?

并发编程28题

  1. Synchronized 用过吗,其原理是什么?
  2. 你刚才提到获取对象的锁,这个“锁”到底是什么?如何确定对象的锁?
  3. 什么是可重入性,为什么说 Synchronized 是可重入锁?
  4. JVM 对 Java 的原生锁做了哪些优化?
  5. 为什么说 Synchronized 是非公平锁?
  6. 什么是锁消除和锁粗化?
  7. 为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性?
  8. 乐观锁一定就是好的吗?
  9. 跟 Synchronized 相比,可重入锁 ReentrantLock 其实现原理有什么不同?
  10. 那么请谈谈 AQS 框架是怎么回事儿?
  11. 请尽可能详尽地对比下 Synchronized 和 ReentrantLock 的异同。
  12. ReentrantLock 是如何实现可重入性的?
  13. 除了 ReetrantLock,你还接触过 JUC 中的哪些并发工具?
  14. 请谈谈 ReadWriteLock 和 StampedLock。
  15. 如何让 Java 的线程彼此同步?你了解过哪些同步器?请分别介绍下。
  16. CyclicBarrier 和 CountDownLatch 看起来很相似,请对比下呢?
  17. Java 线程池相关问题
  18. Java 中的线程池是如何实现的?
  19. 创建线程池的几个核心构造参数?
  20. 线程池中的线程是怎么创建的?是一开始就随着线程池的启动创建好的吗?
  21. 既然提到可以通过配置不同参数创建出不同的线程池,那么 Java 中默认实现好的线程池又有哪些呢?请比较它们的异同
  22. 如何在 Java 线程池中提交线程?
  23. 什么是 Java 的内存模型,Java 中各个线程是怎么彼此看到对方的变量的?
  24. 请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性?
  25. 既然 volatile 能够保证线程间的变量可见性,是不是就意味着基于 volatile 变量的运算就是并发安全的?
  26. 请对比下 volatile 对比 Synchronized 的异同。
  27. 请谈谈 ThreadLocal 是怎么解决并发安全的?
  28. 很多人都说要慎用 ThreadLocal,谈谈你的理解,使用 ThreadLocal 需要注意些什么?

spring 25题

  1. 什么是 Spring 框架?Spring 框架有哪些主要模块?
  2. 使用 Spring 框架能带来哪些好处?
  3. 什么是控制反转(IOC)?什么是依赖注入?
  4. 请解释下 Spring 框架中的 IoC?
  5. BeanFactory 和 ApplicationContext 有什么区别?
  6. Spring 有几种配置方式?
  7. 如何用基于 XML 配置的方式配置 Spring?
  8. 如何用基于 Java 配置的方式配置 Spring?
  9. 怎样用注解的方式配置 Spring?
  10. 请解释 Spring Bean 的生命周期?
  11. Spring Bean 的作用域之间有什么区别?
  12. 什么是 Spring inner beans?
  13. Spring 框架中的单例 Beans 是线程安全的么?
  14. 请举例说明如何在 Spring 中注入一个 Java Collection?
  15. 如何向 Spring Bean 中注入一个 Java.util.Properties?
  16. 请解释 Spring Bean 的自动装配?
  17. 请解释自动装配模式的区别?
  18. 如何开启基于注解的自动装配?
  19. 请举例解释@Required 注解?
  20. 请举例解释@Autowired 注解?
  21. 请举例说明@Qualifier 注解?
  22. 构造方法注入和设值注入有什么区别?
  23. Spring 框架中有哪些不同类型的事件?
  24. FileSystemResource 和 ClassPathResource 有何区别?
  25. Spring 框架中都用到了哪些设计模式?

设计模式 10题

  1. 请列举出在 JDK 中几个常用的设计模式?
  2. 什么是设计模式?你是否在你的代码里面使用过任何设计模式?
  3. Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
  4. 在 Java 中,什么叫观察者设计模式(observer design pattern)?
  5. 使用工厂模式最主要的好处是什么?在哪里使用?
  6. 举一个用 Java 实现的装饰模式(decorator design pattern)?它是作用于对象层次还是类层次?
  7. 在 Java 中,为什么不允许从静态方法中访问非静态变量?
  8. 设计一个 ATM 机,请说出你的设计思路?
  9. 在 Java 中,什么时候用重载,什么时候用重写?
  10. 举例说明什么情况下会更倾向于使用抽象类而不是接口

springboot 22题

  1. 什么是 Spring Boot?
  2. Spring Boot 有哪些优点?
  3. 什么是 JavaConfig?
  4. 如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
  5. Spring Boot 中的监视器是什么?
  6. 如何在 Spring Boot 中禁用 Actuator 端点安全性?
  7. 如何在自定义端口上运行 Spring Boot 应用程序?
  8. 什么是 YAML?
  9. 如何实现 Spring Boot 应用程序的安全性?
  10. 如何集成 Spring Boot 和 ActiveMQ?
  11. 如何使用 Spring Boot 实现分页和排序?
  12. 什么是 Swagger?你用 Spring Boot 实现了它吗?
  13. 什么是 Spring Profiles?
  14. 什么是 Spring Batch?
  15. 什么是 FreeMarker 模板?
  16. 如何使用 Spring Boot 实现异常处理?
  17. 您使用了哪些 starter maven 依赖项?
  18. 什么是 CSRF 攻击?
  19. 什么是 WebSockets?
  20. 什么是 AOP?
  21. 什么是 Apache Kafka?
  22. 我们如何监视所有 Spring Boot 微服务?

Netty10题

  1. BIO、NIO和AIO的区别?
  2. NIO的组成?
  3. Netty的特点?
  4. Netty的线程模型?
  5. TCP 粘包/拆包的原因及解决方法?
  6. 了解哪几种序列化协议?
  7. 如何选择序列化协议?
  8. Netty的零拷贝实现?
  9. Netty的高性能表现在哪些方面?
  10. NIOEventLoopGroup源码?

Redis 16题

  1. 什么是redis?
  2. Reids的特点
  3. Redis支持的数据类型
  4. Redis是单进程单线程的
  5. 虚拟内存
  6. Redis锁
  7. 读写分离模型
  8. 数据分片模型
  9. Redis的回收策略
  10. 使用Redis有哪些好处?
  11. redis相比memcached有哪些优势?
  12. redis常见性能问题和解决方案
  13. MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
  14. Memcache与Redis的区别都有哪些?
  15. Redis 常见的性能问题都有哪些?如何解决?
  16. Redis 最适合的场景






以上是关于Java基础编程题50道题的主要内容,如果未能解决你的问题,请参考以下文章

50道最有价值的Java面试题, 附详细答案

Java算法编程50题

Java算法编程50题

需掌握 - JAVA算法编程题50题及答案

java 编程题集

干货 | 美团 Java 面试 154 道题分享!