`
singleFcb
  • 浏览: 5833 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中String类

阅读更多

       昨天面试碰见一个笔试题。题目要求:利用String自身的方法,将一个由正整数组成的字符串,转变为int数组后倒序输出(例如“123”输出321)。

      

public static void reverse(String str){
		char[] chs = str.toCharArray();
		for (int i = chs.length-1; i >0; i--) {
			System.out.println((int) (chs[i])- (int) ('0'));
		}
	}

       这是我现在认为最标准的答案,不知道大家有没有什么别的想法。

 

       

public final class String implements java.io.Serializable,Comparable<String>,CharSequence {

       上面可以看出,String类实现了三个接口,用于序列化Serializable接口,用于比较的泛型接口Comparable<String>和CharSequence接口,对于前两个接口可能都比较熟悉,那么第三个接呢。

 

       CharSequence接口有四个方法:

         int length();返回字符数组的长度。

        char charAt(int index):返回制定索引处的字符。

        CharSequence subSequence(int start, int end);返回有start开始到end之前的字符所组成的字符数组。

        String toString():返回该字符数组对应的String。

 

	private final char value[];
	private final int offset;
	private final int count;
	private int hash; 
	private static final long serialVersionUID = -6849794470754667710L;
	private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];

       这是String类里定义私有变量,value[]就是String对应的字符数组,offset一直没搞懂,求指教啊,count就是String对应字符序列中的字符数,hash是String对应的hash码。其中value[]和coun应该是我们一般需要知道的,别的就不用了。

 

       再来看看String中主要的方法:

       String的构造方法有很多,可以分为以下几类:

              1、不传任何参数,也就是构造一个空字符串;

              2、传入String对象,StringBuffer对象或者StringBuilder对象。

              3、传入byte数组,并且带别的参数,用于表示截取长度的int,截取开始位置的int和用于表示字符集的String;

              4、传入char数组,其余参数包括截取开始位置的int,截取长度的int

              5、传入int数组,所带参数与char类似。

 

       length(),实现自CharSequence 接口,返回count也就是字符串长度。

       isEmpty(),返回count==0。

       charAt(int index),返回指定索引处的字符。

       void getChars(char dst[], int dstBegin) :将字符串中的字符从begin位置开始copy到dst[]数组中。

       public byte[] getBytes(String charsetName):获得byte数组。

       public byte[] getBytes(Charset charset):返回制定charset的byte数组。

       public byte[] getBytes():返回byte数组。

       public boolean equals(Object anObject):覆盖object中的equals方法。

       实现代码如下:比较简单

 

public boolean equals(Object anObject) {
		if (this == anObject) {
			return true;
		}
		if (anObject instanceof String) {
			String anotherString = (String) anObject;
			int n = count;
			if (n == anotherString.count) {
				char v1[] = value;
				char v2[] = anotherString.value;
				int i = offset;
				int j = anotherString.offset;
				while (n-- != 0) {
					if (v1[i++] != v2[j++])
						return false;
				}
				return true;
			}
		}
		return false;
	}

      用于和StringBuffer进行内容比较的一个方法:

 

 

public boolean contentEquals(StringBuffer sb) {
		synchronized (sb) {
			return contentEquals((CharSequence) sb);
		}
	}

     上面的方法实际调用了和CharSequence进行内容比较的方法,也就是针对每一位的字符进行对比,当然前面还有几个短路比较。

public boolean contentEquals(CharSequence cs) {
		if (count != cs.length())
			return false;
		// Argument is a StringBuffer, StringBuilder
		if (cs instanceof AbstractStringBuilder) {
			char v1[] = value;
			char v2[] = ((AbstractStringBuilder) cs).getValue();
			int i = offset;
			int j = 0;
			int n = count;
			while (n-- != 0) {
				if (v1[i++] != v2[j++])
					return false;
			}
		}
		// Argument is a String
		if (cs.equals(this))
			return true;
		// Argument is a generic CharSequence
		char v1[] = value;
		int i = offset;
		int j = 0;
		int n = count;
		while (n-- != 0) {
			if (v1[i++] != cs.charAt(j++))
				return false;
		}
		return true;
	}

     public boolean equalsIgnoreCase(String anotherString):忽略大小写的同类比较。

 

 

public boolean equalsIgnoreCase(String anotherString) {
		return (this == anotherString) ? true : (anotherString != null)
				&& (anotherString.count == count)
				&& regionMatches(true, 0, anotherString, 0, count);
	}

     comparable接口的compareTo方法:

public int compareTo(String anotherString) {
		int len1 = count;
		int len2 = anotherString.count;
		int n = Math.min(len1, len2);
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;

		if (i == j) {
			int k = i;
			int lim = n + i;
			while (k < lim) {
				char c1 = v1[k];
				char c2 = v2[k];
				if (c1 != c2) {
					return c1 - c2;
				}
				k++;
			}
		} else {
			while (n-- != 0) {
				char c1 = v1[i++];
				char c2 = v2[j++];
				if (c1 != c2) {
					return c1 - c2;
				}
			}
		}
		return len1 - len2;
	}

    String还给我们提供了一个比较工具类:

public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();

   该类的实现代码如下(比较简单):

private static class CaseInsensitiveComparator implements
			Comparator<String>, java.io.Serializable {
		// use serialVersionUID from JDK 1.2.2 for interoperability
		private static final long serialVersionUID = 8575799808933029326L;

		public int compare(String s1, String s2) {
			int n1 = s1.length(), n2 = s2.length();
			for (int i1 = 0, i2 = 0; i1 < n1 && i2 < n2; i1++, i2++) {
				char c1 = s1.charAt(i1);
				char c2 = s2.charAt(i2);
				if (c1 != c2) {
					c1 = Character.toUpperCase(c1);
					c2 = Character.toUpperCase(c2);
					if (c1 != c2) {
						c1 = Character.toLowerCase(c1);
						c2 = Character.toLowerCase(c2);
						if (c1 != c2) {
							return c1 - c2;
						}
					}
				}
			}
			return n1 - n2;
		}
	}

    忽略大小写的同类比较:

public int compareToIgnoreCase(String str) {
		return CASE_INSENSITIVE_ORDER.compare(this, str);
	}

    计算hashcode的方法(至于每位为什么乘以31而不是32,同求解):

public int hashCode() {
		int h = hash;
		if (h == 0) {
			int off = offset;
			char val[] = value;
			int len = count;

			for (int i = 0; i < len; i++) {
				h = 31 * h + val[off++];
			}
			hash = h;
		}
		return h;
	}

    提供的公共方法用于查找目标字符串中的字符串:

static int indexOf(char[] source, int sourceOffset, int sourceCount,
			char[] target, int targetOffset, int targetCount, int fromIndex) {
		if (fromIndex >= sourceCount) {
			return (targetCount == 0 ? sourceCount : -1);
		}
		if (fromIndex < 0) {
			fromIndex = 0;
		}
		if (targetCount == 0) {
			return fromIndex;
		}

		char first = target[targetOffset];
		int max = sourceOffset + (sourceCount - targetCount);

		for (int i = sourceOffset + fromIndex; i <= max; i++) {
			/* Look for first character. */
			if (source[i] != first) {
				while (++i <= max && source[i] != first)
					;
			}

			/* Found first character, now look at the rest of v2 */
			if (i <= max) {
				int j = i + 1;
				int end = j + targetCount - 1;
				for (int k = targetOffset + 1; j < end
						&& source[j] == target[k]; j++, k++)
					;

				if (j == end) {
					/* Found whole string. */
					return i - sourceOffset;
				}
			}
		}
		return -1;
	}

    看看我们最常用的trim是怎么实现的:

public String trim() {
		int len = count;
		int st = 0;
		int off = offset; /* avoid getfield opcode */
		char[] val = value; /* avoid getfield opcode */

		while ((st < len) && (val[off + st] <= ' ')) {
			st++;
		}
		while ((st < len) && (val[off + len - 1] <= ' ')) {
			len--;
		}
		return ((st > 0) || (len < count)) ? substring(st, len) : this;
	}

    笔试要用到的方法:

public char[] toCharArray() {
		char result[] = new char[count];
		getChars(0, count, result, 0);
		return result;
	}

    将其他对象转换为String:

public static String valueOf(Object obj) {
		return (obj == null) ? "null" : obj.toString();
	}

    public native String intern():当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用   equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

    public boolean startsWith(String prefix, int toffset);

    public boolean startsWith(String prefix) ;

    public boolean endsWith(String suffix);

    public int indexOf(int ch);

    public int indexOf(int ch, int fromIndex);//该查找是从fromindex处往前找

    public int lastIndexOf(int ch);

    public int lastIndexOf(int ch, int fromIndex);

    public int indexOf(String str);

    public int indexOf(String str, int fromIndex);

    public int lastIndexOf(String str);

    public String substring(int beginIndex);

    public String substring(int beginIndex, int endIndex);

    public CharSequence subSequence(int beginIndex, int endIndex);

    public String concat(String str);

    public String replace(char oldChar, char newChar);

    public boolean matches(String regex);

    public boolean contains(CharSequence s);

    public String replaceFirst(String regex, String replacement);

    public String replaceAll(String regex, String replacement);

    public String replace(CharSequence target, CharSequence replacement);

    public String[] split(String regex, int limit);

    public String[] split(String regex);

    public static String valueOf(char data[]);

    public static String copyValueOf(char data[], int offset, int count);

    public static String valueOf(boolean b);

    

    有误之处,敬请拍砖!

 

分享到:
评论

相关推荐

    毕业设计-线性规划模型Python代码.rar

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、本项目仅用作交流学习参考,请切勿用于商业用途。

    调用百度云API, 基于python的微博评论情感偏向分析

    DATA: 可供参考的微博评论数据。 详见 /DATA/weibocommennts.csv CODE: apiGetSheet.py 调用百度API 获得 微博评论对应 文字的 情感得分, sheetGetvalue.py 根据情感得分进行标准化,获得实际倾向。

    基于ssm的高速公路收费系统源代码(完整前后端+mysql+说明文档+LW).zip

    管理员 管理员信息管理 负责人管理 员工信息管理 公告信息管理 小型车收费标准设置(元/每公里) 大卡车收费标准设置(元/吨公里) 收费信息统计,统计小车和卡车收费,按月统计 负责人 个人资料修改 公告查看 小车收费统计(某员工某月统计) 大卡车收费统计(某员工某月统计) 员工 个人资料修改 公告查看 小型车收费登记(车牌号,车辆照片,行使公里数,收费金额,收费日期,收费员,按公里数可以自动计算费用 收费金额=收费标准*公里数) 大卡车金额设置(每吨/元)(车牌号,车辆照片,行使公里数,吨,收费金额,收费日期,收费员, 收费金额=收费标准*吨*公里数 ) 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    Zabbix是一款开源的监控工具,用于实时监控IT基础设施,包括网络、服务器和应用程序 它通过触发器和告警机制帮助及时发现并响应问题,同时提供数据可视化和报告功能,以优化性能和确保系统安全

    本套zabbix是基于6.0版本部署,内容涵盖zabbix的简介、zabbix server安装、zabbix基本概念、快速入门、zabbix进阶、zabbix实践、zabbix的高级监控使用。 =======知识领域 网络监控:监控网络设备、服务器和应用程序的运行状态。 系统监控:监控服务器性能,如CPU使用率、内存使用情况、网络流量等。 数据库监控:监控数据库性能和状态。 应用程序监控:监控应用程序的运行情况和性能指标。 云监控:监控云服务和虚拟机的健康状况

    商品库存管理系统课程设计报告.docx

    商品库存管理系统课程设计报告.docx

    嘉兴智能卫浴项目建议书.docx

    嘉兴智能卫浴项目建议书.docx

    Java系统源码+夕阳红公寓管理系统

    Java系统源码+夕阳红公寓管理系统 内容概要: 本资源包含了完整的Java前后端源码及说明文档,适用于想要快速搭建并部署Java Web应用程序的开发者、学习者。 技术栈: 后端:Java生态系统,包含Spring Boot、Shiro、MyBatis等,数据库使用Mysql 前端:Vue、Bootstrap、Jquery等 适用场景示例: 1、毕业生希望快速启动一个新的Java Web应用程序。 2、团队寻找一个稳定的模板来加速产品开发周期。 3、教育机构或个人学习者用于教学目的或自学练习。 4、创业公司需要一个可以立即投入使用的MVP(最小可行产品)。

    基于ssm的新闻发布及管理系统源代码(完整前后端+mysql+说明文档+LW).zip

    (1)用户管理: 用户注册:新用户注册 用户登录:新用户登录 找回密码:忘记密码找回密码 用户评论:发表对新闻的评论 (2)管理员管理: 系统账号管理:管理员管理系统现有账号,进行删除停用等操作 系统公告管理:系统公告的发布和删除 新闻栏目管理:新闻栏目的新增和删除 ...

    Java系统源码+计算机学院校友网

    Java系统源码+计算机学院校友网 内容概要: 本资源包含了完整的Java前后端源码及说明文档,适用于想要快速搭建并部署Java Web应用程序的开发者、学习者。 技术栈: 后端:Java生态系统,包含Spring Boot、Shiro、MyBatis等,数据库使用Mysql 前端:Vue、Bootstrap、Jquery等 适用场景示例: 1、毕业生希望快速启动一个新的Java Web应用程序。 2、团队寻找一个稳定的模板来加速产品开发周期。 3、教育机构或个人学习者用于教学目的或自学练习。 4、创业公司需要一个可以立即投入使用的MVP(最小可行产品)。

    四六级报名管理系统.pdf

    四六级报名管理系统.pdf

    C语言PTA-数组答案代码合集(湖工1-50)

    C语言PTA-数组答案代码合集(湖工1-50)

    <项目代码>YOLOv8 安全背心识别<目标检测>

    YOLOv8 安全背心识别项目代码 项目详细介绍请看链接: https://blog.csdn.net/qq_53332949/article/details/144543625 数据集详细介绍请看:https://blog.csdn.net/qq_53332949/article/details/141503406 数据集下载请看:https://download.csdn.net/download/qq_53332949/89711610?spm=1001.2101.3001.9500 按文件中requirements.txt文件配置环境即可使用。

    后勤智能1. 1. 1. 1. 管理系统-...pdf

    后后勤智能1.。1. 1. 1. 管理系统-...pdf后勤智能1.。1. 1. 管理系统-...pdf后勤智能1.。1. 管理系统-...pdf后勤智能1.。管理系统-...pdf勤智能管理系统-...pdf

    瓶子、塑料袋检测70-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar

    瓶子、塑料袋检测70-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rarset1(拍摄照片)-V15 2023-08-09 3:43 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括133张图像。 汽车以可可格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 应用以下扩展来创建每个源图像的3个版本: * -24和+24度之间的随机旋转

    基于ssm的ssm软件bug管理系统源代码(完整前后端+mysql+说明文档+LW).zip

    管理员 个人密码修改 项目经理管理 员工管理(调试员,解决方案人员) 日志管理(用户登录日志) 系统设置 项目经理 个人信息管理,修改 项目模块管理 按项目分配调试员 调试员 个人信息管理,修改 BUG信息管理(各个环节的跟踪信息录入) 查看解决方案 解决方案人员 个人信息管理,修改 查看缺陷信息 提出解决方案 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    电路电压检测14-YOLO(v5至v9)、COCO、CreateML、Paligemma、VOC数据集合集.rar

    电路电压检测14-YOLO(v5至v9)、COCO、CreateML、Paligemma、VOC数据集合集.rar电路电压-V2释放 ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 它包括132张图像。 电路电压以可可格式注释。 将以下预处理应用于每个图像: 没有应用图像增强技术。

    基于java的物资管理系统项目源码.zip

    项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧!

    基于ssm的家居商城系统的设计与实现+jsp源代码(完整前后端+mysql+说明文档+LW).zip

    系统实现: 用户功能模块:用户点击进入到系统操作界面,可以对主页、个人中心、我的收藏管理、订单管理等功能模块,我的收藏管理:通过列表可以获取用户ID、收藏ID、表名、收藏名称、收藏图片信息并进行修改操作 管理员功能模块:管理员通过用户名和密码填写完成后进行登录。管理员登录成功后进入到系统操作界面,可以对主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等功能模块进行相对应操作。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    Python项目-实例-08 抖音表白.zip

    Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

    绝对给力的源码,在线音乐播放器完整项目.zip

    Android 毕业设计,Android 毕业设计,小Android 程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

Global site tag (gtag.js) - Google Analytics