常用类回顾之(String类)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ad如何设置pcb板子形状_俺老孙画个圈板框与安装孔PCB系列教程110

点击上方蓝字关注我们画个板子,要先划圈,把所有笨蛋元器件圈起来。这个圈,就是板子的边框,简称板框。自定义板框形状比较复杂的电路板,一般由专业的CAD结构工程师设计,并提供DWG或者DXF格式的文件给电子工程…

Mybatis查询传递单个参数和传递多个参数用法

一:单个参数,Mybatis不会做特殊处理 二:多个参数,Mybatis会做特殊处理 1:传递多个多个参数时候,第一种写法如下 比如传递了两个参数,用 #{param1} and #{param2}取值 2:传递多个多个参数时候&#xff0c…

No.7 nginx、nfs、集群

安装并启动nginx服务 1、二进制安装nginx包 ~ yum -y install epel-release && yum -y install nginx #配置环境 关闭防火墙 ~ iptables -F // 或 systemctl stop filewallf 2、作为web服务修改配置文件 ~ vim /etc/nginx/nginx.conf //暂时不修改配置 3…

jsapi支付签名_微信支付小程序支付全流程

点击蓝色字关注我们!一个努力中的公众号长的好看的人都关注了本文给大家讲解微信小程序支付全流程,以及相关功能源代码,项目不开放,带来不便尽请谅解。小程序支付主要包含如下几步骤,1.预下单-调用微信统一下单接口进行…

攻击防护手段_如何防护ddos流量攻击?

量攻击分很多种:我们常见的DDOS CC SYN UDP等,目前在网络中,流量攻击比较难解决,普通的IDC机房或是服务器商都是依靠硬防来解决,但是碰到大流量攻击,往往是拔线了事,所以都不是什么好办法&#…

MyBatis参数名称解析器-ParamNameResolver解析

ParamNameResolver ParamNameResolver是一个参数名解析器,负责把方法的参数按顺序解析出来并进行标注 主要用来处理接口形式的参数,最后会把参数处放在一个map中 map的key为参数的位置,value为参数的名字 package org.apache.ibatis.refle…

json 取值判断_【收藏级】.NETCore3.1中的Json互操作解读

本文将会全面介绍System.Text.Json 和 Newtonsoft.Json 的相同和异同之处,方便需要的同学做迁移使用,对未来,我们保持期待。文档比较几个重要的对象在 System.Text.Json 中,有几个重量级的对象,所有的JSON互操作&#…

学习Java的深拷贝和浅拷贝

关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象。可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用传递将会有更深的理解。 …

转list_你知道Java数组转List的三种方式及对比吗?

前言:本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。一.最常见方式(未必最佳)通过 Arrays.asList(strArray) 方式,将数组转换List后,不能对List增删,只能查…

Mybatis中的#号与$符号的区别

1、#{变量名}可以进行预编译、类型匹配等操作, 2、#{变量名}会转化为jdbc的类型。 3、${变量名}不进行数据类型匹配,直接替换。 4、#方式能够很大程度防止sql注入。 5、$方式无法方式sql注入。 6、$方式一般用于传入数据库对象,例如传入…

创建存储问题总结

创建存储过程时 1 drop procedure if exists pro_1; 2 delimiter // 3 create procedure pro_1( 4 5 ) 6 begin 7 8 end // 9 delimiter ; 发现这个问题时时因为看到输出的最后delimiter中有两个分号,所以怀疑这个地方语法存在问题 结尾的delimiter ; …

Windows如何安装MSMQ消息队列

1 打开控制面板,找到下图所示的服务器核心,然点击确定 2 等待安装完成 转载于:https://www.cnblogs.com/acetaohai123/p/6610302.html

讲字节数组转化为base64_Base64编码简介及简单实现

Base64编码是一种将字节数据编码为字符串的编码,字节数据会被编码成由64个可打印ASCII字符组成的字符串,这64个字符包括大写字母A-Z, 小写字母a-z, 以及数字 0 -9再加上 和 / ,刚好64个字符。对应的字符表如下图:base64编码的一个用途就是对…

Mybatis返回Map

返回一条记录的map resultType“map“ key就是列名,值就是对应的值 多条记录封装成一个map Select返回类型中是返回Map时,是对方法中是否存在注解MapKey,这个注解我也是第一次看到,当时我也以为是纯粹的返回单个数据对象的Map…

Mybatis中注解@MapKey的使用详解

MyBatis查询一些记录,数据涉及到两个表里的数据,需要连表查询,但我MyBatis的返回结果不想创建新的DO对象,因此使用MapKey注解返回一个Map集合。 含义:MapKey注解用于mapper.xml文件中,一般用于查询多条记录…

更新 绑定数据_Blazor 修仙之旅 组件与数据绑定

一.前言在第一篇文章初尝 Blazor WebAssembly中,有提到过组件(Component)这个概念。组件在 Blazor 中是必不可少的,UI 全靠它组装起来,和前端的 JS 组件是一个意思,比如:vue component、react component 等等。借用官方…

关于使用idea工具debug时,断点颜色由红色变成灰色解决方法

在使用断点调试的时候,发现断点由原来的红色变成灰色的,后来发现是由于错误操作将Debug断点调试禁用了 ,只需要点击禁用按钮取消就可以了