1、给定一个长度为字符串, 需要去除所有之前曾经出现过的字符,只保留第一次出现的字符
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串
*/
public String unique_string (String s) {
HashSet<Character> set = new HashSet<>();
//字符串转为字符数组
char[] ch = s.toCharArray();
StringBuilder sb = new StringBuilder();
for (char c : ch) {
// set.add(c) 本身就返回 true/false,不需要再用contains确认了
if (set.add(c);) {
sb.append(c);
}
}
return sb.toString();
}
}
2、看以下代码回答问题
①
public static void main(String[] args)
{
String s = new String("abc");
// 在这中间可以添加N⾏代码,但必须保证s引⽤的指向不变,最终将输出变成abcd System.out.println(s);
}
答案
public static void main(String[] args) {
String s = new String("abc");
Field value = s.getClass().getDeclaredField("value");
value.setAccessible(true);
value.set(s, "abcd".toCharArray());
System.out.println(s);
}
解析:要让s的输出为abcd就不能借助StringBuilder和StringBuffer的append方法,因为这样的话最后s还是abc,而StringBuilder和StringBuffer对象的值才是abcd。也不能使用s.replace(“abc”,“abcd”)方法,因为replace底层是借助于新建一个StringBuffer对象,然后返回StringBuffer对象。
②
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
// i1 == i2? true
Integer i3 = 128;
Integer i4 = 128;
// i3 == i4? false
}
答案: i1 == i2为true i3 == i4为false
在Interger类中,存在⼀个静态内部类IntegerCache, 该类中存在⼀个Integer cache[], 并且存在⼀ 个static块,会在加载类的时候执⾏,会将-128⾄127这些数字提前⽣成Integer对象,并缓存在cache数 组中,当我们在定义Integer数字时,会调⽤Integer的valueOf⽅法,valueOf⽅法会判断所定义的数字 是否在-128⾄127之间,如果存在则直接从cache数组中获取Integer对象,如果超过,则⽣成⼀个新的 Integer对象。