常用类回顾之(String类)
String类:
String类:表示不可变的字符串,当前对象创建完毕之后,该对象的内容(字符序列)是不能改变的,一旦内容改变就是一个新的对象.
String对象的创建:
1):直接赋一个字面量: String str1 = “ABCD”;
2):通过构造器创建: String str2 = new String(“ABCD”);
两种方式有什么区别,分别在内存中如何分布?
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
分别使用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
常用类回顾之(String类)相关推荐
- java string类api_JAVA中String类的常用方法API
@[toc] 前言 String 类是我们日常经常使用的Java类,以下是对该类的信息汇总,类的关系图如下 String类关系图 创建: String s="hello!";//使 ...
- String类比较,String类运算比较,String运算
String类比较,String类运算比较 >>>>>>>>>>>>>>>>>>>&g ...
- java中string类_Java中String类浅谈
1)String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = "abc&qu ...
- java 实现 string类_java 中String类的常用方法总结,带你玩转String类。
String类: String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.String类对象创建后不能修改,StringBuffer & St ...
- JavaSE学习总结(八)常用类(上)Object类==与equals方法的区别浅克隆的特点Scanner类String类String两种创建对象方式的区别String类的各种功能
JavaSE学习总结(八)常用类(上)/Object类/==与equals方法的区别/浅克隆的特点/Scanner类/String类/String两种创建对象方式的区别/String类的各种功能 常用 ...
- 17.Java常用实用类之String类中常用的方法以及一般应用场景,final关键字
文章目录 1.String类学习 1.1.什么是String类 1.2.String类中常用的方法 1.2.1. 构造方法 1.2.2.public int length() 1.2.3.public ...
- 常用类-String类
一.String类的理解 String类:位于java.lang 包中,被fifinal修饰,没有子类 二.获取字符串的两种常见方式 1.String str1 = "hello" ...
- java实用教程——常用实用类——String类(字符串类)
JAVA把String类定义为final类(因此用户不能扩展String类,即String类不可以有子类) String对象可以用"+"进行并置运算 identityHashCod ...
- 【C++复习总结回顾】—— 【一】基础知识+字符串/string类
文章目录 一.面向对象/过程 1. 面向过程过程 2. 面向对象编程 二.C++语言基础 1. 信息的存储单位 2. 命名空间 3. 基本数据类型 + 字符串 C++的基本数据类型 字符串处理 4. ...
最新文章
- 如何在 Unix 和 DOS 格式之间转换文本文件
- 应用热启动(Ctrl+Alt+Delete)在显示频中进行监控的应用
- 《精通自动化测试框架设计》—第2章 2.3节测试数据交互基本方法
- SVN -客户端URL地址修改命令
- C#深度优先做数字的全排列
- 圆环同心度测量halcon
- linux嵌入式贪吃蛇
- Qt+ArcGIS Engine 10.1 开发(一)
- 快手:今年下架抄袭、搬运内容的违规视频20316个
- python函数可以提高代码执行速度吗_Python代码运行速度慢?这五种方法很管用
- start-dfs.sh\stop-dfs.sh启动失败
- centos nginx和tomcat集群
- python的ogr模块_Python与开源GIS:使用OGR模块打开矢量数据
- c++ 2D小球 碰撞模拟
- 20 统计量及其抽样分布——样本比例的抽样分布
- HDU-5755-Gambler Bo-高斯消元
- Laravel Elasticsearch
- 博客篇-如何使用阿里云搭建网站
- postman,请求前置脚本,Pre-requests Script
- html如何改变字体的位置,css如何改字位置
热门文章
- Android 5.1 API 22 所有sdk文件下载地址
- sqlite3x library
- 关于活动对像要注意的问题
- [pytorch、学习] - 3.10 多重感知机的简洁实现
- javascript --- vue2.x中原型的使用(拦截数组方法) 响应式原理(部分)
- Problem 2. number题解
- 海信FW3010-5000H千兆防火墙
- iOS Appstore 版本更新
- Silverlight 3 全系列开发工具发布
- Windows Mobile 6.0下实现自绘多种状态按钮(Win32) 续