第五章 常用类

1.练习回顾

农民摘西瓜:
①定义农民的类(Farmer)

  --------------------------
  成员属性:name (农民的名字)
  静态属性:count (西瓜的个数)

  定义有参构造方法: 用于给name属性初始化数据
  定义无参无返回值的成员方法: pick  (摘西瓜)
  调用pick方法时,提示摘了一个西瓜,并将count的数量加1

②定义测试类
  创建两个农民对象
  调用两个对象的pick方法,完成摘西瓜的处理
  最后,输出两个人一共摘了多少西瓜

 Farmer类:

public class Farmer {
    String name;
    static int count = 0;

    public Farmer(String name){
        this.name = name;
    }
    public void  pick(){
        System.out.println(this.name+"摘了一个西瓜!");
        count++;
    }
}

测试类Test:

public class Test {
    public static void main(String[] args) {
        Farmer farmer1 = new Farmer("农夫a");
        Farmer farmer2 = new Farmer("农夫b");
        farmer1.pick();
        farmer2.pick();
        farmer1.pick();
        System.out.println("一共摘了"+ Farmer.count+"个西瓜!");
    }
}

2.String

基本数据类型(四类八种): 不属于Object类型的继承体系之下;

引用数据类型(字符串,数组,自定义类型):属于对象类型Object类型的继承体系之下。

 基本类型的变量存储的是数据,引用类型的变量存储的是数据的地址。

2.1.String 字符串对象,特点:

①字符串不可变;

②每一个字符串都是String类的实例对象;

③正是因为字符串是不可变的,所以字符串是共享的;

④字符串的效果上相当于一个char[ ]数组,但是他的底层原理是byte[ ]字节数组。

2.2.创建字符串的2种常用方法:

①最常用的直接创建 String str = ”ABC“;

注:直接使用双引号的就是字符串对象,即便是没有new。

②通过构造方法创建

        String str = new String("abc");

 2.3.字符串常用的方法

方法名含义
public int length(){}
获取字符串中字符的个数,拿到字符串长度
public String concat(String str){}
将当前字符串与参数字符串拼接,得到一个新的字符串
public char charAt(int index){}
返回指定索引位置的单个字符(索引从0开始)
public int indexOf(String str){}
查找参数字符串在本字符串中首次出现的索引位置,如果没有则返回-1
public String substring(int index){}
截取从参数位置一直到字符串末尾。返回新的字符串
public String substring(int begin ,int end) {}
截取从开始索引到结束索引之间的字符串,返回新的字符串。区间:前闭后开
public boolean endsWith(String str){}
判断字符串是否以指定的字符串结尾
public boolean startsWith(String str){}
判断字符串是否以指定的字符串开头
public String trim(){}
清除左右两端的空格,并返回清除空格后的字符串
replace(oldStr,newStr){}
将所有出现的老字符串替换成新的字符串,并返回结果字符串。
public String[] split(String regex){}
按照参数的规则将字符串拆分成若干部分,返回一个数组。

2.4.字符串的比较

比较方式:==与equals方法

==:

①基本数据类型,比较的是值(变量中的值);

②引用数据类型,比较的是变量中存储的数据的地址。

equals:

比较的是具体的内容。

测试:

public class Test {
    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";
        String str3 = new String("abc");
        System.out.println(str1==str2);
        System.out.println(str1==str3);
        System.out.println(str1.equals(str3));
    }
}

结果:

原因:

①栈中存变量,new的对象(str3)存在堆中,常量保存在常量池中,在Java中字符串就是常量;

②String str1 = "abc";  先去常量池中找”abc“是否存在,不存在,就创建;
String str2 = "abc"; 先去常量池中找”abc“ 是否存在,存在直接引用;
④String str3 = new String("abc"); 只要使用new就会在堆区创建一个新的对象,再去找”abc“是否存在;
⑤虽然这个三个都是引用的同一个常量 字符串,但是str3和其他两个的地址是不同的使用”==“比较就不能起到比较内容的作用。

 小结:

①String str = "abc";
问: 这句代码创建了几个对象?
0 个或 1 个,如果常量池中有 "abc" 了就是 0 个,如果之前没有就是 1 个;
②String str = new String("abc");
问: 这句代码创建了几个对象?
答:  1 个或 2 个,只要 new ,就会创建一个对象,另外看 "abc" 在常量池中是否存在.

2.5 StringBuilder和StringBuffer

        由于在Java中字符串就是常量,所以就算对一个字符串进行操作,原来的字符串还是不会改变,只不过有生成了新的字符串。

问题:当拼接字符串操作时,因为字符串是不可变的,所以当我们拼接字符串时,每拼一次就会在常量池中生成一个新的字符串,开辟一块新的内存空间,如果拼接一亿次,就会开辟很多内存空间,造成严重的浪费(浪费时间,浪费内存空间)。

解决:通过StringBuilder和StringBuffer用于字符串拼接的场景,提升空间利用率。

区别:StringBuilder线程不安全,性能高;StringBuffer线程安全,性能低。

2.6.练习

2.6.1 输出100~999之间的回文数

public class Test1 {
    public static void main(String[] args) {
        for (int i = 100; i <1000; i++) {
            StringBuffer stringBuffer = new StringBuffer(String.valueOf(i));
            String str = stringBuffer.toString();
            if(str.equals(stringBuffer.reverse().toString())){
                System.out.println(i);
            }
        }
    }
}

String.valueOf():由基本数据型态转换成String;

toString():把非字符串的数据类型转化为字符串;

reverse():实现字符串的反转。

2.6.2 把css样式,换成js的样式写法

测试类:

public class Test {
    public static void main(String[] args) {
        System.out.println(MyUtil.conUp("left"));
        String str1 = "border-top-width";
        String str2 = ": 1px;";
        //对String的方法的一些练习
        System.out.println(str1.length());
        System.out.println(str1.concat(str2));
        System.out.println(str1.charAt(10));
        System.out.println(str1.indexOf("a"));
        System.out.println(str1.substring(10));
        System.out.println(str1.substring(10,14));

        String[] st = str1.split("-");

        String res = "";

        for (int i = 0; i < st.length; i++) {
            if(i==0){
                res+=st[i];
            }else {
                res += MyUtil.conUp(st[i]);
            }
        }
        System.out.println(res);
    }
}

工具类:

public class MyUtil {
    public static String conUp(String str){
        String firstLetter = String.valueOf(str.charAt(0)).toUpperCase();
        String otherLetter = str.substring(1);
        return firstLetter+otherLetter;
    }
}

3.日期及格式化

3.1日期

格式字符串:

y : 代表年
M: 代表月
d : 代表日
E : 代表星期
H : 代表24进制的小时
h : 代表12进制的小时
m : 代表分钟
s :  代表秒
S : 代表毫秒

 工具包:java.util.Date;

//获取一个日期对象
Date date = new Date();
System.out.println(date);

 3.2 SimpleDateFormat类

功能:格式化和解析日期

①将Data类型的日期格式转化成我们需要的日期类型,一般是字符串类型;

②将字符串类的日期在转回来。

方法名描述
format(Date date)
将date型转换成特定格式的字符串
parse(String str)
将字符串str转换成特定格式的date型
public class Test2 {
    public static void main(String[] args) {
        Date d = new Date();
        System.out.println(d);
        SimpleDateFormat sdf = new SimpleDateFormat("G y-M-d E H:m:s S");
        String res = sdf.format(d);
        System.out.println(res);
    }
}
public class Test {
    public static void main(String[] args) throws ParseException {
        String str1 = "2014-7-8";
        SimpleDateFormat sdf = new SimpleDateFormat("y-M-d");
        Date d1 = sdf.parse(str1);
        System.out.println(d1);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值