小节练习题

练习一

String反转将abcdef反转成aedcf
编写public static String reverse(String str ,int start,int end){}方法完成
String str = “abcdef”;
思路分析:
1.将String字符串转成char数组
2.从start下标开始到end下标结束,一个++一个–,开始交换,设置条件end不能大于等于start

public class test2 {
    public static void main(String[] args) {
        String str = "abcdef";
        str = reverse(str,1,4);
        System.out.println(str);
    }
    public static String reverse(String str ,int start,int end){
        char[] chars = str.toCharArray();
        for (int i = start,j = end ;i<j;i++,j-- ){
            char index;
            index = chars[i] ;
            chars[i] = chars[j];
            chars[j] = index;
        }
        return new String(chars);
    }
}

练习二

输入用户名,密码,邮箱,如果信息录入正确,则提示注册成功,否则生成异常对象
要求:

  1. 用户名长度为2~4
  2. 密码长度为6,要求全是数字
  3. 邮箱中包含@和.并且@在.的前面

思路分析:
1.编写一个效验的方法,将所有参数传进去
2.如果有一个不满足规则,就抛出异常

public class HomeWork {
    public static void main(String[] args) {
        String name = "win";
        String pwd = "123456";
        String email = "[email protected]";
        try {
            inspect(name,pwd,email);
            System.out.println("注册成功~");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    public static void inspect(String name ,String pwd,String email){
        //最基本的
        if (name == null || pwd ==null || email==null) {
            throw new RuntimeException("参数不能为空");
        }
        //第一关,获取name的长度,添加限制条件
        if (!(name.length()>=2 && name.length()<=4)){
            throw new RuntimeException("用户名长度只能在2~4之间");
        }
        //第二关,另写一个方法判断将密码转成char数组,使用编码表对应的数字,判断在什么区间
        if (!(pwd.length() == 6 && isNum(pwd))) {
            throw new RuntimeException("需要长度为6的全数字");
        }
        //第三关,获取@和.的下标位置。@的下标必需大于.的下标
        int i = email.indexOf('@');
        int j = email.indexOf('.');
        if (i>0 && i>j) {
            throw new RuntimeException("必须包含@和.且@在.前面");
        }
    }
    public static boolean isNum(String pwd){
        try {
            Integer integer = new Integer(pwd);
            return true;
        } catch (NumberFormatException e) {
            throw new RuntimeException("需要长度为6的全数字");
        }
    }
}

练习三

要求将输入的“WINER UINER ROOT”,以ROOT,WINER .U的格式输入
思路分析:
使用split方法按空格分割成 String数组
然后使用format方法定义格式

public class HomeWork2 {
    public static void main(String[] args) {
    String str ="WINER UINER ROOT";
    forMatS(str);
    }
    public static void forMatS(String str){
        String[] s = str.split(" ");
        if (s.length!=3){
            System.out.println("请输入正确的格式:XXX XXX XXX");
            return;
        }
        String format = String.format("%s,%s.%c", s[2], s[0], s[1].toUpperCase().charAt(0));
        System.out.println(format);
    }
}

练习四

写一个判断一个字符串中有多少个小写字母多少个大写字母多少个数字的方法
根据ascll表:
‘0’~‘9’之间是数字
‘a’~‘z’之间是小写字母
‘A’~‘Z’之间是大写字母

public class HomeWoek3 {
    public static void main(String[] args) {
        String str = "123u iII";
        how(str);
    }
    public static void how (String str){
        if (str == null){
            System.out.println("不能为空");
            return;
        }
        int numCount = 0;
        int lowCount = 0;
        int upCount  = 0;
        int other = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) >= '0' && str.charAt(i)<= '9'){
                numCount++;
            }else if(str.charAt(i) >= 'a' && str.charAt(i)<= 'z'){
                lowCount++;
            }else if(str.charAt(i) >= 'A' && str.charAt(i)<= 'Z'){
                upCount++;
            }else {
                other++;
            }
        }
        System.out.println("数字有"+numCount+"个,"+"小写有"+lowCount+"个,"+"大写有"+upCount+"个"+"其他有"+other+"个");
    }
}

练习五

写出以下运行结果

public class HomeWork2 {
    public static void main(String[] args) {

        String s1 = "abcde";
        Animal a = new Animal("s1");
        Animal b = new Animal("s1");
        System.out.println(a==b);//false
        System.out.println(a.equals(b));//false,因为这里调用的是Animal的equals方法,不是String重写后的。所以本质上还是对比对象的地址
        System.out.println(a.name == b.name);//true,对比的是常量池的地址
        String s2 = new String("abced");
        String s3 = "abcde";
        System.out.println(s1 == s2);//false,因为s1是直接指向常量池的,而s2是指向堆的,堆中的value才指向常量池
        System.out.println(s2 == s3);//false,因为s3是直接指向常量池的,而s2是指向堆的,堆中的value才指向常量池
        String t1 = "hello"+s1;//当两个字符串拼接时,编译器会先使用StringBuilder生成一个对象,然后将两个字符串拼接,在常量池中生存一个拼接后的字符串,所以t1指向堆中的StringBuilder,而这个对象的value才指向常量池的helloabcde
        String t2 = "helloabcde";//因为前面生成过了,所以不会重新生成,t2直接指向常量池的helloabcde
        System.out.println(t1 == t2);//因为t1是指向堆的,t2是指向常量池的。所以是false
        System.out.println(t1.intern() == t2);//intern方法会直接返回value的指向地址,所以是true
    }
}
class Animal{
    String name;
    public Animal(String name){
        this.name = name;
    }
}

你可能感兴趣的:(JAVASE,All,java)