Java基础知识(八)

*11.2 String*

11.2.1 String类介绍

(1)创建的每个字符串实际上都是String类的对象。即使是字符串字面值实际上也是String对象。

(2)String类型的对象是不可变的;一旦创建了一个String对象,其内容就不能再改变。即,一旦创建了一个String对象,就不能改变该字符串包含的字符。

所谓Stirng类型对象中的字符串是不可改变的,是指创建了String实例后不能修改String实例的内容。但是可以修改String引用变量,使其指向其他String对象。

当每次需要已存在字符串的修改版本时,会创建包含修改后内容的新String对象。原始字符串仍然没有改变。使用这种方法的原因是,实现固定的、不能修改的字符串与实现能够修改的字符串相比效率更高。

(3)对于那些需要能够修改的字符串的情况,Java提供了两个选择:StringBuffer和StringBuilder。这两个类都包含在创建之后可以进行修改的字符串。

(4)String、StringBuffer和StringBuilder类都是在java.lang包中定义的。这三个类都实现了CharSequence接口。

注意:API文档的使用

11.2.2 String类的构造方法

l String(); //创建不包含内容的字符串对象

l String(char[ ] chars)

l String(char[ ] chars, int startIndex, int numChars)

l String(String strObj)

l 还可以直接使用字符串字面创建String对象:String str = “abc”;

示例:StringMakeDemo

注意:没有使用单位字符作为参数的构造器。

//String(char c);

说明:

因为会为字符串字面值创建String对象,所以在能够使用String对象的任何地方都可以使用字符串字面值。

System.out.println("abc".length());

11.2.3 字符串比较

11.2.3.1 字符串相等性比较

String类重写了equals()方法,重写后的方法比较两个字符串对象的内容是否相同。

运算符“==”比较两个String引用是否指向同一个String对象。

示例:StringCompareDemo

11.2.3.2 其他比较方法

l boolean equalsIgnoreCase(String str)

将此String与另一个String比较,不考虑大小写。

将此 String 与另一个 String 比较,不考虑大小写。如果两个字符串的长度相同,并且其中的相应字符都相等(忽略大小写),则认为这两个字符串是相等的。

l boolean endsWith(String suffix)

测试此字符串是否以指定的后缀结束。

l boolean startsWith(String prefix)

测试此字符串是否以指定的前缀开始。

l int compareTo(String str)

按照字典顺序比较两个字符串。

其中,str是将要与调用String对象进行比较的String对象。返回的比较结果及其解释如下所示:

含 义
小于0调用字符串小于str。
大于0调用字符串大于str。
0两个字符串相等。

l int compareToIgnoreCase(String str)

按字典顺序比较两个字符串,不考虑大小写。

11.2.4 字符串连接

String str1 = “abc” ;

String str2 = “def”;

String str3 = “hij”;

String str1 = str1 + str2;

String类型的引用,指向的字符串对象是不能修改的。

String表示不可变的字符串,只要创建了字符串对象,那么这个对象的内容就不能再改变。

API里面是否有拼接方法?

11.2.5 字符串查找

案例:StringSearchDemo

1.boolean contains(CharSequence s)

当且仅当此字符串包含指定的char值序列时,返回true。

CharSequence 表示字符串序列,是String的父类

2.int indexOf(int ch)和int indexOf(String str)

返回指定字符/子串第一次出现处的索引。

3.int lastIndexOf(int ch)和int lastIndexOf(String str)

返回指定字符/子串最后一次出现处的索引。

说明:

(1)当没有字符/子串没有出现时,返回值为-1。可以使用该方法判断字符/子串是否存在。

(2)可以使用下面这些重载形式指定查找的开始位置:

int indexOf(int ch, int startIndex)

int lastIndexOf(int ch, int startIndex)

int indexOf(String str, int startIndex)

int lastIndexOf(String str, int startIndex)

11.2.6 字符串修改

案例:StringModifyDemo

1.String concat(String str)

将指定字符串连接到此字符串的结尾,concat()与“+”执行相同的功能。

2.String replace(char oldChar, char newChar)

返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。

3.String toLowerCase()

使用默认语言环境的规则将此String中的所有字符都转换为小写。

4.String toUpperCase()

使用默认语言环境的规则将此String中的所有字符都转换为大写。

5.String trim( )

返回字符串的副本,删除前导空白和尾部空白。

提取字符与子串

1.char charAt(int index)

返回指定索引处的char值。

2.char[ ] toCharArray()

将此字符串转换为一个新的字符数组。

3.String substring(int beginIndex)

返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。

4.String substring(int beginIndex, int endIndex)

返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的beginIndex处开始,一直到索引endIndex-1处的字符。

11.2.8 其他字符串常用方法

1.int length()

返回此字符串的长度

注意:数组的长度为数组对象.length 属性

2.String[] split(String regex)

根据给定正则表达式的匹配拆分此字符串。最简单的使用方法是为参数regex

3.static String valueOf( int i)

将数据从内部格式转换成人类可读的形式。它是一个静态方法。

对于大部分数组,valueOf()会返回一个相当隐蔽的字符串,表明这是某种类型的数组。然而,对于字符数组,会创建包含字符数组中字符的String对象。

*11.3 StringBuffer和StringBuilder*

11.3.1 StringBuffer与StringBuilder类介绍

StringBuffer是String的对等类,提供了许多字符串功能。您可能知道,String表示长度固定、不可修改的字符序列。与之相对应,StringBuffer表示可增长、可写入的字符序列。StringBuffer允许在中间插入字符和子串,或在末尾追加字符和子串。StringBuffer能够自动增长,从而为这类添加操作准备空间,并且通常预先分配比实际所需更多的字符空间,以允许空间增长。

StringBuilder类是由JDK 5引入的,以增加Java的字符串处理能力,提供与StringBuffer相同的功能。

StringBuffer与StringBuilder的区别:

l StringBuffer类是线程安全的,而StringBuilder则不是,即不保证其对象的同步性,在多线程环境中是不安全的。

l StringBuilder在性能上要比StirngBuffer好一些。

11.3.2 StringBuffer类的构造方法

StringBuffer( ) //默认预留16个字符的空间

StringBuffer(int size) //size指定预留的字符空间

StringBuffer(String str) //额外预留16个字符的空间 abc+16

StringBuffer(CharSequence chars) //额外预留16个字符的空间

提示:

再次分配内存空间是很耗时的操作。此外,频繁分配空间会产生内存碎片。

11.3.2 StringBuffer类的常用方法

1.append ()

append()方法将各种其他类型数据的字符串表示形式连接到调用StringBuffer对象的末尾。该方法有多个重载版本,下面是其中的几个:

StringBuffer append(String str)

StringBuffer append(int num)

StringBuffer append(Object obj)

2.insert ()

在指定位置插入参数提供的内容,返回修改后的该StringBuffer对象引用。该方法有多个重载版本,下面是其中的几个:

StringBuffer insert(int index, String str)

StringBuffer insert(int index, char ch)

StringBuffer insert(int index, Object obj)

3.StringBuffer delete (int start,int end) 10 包含5 不包含10

删除从start开始到end-1为止的一段字符序列,返回修改后的该StringBuffer对象引用。

4.StringBuffer deleteCharAt(int index) 8

移除指定位置的字符,返回修改后的该StringBuffer对象引用。

5.StringBuffer reverse()

将字符序列逆序,返回修改后的该StringBuffer对象引用。

6.StringBuffer setCharAt( (int index,char ch) 5 a

将指定索引处的字符设置为 ch,返回修改后的该StringBuffer对象引用。

public static void main(String[] args){

StringBuffer sb = new StringBuffer();

sb += “I”;

sb.append(“am”);

sb.append(true);

System.out.println(sb);

}

几点说明

(1)StringBuffer对象不能使用 += 赋值

(2)注意使用StringBuffer的append()方法连接字符串与使用“+”运算符直接连接String对象的区别。

案例:StringBufferDemo

11.3.3 长度与容量的概念

长度是指StringBuffer中实际保存的字符的个数,容量是指已经分配的空间大小。

1.int length()

获取StringBuffer对象的当前长度

2.void setLength(int len) 50 20 6 50 10

设置StringBuffer对象中字符串的长度。当增加字符串的大小时,会向末尾添加空字符。如果调用setLength()时使用的值小于length()返回的当前值,则超出新长度的字符将丢失。

3.int capacity( )

获取StringBuffer对象的当前容量

4.void ensureCapacity(int minCapacity)

设置缓存的大小。minCapacity指定了缓存的最小尺寸。(出于效率考虑,可能会分配比minCapacity更大的缓存。)

扩容后的数组长度为字节数组定长*2 +2 ,扩容不够时直接扩容到最大(指定大小)。

11.4 Date与**Calendar**

11.4.1Date与**Calendar**

Date类封装了当前日期和时间。位于java.util包。

long getTime()返回从1970年1月1日午夜开始已经流逝毫秒数

11.4.2 SimpleDateFormat类**

SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。 SimpleDateFormat sf = new SimpleDateFormat("**yyyy-MM-dd HH:mm:ss"**);

SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String birth = "2002-08-23 08:08:08";//字符串时间
Date parse = sf.parse(birth);//转换成格式日期
long birth1 = parse.getTime();//毫秒数

11.4.3 Calendar**与GregorianCalendar类**

Calendar是抽象类,提供了一套方法将毫秒数形式的时间转换成大量有用的组分,例如年、月、日、小时、分和秒。

GregorianCalendar是Calendar的具体实现,它实现了您熟悉的常规的格林尼治日历。Calendar类的getInstance()方法通常会返回一个使用默认地区和时区下的当前时间初始化的GregorianCalendar对象。

{
        Calendar ce = Calendar.getInstance();
        System.out.print(ce.get(Calendar.YEAR)+"年");
        System.out.print(ce.get(Calendar.MONTH)+1+"月");
        System.out.print(ce.get(Calendar.DAY_OF_MONTH)+"日 ");
        System.out.print(ce.get(Calendar.HOUR_OF_DAY)+"时");
        System.out.print(ce.get(Calendar.MINUTE)+"分");
        System.out.println(ce.get(Calendar.SECOND)+"秒");
        //获取昨天的日期
        Date today = new Date(System.currentTimeMillis()-1000*60*60*24);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String yesterday = simpleDateFormat.format(today);
        System.out.println(yesterday);
        //2
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE,-1);
        Date d = cal.getTime();
        String format = simpleDateFormat.format(d);
        System.out.println(format);
    }

案例一:输入一个时间,在控制台打印出这个时间三天后的时间

public class Three1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Calendar ca1 = Calendar.getInstance();
        System.out.println("请输入年份");
        int year = scanner.nextInt();
        System.out.println("请输入月份");
        int month = scanner.nextInt() - 1;
        System.out.println("请输入天数");
        int day = scanner.nextInt();
        ca1.set(year, month, day);
        System.out.println("今天是" + ca1.get(Calendar.YEAR) + "年" + (ca1.get(Calendar.MONTH) + 1) + "月" + ca1.get(Calendar.DAY_OF_MONTH) + "日");
        ca1.add(Calendar.DATE, day);
        System.out.println(day + "天后是" + ca1.get(Calendar.YEAR) + "年" + (ca1.get(Calendar.MONTH) + 1) + "月" + ca1.get(Calendar.DAY_OF_MONTH) + "日");
    }
}

案例二:一批食品的生产日期是:2022-3-21,保质期:180天,求过期时间

public class Past {
    public static void main(String[] args) throws ParseException {
        String  production ="2022-03-21";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date parse = simpleDateFormat.parse(production);
        long product = parse.getTime();
        long path =product + 180* 1000l*60*60*24;

        Date date = new Date(path);
        String format = simpleDateFormat.format(date);
        System.out.println("过期日期是" + format);
    }
}

案例三: 秒杀活动:2023年11月11日 0:0:0(毫秒值) 开始时间:2023年11月11日 0:10:0(毫秒值

     小贾下单并付款的时间为:2023年11月11日 0:01:0
     小皮下单并付款的时间为:2023年11月11日 0:11:0
     用代码来说明这两位同学有没有参加上秒杀活动和
public class MiaoSha {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //秒杀活动时间
        String s = "2023-11-11 0:0:0";
        Date parse = sf.parse(s);
        System.out.println("秒杀开始时间日期:"+s);
        long startTime = parse.getTime();
        String s1 = "2023-11-11 00:10:00";
        Date parse1 = sf.parse(s1);
        System.out.println("秒杀开始时间:"+s1);
        long endTime = parse1.getTime();
        //小贾和小皮的下单时间
        String s2 = "2023-11-11 00:01:00";
        Date parse2 = sf.parse(s2);
        long jiaTime = parse2.getTime();
        String s3 = "2023-11-11 00:11:00";
        Date parse3 = sf.parse(s3);
        long piTime = parse3.getTime();
        if ( jiaTime >= endTime) {
            System.out.println("小贾参加了秒杀活动");
        } else {
            System.out.println("小贾没有参加秒杀活动");
        }
        if ( piTime >= endTime) {
            System.out.println("小皮参加了秒杀活动");
        } else {
            System.out.println("小皮没有参加秒杀活动");
        }
    }
​
}

1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值