`

Java 面试中关于截取字符串例子

阅读更多
面试中,关于字符串问题,出现几率比较高的两个问题 


第一个问题: 



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编写一个截取字符串的函数,输入为一个字符串和字节数.docx

    下面是关于 Java 字符串截取函数的知识点: 字符串截取函数 Java 中有多种方式可以实现字符串截取,包括使用 `substring`、`split` 和 `StringTokenizer` 等方法。在本例中,我们使用 `substring` 方法来实现字符...

    java中如何截取字符串.txt

    根据提供的文件信息,本文将详细解释Java中截取字符串的各种方法及其使用场景,并结合部分示例代码进行说明。 ### Java中截取字符串的方法 在Java编程语言中,字符串的处理是一项非常重要的技能,特别是在开发中...

    jsp页面截取字符串

    在JavaServer Pages (JSP) 中,字符串截取是一项常见的任务,特别是在处理用户输入或显示数据时。JSP 提供了内置对象和脚本元素来处理字符串操作,其中包括字符串截取。下面我们将深入探讨如何在 JSP 页面中进行字符...

    Java精确截取字符串.doc

    在Java编程中,有时我们需要对字符串进行精确...在Java中,可以通过字节码判断是否为中文字符,从而实现精确截取。这些技术在处理中文文本时非常实用,尤其在界面展示、数据存储或传输时,确保了信息的完整性和可读性。

    java中截取带汉字的字符串

    ### Java中截取带汉字的字符串 在Java编程语言中,处理包含中文字符的字符串时,经常遇到的一个问题是如何正确地截取这些字符串。如果直接按照字节(byte)来进行分割,很容易导致中文字符被截断一半,从而形成乱码。...

    按byte截取字符串

    在Java中,字符串是对象,它们存储在堆内存中,并由`String`类表示。每个字符在Unicode编码中占据一个或多个字节。默认情况下,Java使用UTF-16编码,每个字符占用2个字节,但也可以根据需要使用其他编码,如GBK或UTF...

    bat截取字符串

    根据提供的信息,我们可以了解到这是一篇关于在批处理脚本(Bat文件)中截取字符串的文章。批处理脚本是一种Windows环境下的脚本语言,它能够执行一系列预先编写的命令来实现特定的功能。本文将详细介绍如何在批处理...

    JAVA如何按字节截取字符串

    JAVA按照字节截取字符串是Java编程语言中的一项重要技术,通过本文,我们将详细介绍如何使用Java语言按照字节截取字符串。 首先,我们需要了解什么是字节截取。在计算机科学中,字节是信息技术中使用的基本单位,...

    截取字符串

    在编程领域,字符串操作是一项基础且重要的任务,而“截取字符串”是其中的一个关键功能。这个小demo展示了如何在不同的编程环境中实现字符串截取,同时也涉及到字符串的空格处理。接下来,我们将深入探讨这两个主题...

    oracle按特定字符截取字符串

    oracle,按特定字符,截取字符串,直接出结果 oracle,按特定字符,截取字符串,直接出结果oracle,按特定字符,截取字符串,直接出结果

    详解C++ string常用截取字符串方法

    在C++编程中,`std::string`是一个非常重要的数据类型,用于表示和操作字符串。本文将详细解析两种常用的C++ `std::string`截取字符串的方法:`find`和`find_last_of`,以及如何结合使用它们来满足各种字符串处理...

    C# 按照字节长度截取字符串

    在C#编程中,有时我们需要根据字节长度来截取字符串,这可能是因为要处理不同编码格式的数据,或者为了适应特定的传输限制。本篇将详细介绍如何在C#中按照字节长度截取字符串,并结合正则表达式进行操作。 首先,...

    ASP截取字符串

    在ASP(Active Server Pages)中,处理字符串是常见的任务之一,尤其在网页开发中,我们经常需要截取字符串以满足特定的需求。`ASP截取字符串`这个话题涉及到如何使用ASP内置的函数或自定义方法来操作字符串,以便控制...

    关于java按字节截取带有汉字的字符串的解法

    Java中的`String`类提供了多种截取字符串的方法,如`substring()`、`subSequence()`等,但它们都是基于字符(char)而不是字节的。因此,如果我们需要按照字节截取,需要自定义方法来处理。以下是一个简单的示例,...

    截取指定长度的字符串

    字符串在各种编程语言中都是基本的数据类型,如Python中的`str`,Java中的`String`,JavaScript中的`String`等。 截取字符串通常有两种主要方法:固定位置截取和指定长度截取。 1. 固定位置截取:这种方法通常基于...

    怎么截取字符串的小程序

    - 通过提供的"怎么截取字符串的小例子.txt"文件,我们可以看到一个具体的应用场景,比如从日志文件中提取特定信息,或者解析URL获取域名等。 4. **进阶应用** - 正则表达式:除了基本的截取,我们还可以使用正则...

    delphi 实现截取字符串中中文+英文混合截取

    在Delphi编程环境中,处理中文和英文混合的字符串截取是一项常见的任务,特别是在涉及到文本处理、数据解析或者用户界面展示时。由于Unicode编码的存在,中文字符通常占据两个字节,而英文字符则占据一个字节,这就...

    TIA博途-字符转换为字符串以及截取字符串有效字符的具体方法示例.docx

    在处理通信数据时,我们经常需要对字符和字符串进行操作,例如将字符转换为字符串,或者从字符串中截取有效字符。以下将详细介绍在TIA博途中如何实现这些操作。 首先,字符转换为字符串的过程通常涉及到ASCII码。...

    VUE 截取字符串的方法

    适合刚刚进入(JavaScript,Vue)编程领域的小白使用

    js截取字符串

    - 这个例子展示了当字符串中有多个分隔符时如何截取特定部分。这里使用了`split()`方法将字符串按照等号分割,然后从第二个元素中截取出前四个字符。 #### 5. 再次使用`substr()` ```javascript var str = ...

Global site tag (gtag.js) - Google Analytics