Java中的String类大家族,基本类型包装类,Date类

String类的特点

String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。

字符串是常量;它们的值在创建之后不能更改
也就是说,一旦字符串确定了,就会在字符串的常量池中生成这个字符串。

String 对象是不可变的,所以可以共享
这就是说,字符串一旦生成,在字符串常量池中不可改变,那么不管有多少个引用,只要它们引用的字符串相同,就是这些引用指向同一片内存域。

String可以创建一个或两个对象
例如:

String s3 = "abc";
String s4 = new String("abc");
System.out.println(s3==s4);//false
System.out.println(s3.equals(s4));//true,

在s4创建时,内存中有两个对象,一个是new的对象在堆中,另一个时字符串本身对象在字符串常量池中。

2、String类中方法的查找

String里的方法海了去了,全记住不太现实,挑挑拣拣来几个,品一下String这小子差不多都能干嘛!

// 1.有多少个字符
String str = "abada";
int len = str.length();
System.out.println("len="+len);

// 2.字符的位置
str = "sdfghjkl;wertyuiop[sdfghjkla;";
int index = str.indexOf('a');//获取的是a字符第一次出现的位置
System.out.println("index="+index);
int index1 = str.indexOf('a',index+1);//第二个a字母出现的位置
System.out.println("index1="+index1);
int index3 = str.lastIndexOf('m');//如果要找的字符不存在,返回-1
System.out.println("index3="+index3);

// 3.获取指定位置上的字符
str = "itcast";
char ch = str.charAt(3);//不存在角标会发生StringIndexOutOfBoundsException
System.out.println("ch="+ch);

// 4.获取部分字符串
String s = str.substring(2, 4);//包含头,不包含尾。
System.out.println("s="+s);

//5、字符串是否以指定字符串开头。结尾同理。
//boolean startsWith(string)
//boolean endsWith(string)
String str = "StringDemo.java";
boolean b1 = str.startsWith("Demo");//返回值为boolean类型

//6.字符串中是否包含另一个字符串。
//boolean contains(string);
boolean b2 = str.contains("Demo");

// 7、字符串中另一个字符串出现的位置。
//int indexOf(string)
int index = str.indexOf("Demo");//没有返回-1
System.out.println(index)

// 8、将字符串中指定的字符串替换成另一个字符串。
//String replace(oldstring , newstring)
String s = str.replace("haha", "Test");//没有被替换内容时,结果是原串。
System.out.println("s="+s);

// 9、将字符串转成一个字符数组。或者字节数组
char[] chs = str.toCharArray();
byte[] bytes = str.getBytes();
// 10、将字母字符串转成大写的字母字符串。
String upperString = str.toUpperCase();
System.out.println(upperString );

//11、字符串按照指定的方式分解成多个字符串, "lisi,wangwu,zhaoliu"获取三个姓名。
str = "lisi,wangwu,zhaoliu";
String[] names = str.split(",");
for (int i = 0; i < names.length; i++) {
	System.out.println(names[i]);
}

// 12、字符串如何比较大小
int result = "ab".compareTo("ab");
System.out.println("result:"+result);

Comparable接口介绍

在开发中若需要对象自身具备比较功能,这时这个对象需要实现Comparable接口,建立属于对象自己的比较方式。

public class Person implements Comparable {

	private String name;
	private int age;
	//这里省略对应的get和set方法,需要自己在测试时加上
	@Override
	public boolean equals(Object obj) {
		if(this == obj)
			return true;
		if(!(obj instanceof Person)){
			throw new ClassCastException("类型错误");
		}
		Person p = (Person)obj;		
		return this.name.equals(p.name) && this.age == p.age;
	}
	/**
	 * 比较年龄大小的方法。
	 */
   @Override
	public int compareTo(Object o) {
		if(!(o instanceof Person)){
			throw new ClassCastException("类型错误");
		}
		Person p = (Person)o;
		return this.age - p.age;		
	}	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}	

String类练习

1、String练习-字符串数组排序

案例:字符串数组[“abc”,“nba”,“cctv”,“itcast”]要求从小到大排序。
思路:

1、与我们以前玩的选择冒泡排序原理相同。

2、for嵌套循环

3、进行元素大小比较,满足条件三元置换

public static void sortString(String[] strs){
	for (int i = 0; i < strs.length -1 ; i++){
		for (int j = i + 1; j < strs.length; j++){
			if(strs[i].compareTo(strs[j])>0){
				String temp = strs[i];
				strs[i] = strs[j];
				strs[j] = temp;
			}
		}
	}
	System.out.println(Arrays.toString(strs));
}

2、String练习-字符串出现次数

案例:"witcasteritcasttyuiitcastodfghjitcast"有几个itcast
思路:

  1. 无非就是在一个字符串中查找另一个字符串。indexOf。
  2. 查找到第一次出现的指定字符串后,如何查找第二个呢?
  3. 无需在从头开始,只要从第一次出现的位置+要找的字符串的长度的位置开始向后查找下一个第一次出现的位置即可。
  4. 当返回的位置是-1时,查找结束。
public static int getKeyCount(String str, String key){
		//1,定义变量。记录每一次找到的key的位置。
		int index = 0;
		//2,定义变量,记录出现的次数。
		int count = 0;	
		//3,定义循环。只要索引到的位置不是-1,继续查找。
		while((index = str.indexOf(key,index))!=-1){
			//每循环一次,就要明确下一次查找的起始位置。
			index = index + key.length();
			//每查找一次,count自增。
			count++;
		}
		return count;
}

StringBuffer

StringBuffer是一个线程安全的可变字符序列。一个类似于String的字符串缓冲区,不能修改,但通过某些方法调用可以改变该序列的长度和内容。

1、StringBuffer基本使用

StringBuffer的特点:

1、是一个字符串缓冲区,其实就是一个容器。

2、长度是可变,任意类型都行。注意:是将任意数据都转成字符串进行存储

3、容器对象提供很多对容器中数据的操作功能,比如:添加,删除,查找,修改。

4、所有的数据最终变成一个字符串。

例如:

//创建一个字符串缓冲区对象。用于存储数据。
StringBuffer sb = new StringBuffer();
//添加数据。不断的添加数据后,要对缓冲区的最后的数据进行操作,必须转成字符串才可以。
String str = sb.append(true).append("hehe").toString();
sb.append("haha"); //添加字符串
sb.insert(2, "it");//在指定位置插入
sb.delete(1, 4);//删除
sb.replace(1, 4, "cast");

2、练习

案例:int[] arr = {34,12,89,68};将一个int[]中元素转成字符串 格式

public static String toString_(int [] arr){
	StringBuffer sb = new StringBuffer();
	sb.append("[");
	for (int i = 0; i < arr.length; i++){
		if(i!=arr.length-1){
			sb.append(arr[i]+",");
		}else{
			sb.append(arr[i]+"]");
		}
	}
	return sb.toString();
}

3、StringBuffer和StringBuilder区别

StringBuilder:该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候,如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快,但是它线程不安全

StringBuffer:是线程安全的可变字符序列,是一个容器,容器中可以装很多字符。并且能够对其中的字符进行各种操作。

各种API

1、基本类型包装类

基本类型包装类应用场景:通过文本框获取用户输入的数字数据,可是得到的都是字符串。 如果想要对字符串中的数字进行运算,必须要将字符串转成数字。

Java中提供了相应的解决的对象,基本数据类型对象包装类:java将基本数据类型值封装成了对象。因此可以提供更多的操作基本数值的功能。

8种基本类型: char boolean byte short int long float double
对应的包装类:Character Boolean Byte Short Integer Long Float Double

基本数据类型对象包装类特点:用于在基本数据和字符串之间进行转换。

例如·:将字符串转成基本类型
parseXXX(String s);其中XXX表示基本类型,参数为可以转成基本类型的字符串,如果字符串无法转成基本类型,将会发生

System.out.println(Integer.parseInt("16" + 16))
输出:1616

2、自动装箱拆箱

JDK1.5以后,有了一个包装类的新特性。目的简化书写,自动装箱

Integer a = new Integer(3);
Integer b = new Integer(3);
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
		
System.out.println("---------------------");
//自动装箱
Integer x = 127;
Integer y = 127;
//在jdk1.5自动装箱时,如果数值在byte范围之内,不会新创建对象空间而是使用原来已有的空间。
System.out.println(x==y);//true
System.out.println(x.equals(y));//true

3、Date类介绍

3.1 currentTimeMill方法

currentTimeMillis方法可以返回当前时间的毫秒值,可是这些数据看起来很不清晰。
于是:

//获取当前时间的毫秒值
long time = System.currentTimeMillis();
//创建日期对象,把当前的毫秒值转成日期对象
Date date = new Date(time);
System.out.println(date);//Wed Dec 11 16:42:06 CST 2013

可是将毫秒值转成日期后,输出的格式不利于我们阅读,引出DateFormat类。

3.2DateFormat类

DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。

// 获取日期格式器对象,在获取格式器对象时可以指定风格,风格包括 FULL、LONG、MEDIUM 和 SHORT
DateFormat format = DateFormat.getDateInstance(DateFormat.LONG);
//对日期进行格式化
String str_time = format.format(date);
System.out.println(str_time);//2013年12月11日

3.3、Calendar类介绍

Calendar类是专门用于描述日历的类,它中维护了一个map集合,在这个集合中存放着所有和日期相关的信息,获取当前日期对应的具体的年,具体的月,具体的日,等信息。

public class DateDemo {
	public static void main(String[] args) {
		//获取日历对象
		Calendar c = Calendar.getInstance();
		System.out.println(c);//打印出了一个map集合,其中描述日期的所有信息
		//获取年
		int year = c.get(Calendar.YEAR);
		//获取月,月是从0开始计算的
		int mouth = c.get(Calendar.MONTH)+1;
		//获取日
		int day = c.get(Calendar.DAY_OF_MONTH);
		//获取星期,由于老外们把星期日当作一周的第一天,所有星期日 返回对应的数字为1
		String week = getWeek(c.get(Calendar.DAY_OF_WEEK));
		System.out.println(year+"年"+mouth+"月"+day+"日"+week);
		
	}

	public static String getWeek(int i) {
		if(i<0 || i>7){
			throw new RuntimeException(i+"没有对应的星期");
		}
		String[] weeks = {"",星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
		return weeks[i];
	}
}
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页