一、 String 类型

  1. String类引入

    第二天学习过Java中的常量:

        常量的分类:

      数值型常量:整数,小数(浮点数)

     字符型常量:使用单引号引用的数据

    字符串常量:使用双引号引用的数据

     布尔型常量:true或false

     null常量:null

    上述的大部分的常量都可以使用Java中提供的8种基本类型进行开辟空间,存储这些常量。

             字符串常量不属于8种基本类型中的数据。而它属于Java中的引用类型数据(类类型数据)。

        字符串数据在Java中使用String类进行描述。

        字符串数据它属于Java中一类数据,我们也可以把其看作一类事物。既然是一类事物,就一定可以使用Java中的某个类对其进行封装和描述。

        后期我们学习的目标和重点:

         不再是如何去描述一个类(不是去定义类)。而是要学习怎么去使用别人(JDK)中提供好的类。需要知道这些类是干什么的,以及它中有哪些常用的方法,这些方法能够解决什么问题。

                   后期学习新的类的时候,学习方式:

                           重点是使用自己的代码去测试这些类中的方法,并得到自己的结论。

    2.String 类介绍

           

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

      在Java中只要使用双引号引用起来的任何数据它们都是String 的一个对象。

        

      字符串是常量;它们的值在创建之后不能更改。因为 String 对象是不可变的,所以可以共享。

      虽然使用双引号引用起来的数据都是字符串,也是String的一个实例对象,但是这个对象中的字符数据一定写完,就已经是一个固定的数据,不能再进行修改,并且它存储在方法区的字符串常量池中。

      

      

    3.String类构造方法     

    String类中提供了大量的构造方法,都可以将不同形式的数据转成字符串对象。

    

1 /*
2 * 演示String类的构造方法
3 */
4 public class StringConstructorDemo {
5 public static void main(String[] args) {
6
7 method5();
8 }
9 /*
10 * 面试题
11 */
12 public static void method5() {
13
14 String s = "abc";
15 String s2 = new String("abc");
16 /*
17 * s 和 s2 的区别?
18 * s它指向的方法区中的常量池中的 abc字符串
19 * s2它指向的是堆中的自己new的那个对象,而在堆中这个对象中维护的地址
20 * 指向的常量池中的abc字符串
21 *
22 * String s = "abc"; 在内存中只有一个对象
23 * String s2 = new String("abc"); 在内存中有2个对象
24 */
25 System.out.println(s);
26 System.out.println(s2);
27 System.out.println(s == s2);
28 }
29 /*
30 * 演示将int类型的数组转成字符串
31 */
32 public static void method4() {
33
34 int[] arr = {23456,23457,23458};
35 String s = new String(arr , 0 , 3);
36 System.out.println(s);
37 }
38 /*
39 * String(byte[] bytes, int offset, int length)
40 * byte[] bytes : 指定需要被转成字符串的那个字节数组
41 * int offset : 从字节数组的那个下标开始转数据
42 * int length : 需要将从offset开始往后共计转多少数据
43 */
44 public static void method3() {
45
46 byte[] b = {97,98,99,100,65,49};
47
48 String s = new String( b , 4 ,4 );
49 System.out.println(s);
50 }
51 /*
52 * 演示String类中的有参数的构造方法
53 */
54 public static void method2() {
55
56 //创建字节数组
57 byte[] b = {97,98,99,100,65,49};
58
59 //将字节数组中的所有数据转成字符串
60 String s = new String( b );
61
62 System.out.println(s);
63 }
64 /*
65 * 演示空参数的构造方法
66 * String()
67 */
68 public static void method1() {
69
70 /*
71 * 使用String类的构造方法得到String对象
72 * 使用空参数的构造方法创建出的String对象,这个对象在堆中
73 * 而这个字符串对象中没有任何字符数据
74 */
75 String s = new String();
76
77 }
78 }

    4. String 类常用方法     

      a. 拼接字符串

      猜测到某个功能之后,继续猜测它的方法参数以及返回值类型

      参数:有,至少2个。实际值需要一个参数

      返回值类型:String , 拼接后的新的字符串

      

      

      b.根据字符找下标

      

      

      

      

    c.根据下标找字符

      

    d.字符串的长度

      

      

     e. 获取字符串中的一段子串

        

     

1 /*
2 * 演示String类中的截取方法
3 */
4 public class StringMethodDemo2 {
5 public static void main(String[] args) {
6
7 String s = "好好学习,天天向上";
8 /*
9 * substring(int beginIndex)
10 * 从指定的字符串中的beginIndex位置开始截取子串,一直到结束
11 * substring( int beginIndex , int endIndex )
12 * 从指定的字符串中的beginIndex位置开始到endIndex结束(不包含endIndex位置上的字符)
13 */
14 String ss = s.substring(2);
15 System.out.println(ss);
16 String ss2 = s.substring(0, 5);
17 System.out.println(ss2);
18 }
19 }

    f. 字符串转数组

      

      

      

1 //字符串转成字节数组
2 public static void method2() {
3 String s = "abdefg";
4 //转字节数组
5 byte[] bs = s.getBytes();
6
7 for (int i = 0; i < bs.length; i++) {
8 System.out.println(bs[i]);
9 }
10 }
11 //字符串转字符数组
12 public static void method1() {
13 String s = "abcefg";
14 //转字符数组
15 char[] cs = s.toCharArray();
16 for (int i = 0; i < cs.length; i++) {
17 System.out.println(cs[i]);
18 }
19 }

    g. 其他判断方法

    

    

判断指定的字符串是否在调用contains方法的那个字符串中。

String s =”abcdefg”;

String s2 = “abc”;

boolean b = s.contains(s2);

判断s2 这个字符串在s字符串中是否存在。

    

    

判断字符串是否以指定的字符串结尾。

String s = “abc.java”;

boolean b = s.endsWith(“.java”);

    

   h.其他的转换方法

             将字符串中的所有字母转成小写

    

      将字符串中的所有字母转成大写

    

valueOf方法是将其他类型的数据转成字符串。

  5.String类方法练习

    a。对字符串中的数据进行排序    

1 /*
2 * 需求:对字符串中的数据进行排序
3 *
4 * 分析:
5 * 需要一个字符串,将字符串转成字符数组。
6 * 对数组遍历选择排序
7 * 将数组转成字符串
8 */
9 public class StringTest2 {
10 public static void main(String[] args) {
11 String s ="aAZzBcDfPO";
12 String sortedStr = stringSort(s);
13 System.out.println(sortedStr);
14 }
15 //对指定的字符串进行排序
16 public static String stringSort(String s) {
17
18 //将字符串转成数组
19 char[] cs = s.toCharArray();
20 //使用选择排序
21 for( int i = 0 ; i < cs.length - 1 ; i++ ){
22 //外循环是提供数组中需要和后面比较的那个元素的下标
23 for( int j = i + 1 ; j < cs.length ; j++ ){
24 //内循环是提供当前外环线下标后面剩余所有空间的下标
25 //判断
26 if( cs[i] > cs[j] ){
27 char temp = cs[i];
28 cs[i] = cs[j];
29 cs[j] = temp;
30 }
31 }
32 }
33 //将数组转成字符串
34 String ss = new String(cs);
35 return ss;
36 }
37 }

     b.统计指定字符在字符串中出现的次数

1 /*
2 * 需求:统计指定字符在字符串中出现的次数
3 * 分析:
4 * 需要取出字符串中的每个字符,和需要统计次数的那个字符进行比较,
5 * 如果相同,就让计数器+1,如果不相同,继续取出下一个字符,以此类推。
6 * 将字符串中的全部字符遍历完成,指定的字符个数就统一在计数器中。
7 */
8 public class StringTest {
9 public static void main(String[] args) {
10
11 String s = "asjdklafjklew4uiowrafn,dsfaksda";
12 char ch = 'z';
13 //需要计数器
14 int count = 0;
15 //使用循环遍历字符串
16 for( int i = 0 ; i < s.length() ; i++ ){
17 //取出每个字符数据和需要统计的字符判断
18 char c = s.charAt(i);
19 if( c == ch ){
20 count++;
21 }
22 }
23 System.out.println(ch+"的次数是:"+count);
24 }
25 }

    c.对字符串按照指定的内容切割,然后排序

1 /*
2 * 需求:对字符串按照指定的内容切割,然后排序
3 *
4 * 分析:
5 * 必须有一个字符串。"abs Adsfj sldjk fljs dlkf"
6 * 使用空格对字符串进行切割:
7 * "abs" "Adsfj" "sldjk" "fljs" "dlkf"
8 * 切割之后,会得到多个字符串数据,需要对这些字符串进行排序。
9 * 在Java中对字符串进行比较,有自己特定的规则:
10 *
11 * 选择2个字符串,使用它们相同下标位置上的字符对应的数字进行比较,
12 * 谁的数字大,这个字符串就大。
13 *
14 * 在String类中提供的compareTo的方法,可以对2个字符串进行大小的比较
15 */
16 public class StringTest3 {
17 public static void main(String[] args) {
18
19 String s = "abs Adsfj sldjk fljs alkf";
20
21 //切割
22 String[] strs = s.split(" ");
23
24 //排序
25 //Arrays.sort(strs);
26 for( int i = 0 ; i < strs.length - 1 ; i++ ){
27 for( int j = i + 1 ; j < strs.length ; j++ ){
28 if( strs[i].compareTo(strs[j]) > 0 ){
29 String temp = strs[i];
30 strs[i] = strs[j];
31 strs[j] = temp;
32 }
33 }
34 }
35 //将String数组转成字符串
36 //String ss = Arrays.toString(strs);
37 String ss = "";
38 for (int i = 0; i < strs.length; i++) {
39 ss = ss + strs[i] + " ";
40 }
41 System.out.println(ss);
42 }
43 }

二·、字符串缓冲区

   1. 符串缓冲区介绍

      a. 缓冲区思想:     

      举例:超市的购物车。在购买商品的过程中,将需要够买的商品先临时存储在购物车中。这时的购物车就相当于一个容器,给其中添加需要购买的物品。

      这里说的这个容器在Java中被称为缓冲区。

      Java中也有缓冲区存在。主要是临时存储一些需要处理的数据,在处理完之后得到一个唯一的结果。

       b. 字符串缓冲区

      字符串缓冲区:可以存储字符数据的容器,可以对这个容器中的字符数据进行各种的操作,在操作完成之后,会得到一个唯一的字符串常量,最后把这个字符串常量保存到方法区的常量池中。

      如果在操作的过程中,没有操作完成,那么不会在常量池中保存任何数据。

       c.缓冲区常见的操作    

      缓冲区本身就是一个容器:

               它们都具备 增 删  改 查操作。

               增:给容器中添加数据

               删:从容器中删除数据

               改:修改容器中的数据

               查:查看容器中的数据

      增删改查:CRUD。

               Create  Read  Update  Delete

         Java中针对字符串这类数据提供两个缓冲区对象:

                StringBuffer

              StringBuilder

   2.  StringBuffer介绍

        

  线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

StringBuffer :它是字符串缓冲区,支持对其中保存的数据进行增删改查操作。

StringBuffer中定义的方法是为增删改查设计的。

   

    

    3. StringBuffer中的方法介绍

       a. 添加方法

        

         

        b.删除方法

        

        

1 //删除方法
2 public static void method3() {
3 //创建字符串 缓冲区对象
4 StringBuffer sb = new StringBuffer("abcdefg");
5
6 /*
7 * 删除方法
8 * delete(int start , int end)
9 * start是起始位置
10 * end 结束位置
11 * 要求start一定要小于等于end
12 */
13 sb.delete(3, 3);
14
15 //删除指定位置上的字符
16 sb.deleteCharAt(3);
17
18 //将容器中的数据转成字符串
19 String s = sb.toString();
20
21 System.out.println(s);
22 }

        c. 修改方法

        

        

1 //修改方法
2 public static void method4() {
3 //创建字符串 缓冲区对象
4 StringBuffer sb = new StringBuffer("abcdefg");
5
6 //修改方法
7 sb.setCharAt(3, 'A');
8
9 //将容器中的数据转成字符串
10 String s = sb.toString();
11
12 System.out.println(s);
13 }

      d.获取方法   

capacity()  获取字符串缓冲区的容量  例如:水杯500ML 

length()    获取到的是字符串中的字符个数   例如:水杯中实际装的水的容量

charAt(int index)  获取字符串缓冲区容器中指定位置上的字符数据

indexOf(String str)

indexOf(String str, int fromIndex)

lastIndexOf(String str)

lastIndexOf(String str, int fromIndex)

reverse()  反转字符串缓冲区中的字符

    e.StringBuffer的使用场景    

如果程序中需要对字符串中的字符数据进行  CRUD 的时候,建议先将这个字符串存储到缓冲区中,然后对其进行操作,操作完成之后再重新转成字符串数据。

  4.StringBuilder介绍 

StringBuilder类它是JDK5新增的。它的功能和StringBuffer一致。

区别:

StringBuffer 它在操作容器的时候,增  删  改  查 的过程中,不会发生不安全的问题。

StringBuilder  它也提供的对容器的增删改查操作,但是不保证安全。

在使用StringBuilder的时候,运行多个操作同时对容器进行。由于它不保证安全,因此它在操作的时候效率比StringBuffer高。

面试题:StringBuffer和StringBuilder的区别:

StringBuffer 安全的。StringBuilder 不安全。

JAVA基础--JAVA API常见对象(字符串&缓冲区)的更多相关文章

  1. JAVA基础--JAVA API常见对象(字符串&缓冲区)11

    一. String 类型 1. String类引入 第二天学习过Java中的常量:   常量的分类:   数值型常量:整数,小数(浮点数) 字符型常量:使用单引号引用的数据 字符串常量:使用双引号引用 ...

  2. java基础面向对象之类与对象

    java基础面向对象之类与对象 2017-01-14 1.面向对象的基本概念 以一种组建化的形式进行代码设计 1)在面向对象程序设计中包含有如下几种特性 •封装性:保护内部结构的安全性 •继承性:在已 ...

  3. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  4. Java基础-Java中23种设计模式之常用的设计模式

    Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...

  5. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

  6. Java基础-Java数据类型

    Java基础-Java数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据类型的作用 数据类型就是一组值,以及这一组值上的操作,数据类型可以决定数据的存储方式,取值范围 ...

  7. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  8. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.

  9. Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)

    Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...

随机推荐

  1. HGOI 20190830 题解

    Problem A 钥匙 有$n$个人和$m$个钥匙在数轴上,人的坐标为$a_i$,钥匙的坐标为$b_i$ 而门的坐标为$p$,要让所有人获得一把不同钥匙,并且到达门,最长时间最短是多少. 对于$10 ...

  2. TypeScript----接口和泛型

    接口 TypeScript的核心原则之一是对值所具有的结构进行类型检查.它有时被称做“鸭式辨型法”或“结构性子类型化”.在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定 ...

  3. 「CSA Round #41」BFS-DFS

    题目链接 戳我 \(Description\) 给出一个图的\(bfs\)序和\(dfs\)序,构造出一个满足条件的图,边的扫描顺序为读入顺序 \(Solution\) 这个题还是很简单的. 先来看看 ...

  4. python实例方法、静态方法和类方法

    Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文. 首先,这三种方法都定义在类中.下面我先简单说一下怎么定义 ...

  5. Leetcode题目21.合并两个有序链表(简单)

    题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4输出:1->1-& ...

  6. Linux 竞态条件和临界区

    1. 临界区和竞态条件: 临界区:访问和操作共享数据的代码段: 竞态条件:当有多个线程同时进入临界区时,执行结果取决于线程的执行顺序: 如下述代码,当多个线程同时调用func函数,对共享数据sum进行 ...

  7. LeetCode 86. 分隔链表(Partition List)

    题目描述 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1-> ...

  8. php获取文件名和后缀名

    php获取文件名 1 function retrieve($url) 2 { 3 preg_match('/\/([^\/]+\.[a-z]+)[^\/]*$/',$url,$match); 4 re ...

  9. OpenStack 虚拟机启动流程 UML 分析(内含 UML 源码)

    目录 文章目录 目录 前言 API 请求 Nova API 阶段 Nova Conductor 阶段 Nova Scheduler 阶段 Nova Compute 阶段(计算节点资源分配部分) Nov ...

  10. Linux crontab 每5秒钟执行一次 shell 脚本 的方法

    Linux crontab 每5秒钟执行一次 shell 脚本 的方法 由于 Linux 的 crontab 的定时命令格式如下: minute hour day-of-month month-of- ...