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用于字符串拼接的场景,提升空间利用率。
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);
}
}