Java一些小实验,简单代码

文章标题

一、一些小知识点

1、栈和堆

栈:存储的是局部变量。使用完毕,立即回收。
堆:存储的是new出来的东西。实体,对象。有内存地址。
每一个对象都是有首地址的。每一个对象都是有默认值的。
使用完毕后,会被垃圾回收器在空闲的时候回收。

2、成员变量和局部变量的区别:

A: 在类中的位置不同
成员变量:类中,方法外
局部变量:方法中或者方法声明上(形式参数)

B: 在内存中的位置不同
成员变量:堆内存
局部变量:栈内存
C: 生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D: 初始化值的问题
成员变量:有默认值
局部变量:没有默认值。必须先定义,赋值,最后使用

3、Object

Object:是类层次结构中的根类,所有的类都直接或者间接的继承自该类。
如果一个方法的形式参数是 Object,那么这里我们就可以传递它的任意的子类对象。

4、字符串遍历

字符串的遍历:
A: 使用length ( ) 和charAt( ):char ch=string.charAt(i);
B: 把字符串转换为字符数组,然后遍历数组:char[] chs = s.toCharArray();,再遍历chs数组

5、eclipse快捷生成构造方法

(1)自动生成构造方法:
代码区域右键 – Source – Generate Constructors from Superclass…
(2)无参构造方法
代码区域右键 – Source – Generate Constructor using Fields…
带参构造方法

(3)自动生成 getXxx()/setXxx():
代码区域右键 – Source – Generate Getters and Setters…

6、要学会看 一些方法的源码

了解一些方法是怎么实现的,提高阅读代码的能力,参考学习标准代码的写法

在eclipse中,将鼠标放在想要查看的方法上,按住ctrl键,选择 “Open Implementation” 打开实现类,再选择对应包下的方法

前提是先将eclipse和源码路径关联

7、多线程

1、Thread
String getName() 返回该线程的名称。
void setName(String name) 改变线程名称,使之与参数 name 相同。

2、实现线程

(1) 继承 Thread类

通过 API 中搜索,查到 Thread 类。通过阅读 Thread 类中的描述。Thread 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。

A:创建线程的步骤:
1.定义一个类继承 Thread。
2.重写 run 方法。
3.创建子类对象,就是创建线程对象。
4.调用 start 方法,开启线程并让线程执行,同时还会告诉 jvm 去调用 run 方法

(2)实现 Runnable 接口,该类实现 run 方法。

​ 然后创建 Runnable 的子类对象,传入到某个线程的构造方法中,开启线程。

​ 查看 Runnable 接口说明文档:Runnable 接口用来指定每个线程要执行的任务。包含了一个 run 的无参数抽象方法,需要由接口实现类重写该方法。

创建线程的步骤。
1、定义类实现 Runnable 接口。
2、覆盖接口中的 run 方法。。
3、创建 Thread 类的对象
4、将 Runnable 接口的子类对象作为参数传递给 Thread 类的构造函数。
5、调用 Thread 类的 start 方法开启线程。

3、多线程安全性问题出现的原因
要有多个线程
要有被多个线程所共享的数据
多个线程并发的访问共享的数据

synchronized:同步(锁),可以修饰代码块和方法,被修饰的代码块和方法一旦被某个线程访问,则直接锁住,其他的线程将无法访问

同步:安全性高,效率低(有开锁关锁的步骤)
非同步:效率高,但是安全性低

(1)使用同步代码块解决

synchronized(锁对象){
   
   //需要同步的代码
}

注意:锁对象需要被所有的线程所共享

(2)使用同步方法

格式:
修饰符 synchronized 返回值 方法名(){
   

}

同步方法:使用关键字 synchronized 修饰的方法,一旦被一个线程访问,则整个方法全部锁住,其他线程则无法访问

注意
非静态同步方法的锁对象是 this
静态的同步方法的锁对象是当前类的字节码对象

8、类名不能与API类名相同

我在写这个类的时候,偷懒直接给类名起为Random.java,然后在代码int number = r.nextInt(100)+1;报错说The method nextInt(int) is undefined for the type RandomTest,查了查之后,发现是,类名最好不要和API类名相同,如果要使用,要使用全路径,否则会把Java提供的类给覆盖掉,而自己又没有重写nextInt()方法。

二、一些小实验

1.Java打印水仙花数,并统计水仙花数的个数

package huan01;


/*
*  打印水仙花数
* 什么是水仙花数呢?
*  所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
* 举例:153 就是一个水仙花数。
* 153 = 1*1*1 + 5*5*5 + 3*3*3
 * 
 * 
 * 个位:153%10 = 3;
*  十位:153/10%10 = 5;
*  百位:153/10/10%10 = 1;
*  千位:...
*  万位:...
 * 
 * */

public class ForSum01 {
   

	public static void main(String[] args) {
   
		int count=0;
		for (int i = 100; i < 1000; i++) {
   
		    int a=i % 10;
			int b=i/10 %10;
			int c=i/10/10%10;
			if ( (a*a*a + b*b*b + c*c*c )== i) {
   
				System.out.println(i+"这个数是水仙花数");
				count++;
				
			}	
		}
		System.out.println("水仙花总数为:"+count);	
	}
}

2. 系统产生一个 1-100 之间的随机数,请猜出这个数据是多少

我在写这个类的时候,偷懒直接给类名起为Random.java,然后在代码int number = r.nextInt(100)+1;报错说The method nextInt(int) is undefined for the type RandomTest,查了查之后,发现是,类名最好不要和API类名相同,如果要使用,要使用全路径,否则会把Java提供的类给覆盖掉,而自己又没有重写nextInt()方法。

package huan01;
import java.util.*;

// 系统产生一个 1-100 之间的随机数,请猜出这个数据是多少

public class RandomTest {
   

	public static void main(String[] args) {
   
		// 系统产生一个随机数 1-100 之间的。
		
		Random r=new Random();
		int number = r.nextInt(100)+1;    //获取随机数[1,100]
		
		while(true) {
                   //猜中就结束
			System.out.println("请输入你要猜的数字:");
			Scanner scanner=new Scanner(System.in);
			
			int guessNumber=scanner.nextInt();
			
			if (guessNumber > number) {
   
				System.out.println("你输入的"+guessNumber+"大了");
			}
			if (guessNumber < number) {
   
				System.out.println("你输入的"+guessNumber+"小了");
			}
			if (guessNumber == number) {
   
				System.out.println("猜中!");
				break;
			}
			System.out.println();
			
		}
	}

}

3. 打印5位数中的回文数

package huan01;

import java.util.concurrent.CountDownLatch;

/*
 *  需求:打印 5 位数中的所有回文数。
* 什么是回文数呢?举例:12321 是回文数,个位与万位相同,十位与千位相同。
 * 
 * */

public class HuiWenShu {
   
	public static void main(String[] args) {
   
		
		int count=0;
		for (int i = 10000; i < 100000; i++) {
   
			int ge=i%10;
			int shi=i/10%10;
			int qian=i/10/10/10%10;
			int wan=i/10/10/10/10%10;
			
			if ((ge == wan) && (shi == qian)) {
   
				System.out.println(i+"是回文数");
				count++;
			}	
		}
		System.out.println("共有"+count+"个五位数的回文数");
		
	}
}

4. 不死神兔问题

**需求:**有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又
生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
**规律:**从第三个月开始,每个月的兔子对数是前两个月的兔子对数之和。
第一个月和第二个月的兔子对数是 1

package huan01;


/*
 *  需求:
* 有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又
生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
 * */
/*规律:从第三个月开始,每个月的兔子对数是前两个月的兔子对数之和。
          第一个月和第二个月的兔子对数是 1
 * */

public class Rabbit {
   
	public static void main(String[] args) {
   
	   int[] a=new int[20];
	
	   a[0]=1;
	   a[1]=1;
	   
	   for (int i = 2; i < a.length; i++) {
   
		a[i]=a[i-1]+ a[i-2];
	    }
	   System.out.println("第二十个月兔子的数目为:"+a[19]);
	}
}

5. 数组反转

package huan01;

import java.util.Scanner;


public class ReverseArray {
   
	
	public static void main(String[] args) {
   
		int[] a=new int[5];
		input(a);
		reverse(a);
		print(a);
		
	}
	
	//输入
	public static void input(int[] a) {
   
		System.out.println("输入长度为5的数组");
		Scanner sc=new Scanner(System.in);
		
		for (int i = 0; i < a.length; i++) {
   
			System.out.println("输入第"+(i+1)+"个数:");
			a[i]=sc.nextInt();
		}	
	}
	
	//反转数组
	public static void reverse(int[] a) {
   
		for (int start = 0,end=a.length-1; start <= end; start++,end--) {
   
			int temp=a[start];
			a[start]=a[end];
			a[end]=temp;
		}
	}
	
	//打印数组
	public static void print(int[] a) {
   
		for (int i = 0; i < a.length; i++) {
   
			System.out.println("数组第"+(i+1)+"位为:"+a[i]);
		}
	}
}

6. 模拟用户登录

输入密码和账号,验证是否和存储的密码账号一致,当输入两次以后,锁定账号

package huan01;

import java.util.Scanner;

/*模拟登录,给三次机会,并提示还有几次。
 * */
public class UserLoad {
   
	public static void main(String[] args) {
   
		// 已经存在的用户名和密码
		String username = "admin";
		String password = "admin";
		
		//键盘录入用户名和密码
	   int i=2;
	   while(i>0) {
   
	    	Scanner sc= new Scanner(System.in);
	    	System.out.println("请输入用户名");
	    	String name=sc.nextLine();
	    	System.out.println("请输入密码:");
	    	String pwd=sc.nextLine();
	    	if (name.equals(username) && password.equals(pwd)) {
   
				System.out.println("输入正确");
				break;
			}
	    	else {
   
				System.out.println("密码或账号输入错误");
			}
	    	i--;
	    }
	    if(i == 0) {
   
	    	System.out.println("您的账号已锁定,请联系管理员!");
	    }

	}

}

7. 字符串大小写转换

键盘录入一个字符串,把该字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)

package huan01;

import java.util.Scanner;


/* 键盘录入一个字符串,把该字符串的首字母转成大写,
 * 其余为小写。(只考虑英文大小写字母字符)
 * */
public class StringExchange {
   
	public static void main(String[] args) {
   
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入字符串:");
		String string=sc.nextLine();
		
		String s1=string.substring(0,1);        //第一个字母
		
		String s2=string.substring(1,string.length());    //首字母剩下的字符串
		//String s2=string.substring(1);
		String s3=s1.toUpperCase()+s2.toLowerCase();
		
		System.out.println("转换后的字符串为"+s3);
	
	}

}

8、StringBuilder的一些小实验

(1)StringBuilder 和 String 的相互转换
(2)把数组拼接成一个字符串(直接用字符串拼接会造成内存浪费,还耗时)
(3)把字符串反转
(4)判断一个字符串是否是对称字符串
package huan01;

import java.util.Scanner;

/**
* @author huan
* @version 创建时间:2020年3月11日 下午9:56:45
* 
*/
public class StringBuilderTest {
   
	public static void main(String[] args) {
   
		System.out.println("选择1是StringBuilder 和 String 的相互转换");
		System.out.println("选择2是 把数组按照格式拼接成一个字符串");
		System.out.println("选择3是把字符串反转 ");
		System.out.println("选择4是判断字符串是否是对称的");
		System.out.println("请选择:");
		
		Scanner sc = new Scanner(System.in);
		int i = sc.nextInt();
		switch (i) {
   
		case 1:
			BuildtoString()
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值