面试中,关于字符串问题,出现几率比较高的两个问题
第一个问题:
public static void main(String[] args)
{
String s = new String("abc"); //执行到这一行时,创建了几个对象?
String s1 = "abc"; //执行到这一行时,创建了几个对象?
String s2 = new String("abc"); //执行到这一行时,创建了几个对象?
System.out.println(s == s1); //输出结果是什么?
System.out.println(s == s2); //输出结果是什么?
System.out.println(s2 == s1); //输出结果是什么?
}
解答:
(1) 执行第一行的时候创建两个对象。为什么是两个对象,我们先来分析下。应为String类型是一个特殊类型,因为是final 来存储字符串对象。所以一旦创建String类型的字符串,就不能更改。关于用常量来声明字符串对象就要不得不说String pool 的概念(关于String pool 的概念,我在下一章进行详细介绍,这里不多说了。)。在这里记住一点凡是""声明的字符串对象都存储在String pool池中。
那么在执行第一句中("abc")声明的对象就存储在String pool中,这是声明第一个对象。
当new Strring时,又产生一个对象,只不过这个对象是存放在内存heap(堆中)。还要记住一点只要有new 关键字就会产生一个新的对象,这是声明的第二个对象。
答案:执行第一行产生2个对象。
(2)当执行第二行的时候,我说过凡是用""声明的字符串对象就会存储到String pool池中。
但这里需要记住的是String pool池中,不会存储相同的字符串对象,每当用""声明字符串对象前,都会先检查String pool池中,是否存在相同的字符串对象。如果存在相同的字符串对象,则返回该对象。如果没有该字符串对象,则把该对象加入String pool池中。因为执行第一行时,已经把"abc"字符串放到String pool池中,所以当执行String s1="abc";已经发现String pool池中有abc字符串,则不会创建,而是直接返回该对象。所以这行并没有创建对象
答案:执行第二行产生0个对象。
(3)执行第三行时,我说过"abc"对象已经存在String pool池中,则不会创建。记住String pool池中不会存储相同字符串对象。只要有new 的地方就会在heap(堆)中产生一个新的对象。
答案:执行第三行产生1个对象。
(4)因为s引用的对象是存储在String pool池中,而s1引用的对象是存储在heap(堆)中,引用的不是同一个对象。所以执行System.out.println(s == s1);
答案:结果为false。
(5)因为s引用的对象是存储在String pool池中,而s2引用的对象是存储在heap(堆)中,引用的不是同一个对象。所以执行System.out.println(s == s2);
答案:结果为false。
(6)虽然s1和s2引用的对象都存储在heap(堆)中,但他们的内存地址不相同,所以不是同一个对象,这是因为使用new 关键字创建对象时,会新开辟一块内存空间来存放对象。所以用new 创建同一个对象,永远都不会相同。所以执行System.out.println(s2 == s1);
答案:结果为false。
-----------------------------------------------------------------------------
下面是一个关于字符串的机试问题:
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
样例:
/*
* 按照指定字节,截取子字符串函数
* @param str 要截取的字符串
* @param len 要截取的字节数
* @return String 截取后子字符串
*/
public static String splitString(String str,int len)
{
if(str==null||str.equals(""))
{
return "";
}
byte[] b=str.getBytes();
String subString=null;
if(b.length<len || len<0)
{
return str;
}
if(len>1)
{
if(b[len]<0)
{
subString=new String(b,0,--len);
}
else
{
subString=new String(b,0,len);
}
}
else
{
if(len==1)
{
if(b[len]<0)
{
subString=new String(b,0,++len);
}
else
{
subString=new String(b,0,len);
}
}
}
return subString;
}
下面提供两个按照指定编码截取字符串
第一种按照:Unicode 编码方式来产生字节数组
String str="我爱java";
String s=str.getBytes("Unicode");
这种方式产生的字节数组,字节数组的前两个字节为标志位,如byte[0]=-1,byte[1]=-2。从第三位开始才是真正的字符串。在Unicode 编码下,汉字、英文、数字都是两个字节。而英文和数字,第一个字节是相应的ASCII码,第二个字节是0.而汉字两个字节都大于0.
这种方法每个字符都是两个字节:
/*
* 按照双字节,截取指定函数
* @param str 要截取的字符串
* @param len 要截取的长度
* @return string 截取后的字符串
*/
public static String mySubString(String str,int len) throws UnsupportedEncodingException
{
/*首先把目标字符串分解成Unicode编码的字节数组,
* 这样的目的是每个字符都变成两个字节,在根据
* 英文和数字字符在Unicode编码下,第一个字节
* 是相应的ASCII码,第二个字节为0的特征,来进行
* 计算
*/
int pos=len+1;
byte[] b=str.getBytes("Unicode");
if(b[len]==0)
{
return new String(b,0,len+1,"Unicode");
}
if(b[len]!=0)
{
if(b[len+1]!=0)
{
if((len%2!=0))
{
return new String(b,0,len+1,"Unicode");
}
else
{
return new String(b,0,len+2,"Unicode");
}
}
else
{
return new String(b,0,len+2,"Unicode");
}
}
return null;
}
-------------------------------------------------------------------------------
第二种按照:GBK编码方式产生字节数组
String str="我爱java";
String s=str.getBytes("GBK");
这种方式产生的字节数组,汉字是两个字节,英文和数字是一个字节。而汉字两个字节都小于0.而英文和数字产生的字节都是相对应的ASCII码。如 a 对应 97。
样例:
/*
* 目标字符串中截取指定字节函数
* @param str 要截取的字符串
* @param len 要截取的长度
* @return string 截取后的字符串
*/
public static String mySubString(String str,int len,String symbol) throws UnsupportedEncodingException
{
if(str==null||str.equals(""))
{
return "";
}
int count=0;
byte[] b=str.getBytes("GBK");
if(b.length<len)
return str;
for(int i=0;i<b.length;i++)
{
if(b<0)
{
count++;
}
}
if(count%2==0)
{
return new String(b,0,len,"GBK")+symbol;
}
else
{
return new String(b,0,len-1,"GBK")+symbol;
}
}
分享到:
相关推荐
下面是关于 Java 字符串截取函数的知识点: 字符串截取函数 Java 中有多种方式可以实现字符串截取,包括使用 `substring`、`split` 和 `StringTokenizer` 等方法。在本例中,我们使用 `substring` 方法来实现字符...
根据提供的文件信息,本文将详细解释Java中截取字符串的各种方法及其使用场景,并结合部分示例代码进行说明。 ### Java中截取字符串的方法 在Java编程语言中,字符串的处理是一项非常重要的技能,特别是在开发中...
在JavaServer Pages (JSP) 中,字符串截取是一项常见的任务,特别是在处理用户输入或显示数据时。JSP 提供了内置对象和脚本元素来处理字符串操作,其中包括字符串截取。下面我们将深入探讨如何在 JSP 页面中进行字符...
在Java编程中,有时我们需要对字符串进行精确...在Java中,可以通过字节码判断是否为中文字符,从而实现精确截取。这些技术在处理中文文本时非常实用,尤其在界面展示、数据存储或传输时,确保了信息的完整性和可读性。
### Java中截取带汉字的字符串 在Java编程语言中,处理包含中文字符的字符串时,经常遇到的一个问题是如何正确地截取这些字符串。如果直接按照字节(byte)来进行分割,很容易导致中文字符被截断一半,从而形成乱码。...
在Java中,字符串是对象,它们存储在堆内存中,并由`String`类表示。每个字符在Unicode编码中占据一个或多个字节。默认情况下,Java使用UTF-16编码,每个字符占用2个字节,但也可以根据需要使用其他编码,如GBK或UTF...
根据提供的信息,我们可以了解到这是一篇关于在批处理脚本(Bat文件)中截取字符串的文章。批处理脚本是一种Windows环境下的脚本语言,它能够执行一系列预先编写的命令来实现特定的功能。本文将详细介绍如何在批处理...
JAVA按照字节截取字符串是Java编程语言中的一项重要技术,通过本文,我们将详细介绍如何使用Java语言按照字节截取字符串。 首先,我们需要了解什么是字节截取。在计算机科学中,字节是信息技术中使用的基本单位,...
在编程领域,字符串操作是一项基础且重要的任务,而“截取字符串”是其中的一个关键功能。这个小demo展示了如何在不同的编程环境中实现字符串截取,同时也涉及到字符串的空格处理。接下来,我们将深入探讨这两个主题...
oracle,按特定字符,截取字符串,直接出结果 oracle,按特定字符,截取字符串,直接出结果oracle,按特定字符,截取字符串,直接出结果
在C++编程中,`std::string`是一个非常重要的数据类型,用于表示和操作字符串。本文将详细解析两种常用的C++ `std::string`截取字符串的方法:`find`和`find_last_of`,以及如何结合使用它们来满足各种字符串处理...
在C#编程中,有时我们需要根据字节长度来截取字符串,这可能是因为要处理不同编码格式的数据,或者为了适应特定的传输限制。本篇将详细介绍如何在C#中按照字节长度截取字符串,并结合正则表达式进行操作。 首先,...
在ASP(Active Server Pages)中,处理字符串是常见的任务之一,尤其在网页开发中,我们经常需要截取字符串以满足特定的需求。`ASP截取字符串`这个话题涉及到如何使用ASP内置的函数或自定义方法来操作字符串,以便控制...
Java中的`String`类提供了多种截取字符串的方法,如`substring()`、`subSequence()`等,但它们都是基于字符(char)而不是字节的。因此,如果我们需要按照字节截取,需要自定义方法来处理。以下是一个简单的示例,...
字符串在各种编程语言中都是基本的数据类型,如Python中的`str`,Java中的`String`,JavaScript中的`String`等。 截取字符串通常有两种主要方法:固定位置截取和指定长度截取。 1. 固定位置截取:这种方法通常基于...
- 通过提供的"怎么截取字符串的小例子.txt"文件,我们可以看到一个具体的应用场景,比如从日志文件中提取特定信息,或者解析URL获取域名等。 4. **进阶应用** - 正则表达式:除了基本的截取,我们还可以使用正则...
在Delphi编程环境中,处理中文和英文混合的字符串截取是一项常见的任务,特别是在涉及到文本处理、数据解析或者用户界面展示时。由于Unicode编码的存在,中文字符通常占据两个字节,而英文字符则占据一个字节,这就...
在处理通信数据时,我们经常需要对字符和字符串进行操作,例如将字符转换为字符串,或者从字符串中截取有效字符。以下将详细介绍在TIA博途中如何实现这些操作。 首先,字符转换为字符串的过程通常涉及到ASCII码。...
适合刚刚进入(JavaScript,Vue)编程领域的小白使用
- 这个例子展示了当字符串中有多个分隔符时如何截取特定部分。这里使用了`split()`方法将字符串按照等号分割,然后从第二个元素中截取出前四个字符。 #### 5. 再次使用`substr()` ```javascript var str = ...