字符串类(跟着源代码学习)
-
String 的深入学习(构造器—> 学习常用方法 ------->)
- 构造器
//无参构造器 public String() { this.value = new char[0]; } //string类型的构造器 public String(String original) { this.value = original.value; this.hash = original.hash; } //char类型构造器 public String(char value[]) { this.value = Arrays.copyOf(value, value.length); }
- 成员变量
-
//string底层 还是char数组 private final char value[]; private int hash; // Default to 0
-
方法
//length方法 返回此字符串的长度。长度等于字符串中Unicode 代码单元的数量。 public int length() { return value.length; } //这个对象(它已经是一个字符串!)本身被返回。返回值:字符串本身。 public String toString() { return this; } //判断是否为空 public boolean isEmpty() { return value.length == 0; } //从 dstBegin 开始将此字符串中的字符复制到 dst。此方法不执行任何范围检查。 void getChars(char dst[], int dstBegin) { System.arraycopy(value, 0, dst, dstBegin, value.length); } //使用平台的默认字符集将此String编码为字节序列,并将结果存储到新的字节数组中。 public byte[] getBytes() { return StringCoding.encode(value, 0, value.length); } //测试此字符串是否以指定的前缀开头 public boolean startsWith(String prefix) { return startsWith(prefix, 0); } public boolean contains(CharSequence s) { return indexOf(s.toString()) > -1; } //测试此字符串是否以指定的后缀结尾。 public boolean endsWith(String suffix) { return startsWith(suffix, value.length - suffix.value.length); } //当且仅当此字符串包含指定的 char 值序列时才返回 true public boolean contains(CharSequence s) { return indexOf(s.toString()) > -1; } //围绕给定正则表达式的匹配拆分此字符串,返回数组 public String[] split(String regex, int limit) { }
需求:练习String str = “ 我爱学-Java ”
-
判断字符串是否为空字符串
-
通过 - 将字符串分隔开
-
去除字符串里面的空格
-
判断字符串是否包含java
StringBuilder
-
StringBuilder 也是final修饰的,char[]数组不是final修饰的,所以是可变的
-
默认不传参,初始 8 个字节
-
@Override //常用 public StringBuilder append(String str) { super.append(str); return this; }
需求:拼接十万次"-"
string需要5631ms,stringbuilder需要7毫秒
/*
需求:拼接十万次"-"
* */
public class StringBuilderDemo2 {
public static void main(String[] args) {
long beginTime = System.currentTimeMillis();
// String str = "-";
// for (int i = 0; i < 100000; i++) {
// str += "-";
// }
// System.out.println(str);
StringBuilder sb = new StringBuilder("-");
for (int i = 0; i < 100000; i++) {
sb.append("-");
}
System.out.println(sb);
long endTime = System.currentTimeMillis();
System.out.println(endTime-beginTime); //5631 //7
}
}
StringBuilder 和 StringBuffer 的区别
-
StringBuffer 是线程安全的,适合在多线程环境中使用
-
StringBuilder 是非线程安全的
选择情况:
多线程环境优选StringBuffer,单线程使用StringBuilder
基本类型的包装类型
- 问题
- 一切皆对象? int age = 18;
- 给一个 9999转换成二进制,太麻烦
- double 类型,默认值是0.0 ,如果是考试缺考需要0分,怎么表示?
- 基本数据类型,缺少对象。包装类型
- number 类里面定义了求基本类型值的 方法
Integer(int)
- 常用方法
Integer.valueOf(5);
int i1 = new Integer(6).intValue();
- 自动拆箱和装箱
int a = 10;
Integer integer = Integer.valueOf(a); //装箱
System.out.println(integer);
//自动装箱
Integer i = 10;
Integer integer1 = Integer.valueOf(10); //把int类10,转化成Integer对象
//自动拆箱
Integer integer2 = new Integer(3);
int i1 = integer2;
//实际上 底层调用了 intValue() 方法。 int i2 = integer2.intValue(); 把Integer类型的integer2转变成int类型的i2
- 整数类型有一个常量池
缓存值
[-128,127]
String int Integer 之间的相互转换
String str = "99";
Integer integer = Integer.valueOf(str); //String 转 Integer
int i = integer; //Integer 转 int
String s = i + "33"; //int 转 String
注意:int 和 Integer 不是一个数据类型(里面存在自动拆箱和装箱),int 是在栈里,Integer是在堆里面的。
建议:实际开发中建议使用Integer
日期处理
-
获取当前系统的时间 new Date() (底层实现:System.currentTimeMillis())
//打印符合中国人习惯的时间格式 @Deprecated public String toLocaleString() { DateFormat formatter = DateFormat.getDateTimeInstance(); return formatter.format(this); } //2022-5-9 10:42:25
-
格式化操作 SimpleDateFormat
-
yyyy-MM-dd HH:mm:ss
层次结构:
-
常用方法:
-
//把日期变成字符串 public final String format(Date date){} //把字符串变成日期 public Date parse(String source){}
-
Calender 日历类
-
获取当前日历对象
-
Calendar instance = Calendar.getInstance();
-
-
获取当前的时间
Date time = instance.getTime();
public class CalenderDemo {
public static void main(String[] args) {
Calendar instance = Calendar.getInstance();
Date time = instance.getTime();
System.out.println(time.toLocaleString());
System.out.println(instance);
int year = instance.get(Calendar.YEAR);
System.out.println(year);
int month = instance.get(Calendar.MONTH) + 1;
System.out.println(month);
int date = instance.get(Calendar.DATE);
System.out.println(date);
}
}
工具类的设计
- 日期工具类的设计
- 需求:录入五个员工,建立一个员工类 Employee 名字,年龄,entry入职时间,birthday生日,EmployeeManger input(Employee e) , 员工数组
public class DateTool {
public static final String PATTERN = "yyyy-MM-dd";
/**
* 将字符串日期转化成日期格式
* @param date
* @return
* @throws ParseException
*/
public static Date getDateByString(String date) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat(PATTERN);
Date ret = format.parse(date);
return ret;
}
/**
* 将日期格式转成字符串格式
* @param date
* @return
* @throws ParseException
*/
public static String getStringByDate(Date date) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat(PATTERN);
String ret = format.format(date);
return ret;
}
}
//测试
ate dateByString = DateTool.getDateByString("2014-02-09");
System.out.println(dateByString.toLocaleString());//2014-2-9 0:00:00
String string = DateTool.getStringByDate(dateByString);
System.out.println(string);//2014-02-09
//重写数组的toString方法
public static String toString(Object[] arr) {
if (arr == null) {
return "null";
}
int iMax = arr.length - 1;
if (iMax == -1) {
return "[]";
}
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
if (i == iMax) {
sb.append(String.valueOf(arr[i])).append("]");
} else {
sb.append(arr[i]).append(",");
}
}
String s = sb.toString();
return s;
}
}
单例设计模式(只能有一个对象存在)
设计模式:把一些反复使用的,或多数人使用的常用方法,封装成一个设计模式,供其他人使用
//单利规范 代码
public class ArraysTool {
//使之不能被创建对象
private ArraysTool(){}
//在本类中创建对象
public static final ArraysTool instance = new ArraysTool();
public void sort(int[] arr){
System.out.println("排序操作");
}
public static ArraysTool getInstance(){
return instance;
}
}
//测试类
public class ArraysTest {
public static void main(String[] args) {
// ArraysTool arraysTool = new ArraysTool(); 无法创建对象
int[] arr = {2,5,66,32,15,4,11};
ArraysTool.getInstance().sort(arr);
}
}