@TOC
目录
博主介绍
::: hljs-center
个人主页:苏州凯捷智能科技有限公司
作者介绍:苏州凯捷智能科技有限公司创始人,主要目前与华为合作5G工业机器人领域开发,2D、3D视觉项目开发,政府项目投标开发。
有任何问题欢迎私信,看到会及时回复
微信公众号:苏州程序大白
想加入技术交流群的可以加我好友,群里会分享学习资料
:::
前言
String、StringBuffer与StringBuilder的区别
1.1、String类
-
分析源码可知,
String对象
的内容是存储在一个char数组中,且这个数组使用final修饰,这也是String对象不可变的原因。当进行字符串拼接时,虚拟机会新建一个字符串对象,然后将新的字符串对象赋值给原来的引用,而不是真的修改了原来字符串对象的值。 - 字符串重写了
Object父类
的equals
方法。
1.2、StringBuffer类和StringBuilder类
这两个类均继承于AbstractStringBuilder类
,但分析源码可知StringBuffer
的方法都添加了synchronized
关键词进行修饰,所以StringBuffer
是线程安全的,而没有使用synchronized
修饰方法的StringBuilder
是线程不安全的,但StringBuilder
的速度要远远高于StringBuffer
,所以在能保证线程安全的情况下,StringBuilder
的优先级要高于StringBuffer
。
1.3、总结
-
String
是一个final修饰
的类,所有的属性也是final
的,所以String
具有不可变性,也就是对字符串的操作,如拼接、剪切都会产生新的String
对象。 -
StringBuffer
本质是一个线程安全的可修改字符串序列。因为保证线程安全,所以会带来额外的性能消耗。 -
StringBuilder
本质上和StringBuffer
没有区别,但是StringBuilder
去掉了线程安全部分提高了操作效率,是绝大部分情况下字符串拼接的首选。 - 如果确定拼接字符串会发生多次,并且长度可预计,那么可以在开始的时候指定合适的大小,避免数组扩容造成的开销。
找出字符串中出现最多次的字符和出现的次数
<font color=#03a9f4 size=5 face= "楷体">遍历字符串,并使用一个HashMap来存储出现字符及出现的次数,以字符为key,次数为value。解题思路如下:<font>
-
假定字符串中出现最多的字符
maxCode
为当前字符串的第一个元素,出现次数maxCount
初始化为0。 -
遍历字符串,判断当前字符是否在
hashmap
的key
中,如果包含,令次数+1,否则将该字符为key,1为value
放入hashmap
中。 - 判断
maxCount
和当前字符出现次数的关系,如果maxCount
小于当前字符出现次数,就令maxCode = 当前字符
,然后更新maxCode
,最后返回maxCode
和maxCount
即可。
实现代码如下:
/***
* 找出字符串中出现最多次的字符和出现的次数
* @param str 目标字符串
* @return 以maxCode为键、maxCount为值的map
*/
public static Map<Character, Integer> findMostCodeAndCount(String str) {
char maxCode = str.charAt(0);
int maxCount = 0;
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < str.length(); i++) {
Character currentCode = str.charAt(i);
Integer count = map.get(currentCode);
if(count == null) {
count = 1;
} else {
count++;
}
map.put(currentCode, count);
if(maxCount < count) {
maxCode = currentCode;
maxCount = count;
}
}
Map<Character, Integer> result = new HashMap<>();
result.put(maxCode,maxCount);
return result;
}
测试代码:
String str = "abcacba";
Map result = findMostCodeAndCount(str);
System.out.println(result);
结果:
找出字符串中第一次重复出现的字符
使用一个HashSet
来解决问题,由于Set有不允许元素重复的性质,Set的add方法在添加重复值是会返回false,所以我们可以用这个性质来判断元素是否重复。
实现代码如下:
/***
* 找出字符串中第一次重复出现的字符
* @param str 目标字符串
* @return 返回第一次重复的字符
*/
public static Character getFirstRepeat(String str) {
Set<Character> set = new HashSet<>();
Character result = null;
for (int i = 0; i < str.length(); i++) {
Character currentCode = str.charAt(i);
if(!set.add(currentCode)) {
result = currentCode;
break;
}
}
return result;
}
测试代码:
String str = "abcacba";
Character result = getFirstRepeat(str);
System.out.println(result);
结果:
两个大数之和
题目描述:现在有两个数,位数均超过1000位,例如:
String a = “123343432…”
String b = “3974928374928…”
这两个大数无法转换为Integer计算,所以我们使用两个数组来存储这两个数,然后进行计算。
解题思路如下:
-
设这两个数中大的数的位数位m,则结果的最大位数位m+1。
- 用一个int数组来存储结果。
实现代码如下:
/***
* 编程两个大数之和
* @param num1
* @param num2
* @return
*/
public static String sumOfBigNum(String num1,String num2) {
char[] largeArray = null;
char[] smallArray = null;
if(num1.length() >= num2.length()) {
largeArray = num1.toCharArray();
smallArray = num2.toCharArray();
} else {
largeArray = num2.toCharArray();
smallArray = num1.toCharArray();
}
int[] res = new int[largeArray.length + 1];
for (int i = 0; i < largeArray.length; i++) {
res[i] = largeArray[largeArray.length - i - 1] - '0';
}
for (int i = 0; i < smallArray.length; i++) {
res[i] += smallArray[smallArray.length - i - 1] - '0';
}
for (int i = 0; i < res.length - 1; i++) {
if(res[i] > 9) {
res[i + 1] += res[i] / 10;
res[i] %= 10;
}
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = res.length - 1; i >= 0; i--) {
stringBuilder.append(res[i]);
}
String result = stringBuilder.toString();
if(result.startsWith("0")) {
result = result.substring(1);
}
return result;
}
测试代码:
String num1 = "12345";
String num2 = "56756";
Integer n1 = Integer.valueOf(num1);
Integer n2 = Integer.valueOf(num2);
Integer sum = n1 + n2;
System.out.println("计算机计算结果为:" + sum);
System.out.println("函数计算结果位:" + sumOfBigNum(num1,num2));
结果: