百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

String类的几个常见问题,面试有用

toyiye 2024-06-21 12:37 10 浏览 0 评论

先简单通过代码说明下String类的不变性

String str ="abc";

初始化一个字符串str,表示变量str储存字符串String对象的引用,“abc”存放在堆中,将存放地址赋给str。

String str2 = str;

将堆中的“abc”的存储地址又赋给字符串引用变量str2。

str = str.concat("def");

将字符串"def"连接到str,此时str不在储存“abc”的储存地址,而是将堆中新创建一个String对象“abcdef”赋给str。

总结:一旦在内存(堆中)创建一个String对象时,它将不再改变,所有的String类的方法不是去改变String对象,而是重新返回一个新的对象。如果我们想改变String,你可以使用StringBuffer或者StringBuilder,此时由于每创建一个对象,需要很多的时间来进行垃圾回收。

为什么String类是不可变类?

String类是Java中的不变类,不变类表明它的实例是不能被修改的。当实例被创建时,它的所有信息都被初始化并且不能被修改。设置成不变类有很多优点。下面从内存、同步和数据结构的角度来分析不变性的好处。

1. 字符串池的需要。字符串池是方法区的特定存储空间。当字符串被创建时,如果此字符串已经存在,存在的字符串引用将被返回,而不是新创建一个对象。

String s1 = "abc";
String s2 = "abc";

以上两个代码虽然有两个引用常量,但是堆中仅有一个String对象。如果String类是可变的,使用一个引用改变字符串将使其他引用的值发生错误。

2. 缓存Hashcode。

Hashcode经常在Java中被使用。比如HashMap,HashSet等。String类被设置成不变的,可以保证Hashcode的值不变,并且能够被缓存,不需要担心值得改变。也就是说,不需要在每次使用的时候都计算Hashcode的值。这是很高效的

private int hash; 

这是String类中的变量,用来缓存hash code的。

3. 推进其他对象的使用。

如:

HashSet<String> hashSet = new HashSet<String>();
hashSet.add(new String("a"));
hashSet.add(new String("b"));
for(String s: hashSet)
 s.value = "a";

上述代码只是展示用的,在String类中没有值域。

如果String类是可变的,它的值是可以改变的,这就违反了set的设计初衷。

4. 安全考虑。

String经常被Java类当做参数进行传递。比如网络连接或者打开文件。当String对象时可变的,网络连接和文件都可以被改变,这会引起安全性的威胁。以为已经连接上的,实际上并没有。当String参数是可变的时候,也可以在映射中造成安全威胁。

如以下例子:

boolean connect(string s){
 	if (!isSecure(s)) {
 throw new SecurityException();
//这将导致问题,如果在之前使用其他引用改变了s. 
 	}
 causeProblem(s);
 }

5.不可变对象是天然线程安全的。

因为不可变对象是不能被改变的,所以它的可以被多线程之间共享的。

String中对象的比较

String a = "abcd";
String b = "abcd";
System.out.println(a == b); //true,字符串常量池的存在,内存引用相同
System.out.println(a.equals(b)); //true,两个对象的值确实相等
又
String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d); //false c和d指向堆中的两个对象,不同的对象有不同的内存引用。
System.out.println(a.equals(d));//true,值相等

值传递问题

public static void main(String[] args) {
		String x = new String("ab");
 		change(x);
		System.out.println(x);
}
public static void change(String x) {
 		x = "cd";
 }

上述代码的输出结果是ab。

首先当字符串“ab”被创建时,Java将分配内存中的一块区域来存储String对象,之后对象赋给变量x, 对象引用赋给变量x 这个引用是存储对象的内存地址。这个变量x包含指向String对象的引用,它不只是引用自己,它是一个变量存储一个引用(内存地址)。

Java仅仅是通过值传递。当x传递给change()方法时,一个x值的拷贝(一个引用)被传递过去。 方法change()创建了另一个对象“cd”,它有着不同的引用。是x的拷贝指向“cd”对象,

它存储着“cd”对象的引用(内存地址)。main()方法中还是之前的那个变量x.

Java String类的几个问题

1.将String转化成int

String str1 = "34";
int value1 = Integer.parseInt(str1);
System.out.println(value1);

2.用空白字符将字符串转化成字符数组

String str3 = "shane is a genius";
String[] strArray1 = str3.split("\\s+");
//String[] strArray1 = str3.split(" ");
System.out.println(Arrays.toString(strArray1));

3.重复字符串。使用Apache commons lang package

String str4 = "abc";
String str5 = StringUtils.repeat(str4, 2);//指的是将str4重复2次
System.out.println(str5);

4.将字符串转化成日期

String str6 = "Aug 16,1929";
try {
 Date date = new SimpleDateFormat("MMMM d,yy", Locale.ENGLISH).parse(str6);
 System.out.println(date);
} catch (ParseException e) {
 e.printStackTrace();
}

5.数一个字符串中重复出现的字符的数量。使用Apache commons lang package

String str7 = "2145454445";
int count = StringUtils.countMatches(str7, "4");
System.out.println(count);

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码