博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常用类回顾之(String类)
阅读量:4309 次
发布时间:2019-06-06

本文共 4456 字,大约阅读时间需要 14 分钟。

String类:

1114325-20170320151108893-374669862.png

String类:表示不可变的字符串,当前对象创建完毕之后,该对象的内容(字符序列)是不能改变的,一旦内容改变就是一个新的对象.

String对象的创建:

1):直接赋一个字面量: String str1 = “ABCD”;

2):通过构造器创建: String str2 = new String(“ABCD”);

1114325-20170320150951596-1605288612.png

两种方式有什么区别,分别在内存中如何分布?

String对象的空值:

1):表示引用为空(null): String str 1 = null; 没有初始化,没有分配内存空间.

2):内容为空字符串: String str2 = “”; 以及初始化,分配内存空间,不过没有内容.

判断字符串非空:

1):引用不能为空(null);

2):字符内容不能为空字符串(“”);


字符串的比较操作:

1):使用”==”号: 只能比较引用的内存地址是否相同.

2):使用equals方法: 在Object类中和”==”号相同,建议子类覆盖equals方法去比较自己的内容.String类覆盖equals方法,比较的是字符内容.

面试题1:

:::下列代码分别创建了几个String对象.

String str1 = “ABCD”;

//最多创建一个String对象,最少不创建String对象.如果常量池中,以及存在”ABCD”,那么str1直接引用,此时不创建String对象.否则,先在常量池先创建”ABCD”内存空间,再引用.

String str2 = new String(“ABCD”);

最多创建两个String对象,至少创建一个String对象.new关键字:绝对会在堆空间,创建内存区域. 所以至少创建一个String个对象.

面试题2:

:::说说下面String对象,彼此之间是否相等.

String str1="ABCD";    String str2="A"+"B"+"C"+"D";    String str3="AB"+"CD";    String temp="CD";    String str4="AB"+temp;        System.out.println(str1==str2);    System.out.println(str1==str3);    System.out.println(str1==str4);

String对象比较:

1):单独使用""引号创建的字符串都是直接量,编译期就已经确定存储到常量池中;

2):使用new String("")创建的对象会存储到堆内存中,是运行期才创建;

3):使用只包含直接量的字符串连接符如"aa" + "bb"创建的也是直接量编译期就能确定,已经确定存储到常量池中(str2和str3);

4):使用包含String直接量(无final修饰符)的字符串表达式(如"aa" + s1)创建的对象是运行期才创建的,存储在堆中;

通过变量/调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值,不存在编译优化操作.

常用方法:

1):String的创建和转换:

byte[] getBytes():把字符串转换为byte数组

String(byte[] bytes):把byte数组转换为字符串

————————————————————————————————————————————————————————————————————

String str="abcd";    byte[] bytes=str.getBytes();    for (byte b : bytes) {        System.out.println(b);    }    String str2=new String(bytes);    System.out.println(str2);

——————————————————————————————————————————————————————————————————

char[] toCharArray():把字符串转换为char数组

String(char[] value):把char数组转换为字符串

String str="abcd";    char[] chars=str.toCharArray();    for (char c : chars) {        System.out.println(c);    }    System.out.println(new String(chars));

获取字符串信息

int length() 返回此字符串的长度

char charAt(int index) 返回指定索引处的 char 值

int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引。

int lastIndexOf(String str)返回指定子字符串在此字符串中最右边出现处的索引

String str="abcda";            System.out.println(str.length());            System.out.println(str.charAt(0));            System.out.println(str.indexOf("cd"));            System.out.println(str.lastIndexOf('a'));            System.out.println(str.contains("b"));

字符串比较判断

boolean equals(Object anObject) 将此字符串与指定的对象比较。

boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写

boolean contentEquals(CharSequence cs) 将此字符串与指定的 CharSequence 比较

String a1="abc";    String a2="aBc";        System.out.println(a1.equals(a2));    System.out.println(a1.equalsIgnoreCase(a2));    System.out.println(a1.contentEquals(a2));

字符串大小写转换

String toUpperCase() 把当前字符串转换为大写(谁调用该方法,谁就是当前字符)

String toLowerCase() 把当前字符串转换为小写

练习1:有这么样一个字符串"a1.txt;a2.txt;a3.jpg;hello.java;33.png",获取以hello开头的文件的文件名和扩展名.

String str="a1.txt;a2.txt;a3.jpg;hello.java;33.png";    String[] filenames=str.split(";");    for (String s : filenames) {        //System.out.println(s);        if(s.startsWith("hello")){            int index=s.lastIndexOf(".");            System.out.println("hello"+s.substring(index));        }            }

练习2:写一个工具类,判断字符串非空或空

package gwd.com.day12;public class  utils {    private utils(){}    public static boolean hasLength(String str){        return str!=null && !"".equals(str.trim());}    public static boolean isBlank(String str) {return !hasLength(str);}}

String、StringBuilder、StringBuffer

1114325-20170320151010627-549614115.png

分别使用String/StringBuilder/StringBuffer来拼接30000次字符串,对比各自损耗的时间:

经过测试:

String做字符串拼接的时候,性能极低(耗时),原因是Sting是不可变的,每次内容改变都会在内存中创建新的对象.

String耗时:1964ms

StringBuffer耗时:3ms

StringBuilder耗时:1ms

结论:以后拼接字符串,统统使用StringBuffer/StringBuilder,不要使用String.


String和StringBuilder以及StringBuffer的区别(建议使用StringBuilder):

StringBuffer和StringBuilder都表示可变的字符串,功能方法都是相同的.

唯一的区别:

StringBuffer: StringBuffer中的方法都使用了synchronized修饰符,表示同步的,在多线程并发的时候可以保证线程安全,保证线程安全的时候,性能(速度)较低.

StringBuilder:StringBuilder中的方法都没有使用了synchronized修饰符,不安全,但是性能较高.

使用StringBuilder无参数的构造器,在底层创建了一个长度为16的char数组:

char[] value = new char[16];

此时该数组只能存储16个字符,如果超过了,得自动扩容.自动扩容(创建长度更大的数组,再把之前的数组拷贝到新数组)

此时性能极低,一般的,我们事先知道大概需要存储多少字符,在构造器中就应该设置.

//创建一个长度为80的char数组.

new StringBuilder(80);

常用方法:

append(Object val):表示追加任意类型数据

StringBuilder deleteCharAt(int index) :删除字符串中,指定位置的字符

StringBuilder sb=new StringBuilder();    sb.append("xx");    sb.append("tt");        System.out.println(sb);

转载于:https://www.cnblogs.com/java-gwd/p/6589179.html

你可能感兴趣的文章
FFmpeg 是如何实现多态的?
查看>>
FFmpeg 源码分析 - avcodec_send_packet 和 avcodec_receive_frame
查看>>
FFmpeg 新旧版本编码 API 的区别
查看>>
RecyclerView 源码深入解析——绘制流程、缓存机制、动画等
查看>>
Android 面试题整理总结(一)Java 基础
查看>>
Android 面试题整理总结(二)Java 集合
查看>>
学习笔记_vnpy实战培训day02
查看>>
学习笔记_vnpy实战培训day03
查看>>
VNPY- VnTrader基本使用
查看>>
VNPY - CTA策略模块策略开发
查看>>
VNPY - 事件引擎
查看>>
MongoDB基本语法和操作入门
查看>>
学习笔记_vnpy实战培训day04_作业
查看>>
OCO订单(委托)
查看>>
学习笔记_vnpy实战培训day06
查看>>
回测引擎代码分析流程图
查看>>
Excel 如何制作时间轴
查看>>
股票网格交易策略
查看>>
matplotlib绘图跳过时间段的处理方案
查看>>
vnpy学习_04回测评价指标的缺陷
查看>>