Java学习笔记(二):String

String

在Java中String是作为引用对象存在的一种数据类型,用来保存字符串。

实例化和赋值

//直接声明
String s1 = "Hello world!";
//通过构造函数创建, 提供了 11 种不同参数创建的方法
char[] c = { 'h', 'e', 'l', 'l', 'o', '.'};
String s2 = new String(c);

String类是不可改变的,所以你一旦创建了String对象,那它的值就无法改变了。如果需要对字符串做很多修改,那么应该选择使用StringBuffer或StringBuilder类。

我们来看下面的另一种创建方法:

使用这种方式来创建字符串,在堆内存中会创建两个字符串对象,因为当使用""符号是就表示创建了一个新的字符串,而str只指向了第二个对象,导致第一个对象没有引用,处于等待回收的状态,除了加大内存使用外,还增加了GC的负担,所以直接使用""来创建字符串是更好的方式。

连接字符串

String类提供了连接两个字符串的方法:

string1.concat(string2);

返回string2连接string1的新字符串。也可以对字符串常量使用concat()方法,如:

"My name is ".concat("Zara");

更常用的是使用'+'操作符来连接字符串,如:

"Hello," + " world" + "!"

结果如下:

"Hello, world!"

下面是一个例子:

1 public class StringDemo {
2    public static void main(String args[]) {     
3    String string1 = "saw I was ";     
4    System.out.println("Dot " + string1 + "Tod");  
5 }
6 }

以上实例编译运行结果如下:

Dot saw I was Tod

比较字符串

判断字符串内容是否相等,Java和大部分语言不一样,Java中==是比较两个字符串引用的地址是否相同,即是否指向同一个对象,而equals方法则比较字符串的内容是否相同。

String a = "abc";
String b = new String("abc");

a == b返回false,a.equals(b)返回true。这时创建b时不管"abc"是否存在都会new一个新的"abc",从而a和b指向的字符创对象是不同的,因此返回false。

我们来看下面的情况,容易混淆:

String a = "abc";
String b = "abc";

a == b返回true,a.equals(b)同样返回true,这是为什么呢?

原来程序在运行时有一个字符串池,创建字符串时会先查找池中是否有相应的字符串,如果已经存在的话只需把引用指向它即可,如果没有则新建一个。

上例中创建a时,会在字符串池中首先创建一个"abc",然后a指向它;创建b时,由于"abc"已经存在,b直接指向它即可。

格式化字符串

String类的format()方法用于创建格式化的字符串以及连接多个字符串对象,

format()方法有两种重载形式:

  • format(String format, Object... args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字符串。
  • format(Locale locale, String format, Object... args) 使用指定的语言环境,制定字符串格式和参数生成格式化的字符串。

显示不同转换符实现不同数据类型到字符串的转换,如图所示:

转  换  符

说    明 

示    例

%s

字符串类型

"mingrisoft"

%c

字符类型

'm'

%b

布尔类型

true

%d

整数类型(十进制)

99

%x

整数类型(十六进制)

FF

%o

整数类型(八进制)

77

%f

浮点类型

99.99

%a

十六进制浮点类型

FF.35AE

%e

指数类型

9.38e+5

%g

通用浮点类型(f和e类型中较短的)

 

%h

散列码

 

%%

百分比类型

%n

换行符

 

%tx

日期与时间类型(x代表不同的日期与时间转换符

 

测试用例:

 1 public static void main(String[] args) {  
 2     String str=null;  
 3     str=String.format("Hi,%s", "王力");  
 4     System.out.println(str);  
 5     str=String.format("Hi,%s:%s.%s", "王南","王力","王张");            
 6     System.out.println(str);                           
 7     System.out.printf("字母a的大写是:%c %n", 'A');  
 8     System.out.printf("3>7的结果是:%b %n", 3>7);  
 9     System.out.printf("100的一半是:%d %n", 100/2);  
10     System.out.printf("100的16进制数是:%x %n", 100);  
11     System.out.printf("100的8进制数是:%o %n", 100);  
12     System.out.printf("50元的书打8.5折扣是:%f 元%n", 50*0.85);  
13     System.out.printf("上面价格的16进制数是:%a %n", 50*0.85);  
14     System.out.printf("上面价格的指数表示:%e %n", 50*0.85);  
15     System.out.printf("上面价格的指数和浮点数结果的长度较短的是:%g %n", 50*0.85);  
16     System.out.printf("上面的折扣是%d%% %n", 85);  
17     System.out.printf("字母A的散列码是:%h %n", 'A');  
18 }  

输出结果:

 1 Hi,王力  
 2 Hi,王南:王力.王张  
 3 字母a的大写是:A   
 4 3>7的结果是:false   
 5 100的一半是:50   
 6 100的16进制数是:64   
 7 100的8进制数是:144   
 8 50元的书打8.5折扣是:42.500000 9 上面价格的16进制数是:0x1.54p5   
10 上面价格的指数表示:4.250000e+01   
11 上面价格的指数和浮点数结果的长度较短的是:42.5000   
12 上面的折扣是85%   
13 字母A的散列码是:41   

String、StringBuffer和StringBuider

首先,通过阅读Java源码我们可以发现String类是被final标记为不能继承的类,其内部是使用一个char数组来记录整个字符串的值,而String类的大部分改变数据的方法(如substring、concat和replace等),都是直接创建一个新的String对象改变后返回,所以我们说String的数据是不能更改的,实际上Java也没有为String设计更改其内部char数组的方法。

在这里要永远记住一点:“对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象”。

看个例子

 1 public class Main {
 2          
 3     public static void main(String[] args) {
 4         String str1 = "hello world";
 5         String str2 = new String("hello world");
 6         String str3 = "hello world";
 7         String str4 = new String("hello world");
 8          
 9         System.out.println(str1==str2);
10         System.out.println(str1==str3);
11         System.out.println(str2==str4);
12     }
13 }

输出的结果是:

1 false
2 true
3 false

为什么会出现这样的结果?下面解释一下原因:

对于JVM内存机制,在class文件中有一部分 来存储编译期间生成的 字面常量以及符号引用,这部分叫做class文件常量池,在运行期间对应着方法区的运行时常量池。

因此在上述代码中,String str1 = "hello world";和String str3 = "hello world"; 都在编译期间生成了字面常量和符号引用,运行期间字面常量"hello world"被存储在运行时常量池(当然只保存了一份)。通过这种方式来将String对象跟引用绑定的话,JVM执行引擎会先在运行时常量池查找是否存在相同的字面常量,如果存在,则直接将引用指向已经存在的字面常量;否则在运行时常量池开辟一个空间来存储该字面常量,并将引用指向该字面常量。

总所周知,通过new关键字来生成对象是在堆区进行的,而在堆区进行对象生成的过程是不会去检测该对象是否已经存在的。因此通过new来创建对象,创建出的一定是不同的对象,即使字符串的内容是相同的。

StringBuilder

我们看一下下面的例子:

1 public class Main {
2     public static void main(String[] args) {
3         String string = "";
4         for(int i=0;i<10000;i++){
5             string += "hello";
6         }
7     }
8 }

我们知道,每次对String进行连接操作都是重新生成一个新的String,那么这段代码运行后会创建10001个String对象,而存在引用的仅1个String对象,其他对象会被当做垃圾回收,造成了内存和CPU的浪费。

Java为了解决这种情况,设计了StringBuilder,StringBuilder可以直接修改其内部记录的char数组,在改变字符串时不会生成多余的对象,如下:

1 public class Main {
2     public static void main(String[] args) {
3         StringBuilder stringBuilder = new StringBuilder();
4         for(int i=0;i<10000;i++){
5             stringBuilder.append("hello");
6         }
7     }
8 }

得到的结果和上面使用String的方法一致,但避免了内存和CPU资源的浪费。

StringBuffer

实际上StringBuffer提供的功能和StringBuilder是一样的,唯一的不同就是StringBuilder是线程不安全的,只能在单线程中使用,而StringBuffer是线程安全的,可以在多线程中使用。

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

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

相关文章

数据结构杂谈(一)

在你点进来这里的一瞬间&#xff0c;欢迎你找到了宝藏 这是一些关于数据结构和算法里最详细的阐述和学习心得&#xff0c;我十分乐意和你分享这些知识。 如果你已经看完这篇杂谈&#xff0c;可以前往下一篇→数据结构杂谈&#xff08;二&#xff09;_尘鱼好美的小屋-CSDN博客 1…

计算器排html页面,htmltest~计算器界面的实现

通过divcss和部分布局的作用&#xff0c;实现了&#xff0c;如下效果的计算器展示页面![C%]R$IGDK4J(%3LJXD3]SY.png&#xff0c;废话不多说&#xff0c;最主要的还是分享代码&#xff1a;html&#xff1a;Title.计算器-口 X编辑(E)查看(V)帮助(H)BackspaceCECMC789/sqrtMR456*…

win7 git 添加 ssh key

分两步走&#xff0c;借助git bash客户端&#xff1a;第一步&#xff1a;生成秘钥创建SSH key. 在用户主目录下&#xff0c; 看看有没有.ssh目录&#xff0c; 如果有&#xff0c; 再看看这个目录下有没有id_rsa 和 id_rsa.pub 这两个文件&#xff0c; 如果已经有了&#xff0c;…

解决三星手机EditText背景色的问题

问题描述android:background"#ffffff"其他手机手机背景都是白色&#xff0c;三星却是黑色的。怎么办 解决方案1写个主题测试下 解决方案2检查是三星的手机换背景色解决方案3你自己设置下edittext的背景就好了 解决方案4三星手机没这bug&#xff0c;你的固件不是正常的…

操作系统随笔(二)

如果你还没有读过第一篇随笔&#xff0c;请点击这里→操作系统随笔&#xff08;一&#xff09; 文章目录[toc]2 进程和线程2.1 进程2.1.1 进程模型2.1.2 进程的创建2.1.3 进程的终止2.1.4 进程的层次结构2.1.5 进程的状态2.1.6 进程的实现2.2 线程2.2.1 进程的使用2.2.2 经典的…

golang实现常用数据结构

2019独角兽企业重金招聘Python工程师标准>>> 1.数组栈的实现 package mainimport ( "fmt")type ItemType inttype Stack struct { node [10]ItemType maxsize int top int}func StackInit(p *Stack) { p.top -1}func StackCheckFull(p *Stack) bo…

【问题解决】无法创建新的堆栈防护页面

【问题发现】 项目中需要几个自定义的控件,菜鸟D定义了一个接口,打算使用多态来统一调用。在完成两个自定义控件后&#xff0c;项目都能正常运行。但是在第三个控件使用的时候就出了问题&#xff1a;将控件拖到界面上以后&#xff0c;不能拖动改变控件的宽度&#xff0c;一拖动…

java及python调用RabbitMQ

1,python调用MQ发送消息(生产者),话不多说,直接上干货 import pika 如下图 2.java调用MQ发送消息(生产者) 具体代码如下: python 的代码如下 connection pika.BlockingConnection(pika.ConnectionParameters(IP,端口,/))channel connection.channel()msg_props pika.Bas…

html知识收集(一)

1.页内跳转iframe <ul> <li><a href"1.html" target"iframe1">1</a></li> <li><a href"2.html" target"iframe1">2</a></li> </ul> </ul> <iframe name"i…

设定Word段落的背景色

段落背景不同于文字区别。很多新接触word的朋友都找不到怎么弄。 先把光标停留在需要设置的段落文字上&#xff0c;或者选择需要设置的段落文字。 点击段落里的边框和底纹&#xff0c;如图 在弹出框中选择底纹。 选择需要填充的颜色&#xff0c;在左下角处把文字切换成段落。…

Hadoop随笔(二)

文章目录[toc]2 Hadoop概念2.1 Hadoop简介2.2 MapReduce编程模型简介2.3 Hadoop系统的组成2 Hadoop概念 面对大数据量的处理需求&#xff0c;一个常用的方法就是把它们分割成互不依赖的小份数据来分别计算处理&#xff0c;这就是所谓的单指令多数据流(SIMD)的数据计算模式。Ha…

HDU 5102 The K-th Distance

题意&#xff1a;给你n-1条边&#xff0c;然后没两个节点的距离按照递增的顺序&#xff0c;求出前k项的和。 官方题解&#xff1a; 把所有边(u,v) 以及(v,u)放入一个队列&#xff0c;队列每弹出一个元素(u,v)&#xff0c;对于所有与u相邻的点w&#xff0c;如果w!v&#xff0c;就…

spring AOP 之五:Spring MVC通过AOP切面编程来拦截controller

示例1&#xff1a;通过包路径及类名规则为应用增加切面 该示例是通过拦截所有com.dxz.web.aop包下的以Controller结尾的所有类的所有方法&#xff0c;在方法执行前后打印和记录日志到数据库。 新建一个springboot项目 1&#xff1a;首先定义maven <?xml version"1.0&q…

数据结构杂谈(二)

本文的所有代码均由C编写 如果你已经看完这篇杂谈&#xff0c;可以前往下一篇→数据结构杂谈&#xff08;三&#xff09;_尘鱼好美的小屋-CSDN博客 文章目录2 顺序表2.1 线性表的类型定义2.2 类C语言有关操作补充2.2.1 ElemType的解释2.2.2 数组定义2.2.3 建立链表可能会用到的…

2月份Web服务器份额:排名不变 仅Microsoft份额上扬

IDC评述网&#xff08;idcps.com&#xff09;02月29日报道&#xff1a;近日&#xff0c;Netcraft公布了全球Web服务器最新数据。根据显示&#xff0c;2016年2月&#xff0c;Netcraft收到调查的网站共计933,892,520家&#xff0c;相比上月增加3%。在全球主流Web服务器市场上&…

每日一题——剑指offer18单链表的删除

如果您是第一次看我写的博客&#xff0c;可以给我点个赞并关注我吗&#xff0c;我会持续分享更多有意思的干货。 每日一题系列从今天开始&#xff0c;由于我是个算法小白&#xff0c;所以我会给你看看小白是怎么学的。&#x1f487; 文章目录1 题目2 思路3 代码4 小结1 题目 剑…

王道操作系统考研笔记——1.1.1 操作系统的概念、功能和目标

如果这篇博客对您有用的话&#xff0c;可以给我点个赞吗&#xff0c;这对我很重要&#xff0c;谢谢&#xff01;❤️ 文章目录1.1.1 操作系统的概念、功能和目标1.1.1.1 操作系统的概念1.1.1.2 作为系统资源的管理者1.1.1.3 作为用户和计算机硬件之间的接口1.1.1.4 作为最接近硬…

《从零开始学Swift》学习笔记(Day 8)——小小常量、变量大作用

原创文章&#xff0c;欢迎转载。转载请注明&#xff1a;关东升的博客计算机语言学习中都有常量和变量&#xff0c;他们几乎是我编写代码的灵魂了&#xff0c;离开他们我真的是“活不了”常量是标识符的前面加上关键字let。常量其值在使用过程中不会发生变化的量&#xff0c;下面…

王道操作系统考研笔记——1.1.2 操作系统的特征

如果这篇博客对您有用的话&#xff0c;可以给我点个赞吗&#xff0c;这对我很重要&#xff0c;谢谢&#xff01;❤️ 1.1.2 操作系统的特征 文章目录1.1.2 操作系统的特征1.1.2.1 并发1.1.2.2 共享1.1.2.3 并发和共享的关系1.1.2.4 虚拟1.1.2.5 异步1.1.2.6 小结我们接下来讲的…

linux新起之秀-linux文件属性

2019独角兽企业重金招聘Python工程师标准>>> 从做到右&#xff1a;1为inode 的节点号&#xff1b;2为文件类型及权限&#xff1b;3为文件或目录的硬链接数&#xff1b;4为属主及所归属的组(属主就想象似地主&#xff0c;属组就像奴才的部分)&#xff1b;5为文件或者…