1.找到一个字符串里面第一个唯一值且区分大小写,并返回其位置;
public static int FirstNotRepeatingChar(String str) {
//LinkedHashMap按照存入的顺序取出,保证顺序
Map<String,Integer> map = new LinkedHashMap();
//将字符串转成字符数组进行 遍历
char[] arr = str.toCharArray();
for(int i=0;i<arr.length;i++){
if(map.containsKey(String.valueOf(arr[i]))){
map.remove(String.valueOf(arr[i]));
}else{
map.put(String.valueOf(arr[i]),i);
}

    }
    //第一个唯一值的索引值
    int index = 0;
    for (Map.Entry<String, Integer> entry : map.entrySet()) {
         System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
         index = entry.getValue();
         break;
    }
     return index;
}

2.
小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?
图片说明

对于这道题,我用了大半天,只是根据操作字符串做出了示例中的解压缩,但是只针对包含一个[1],再多我就实在是想不出到底该怎么操作字符串了,网上找到的一个利用正则表达式的方法解决这个问题,特别的简单清晰。

public static void getZip(){
//正则表达式 找出所有的 [|]
String pattern ="\[(\d+)|(\w+)\]";
Pattern pc = Pattern.compile(pattern);
String line = "HG[3|B[2|CA]]F[3|B[2|SA]]";
Matcher m = pc.matcher(line);

      while(m.find()){//如果有 [\]这种类型的字符,遍历获取
          System.out.println("开始:"+m.group(0));//[2|CA] 第一个这种表达式
          int num = Integer.valueOf(m.group(1)); //2
          String chs = "";
          for(int i=0;i<num;i++){
              chs += m.group(2);//CA
          }
          //这个是表示用输入的字符串替换第一个 [|] 表达式 
          line = m.replaceFirst(chs);
          //然后将这个新的字符串继续执行
          //只要有符合的要求他就会继续执行 会一直执行,一直替换,知道全部替换完成为止
          m = pc.matcher(line);
      }

}

自己想到的不正确的例子:只能找到含有一个 [|]的例子
// 2|AC [3|B[2|AC]]
public static void getStr(String str,StringBuilder sb){
int index2 = str.indexOf("|");
int num = Integer.valueOf(str.substring(0,index2)); //B
String msg = str.substring(index2+1);

    if(msg.contains("[")){
        int index =  msg.indexOf("[");
        String ss1 = msg.substring(0,index);  //B
        String conStr=msg.substring(index+1); //2|AC]
        for(int i3=0;i3<num;i3++){
            sb.append(ss1);
            //BAC
            getStr(conStr,sb);
        }

    }else{//如果真的是2|AC
        for(int i3=0;i3<num;i3++){
            if(msg.contains("]")){
                int index = msg.indexOf("]");
                msg =msg.substring(0,index);
            }
            sb.append(msg);
       }
    }

}

//HG[3|B[2|CA]]F
public  static String getZip(String str){

   StringBuilder sb = new StringBuilder();
   if(str.contains("[")){
       int index = str.indexOf("[");
       String s1 = str.substring(0,index);
       sb.append(s1);
       String msg = str.substring(index+1);
       getStr(msg,sb);

       int index2 = str.lastIndexOf("]");
       String end = str.substring(index2+1);
       sb.append(end);
   }
   System.out.println(sb.toString());
   return  sb.toString();
}

链接:https://www.nowcoder.com/questionTerminal/c27561e5b7e0441493adb9a54071888d?orderByHotValue=1&page=1&onlyReference=false
来源:牛客网

3.java中的参数传递
java中只有值传递,没有引用传递;
自我理解:值传递就是创建一个副本,所以对于基本数据类型,在方法里面改变副本的值,并不会影响到原来的数据;而引用类型的值传递,传递的是引用地址的副本,但是两者相同,指向同一个对象,所以改变对象的值,原对象就是会发生改变;此时如果将副本的地址换成新的对象地址,就不会影响原来的对象了;而引用传递应该就是真实数据或对象的传递,对真实对象进行操作,肯定会改变真实对象的值。

4.为什么重写equals还要重写hashcode?
object里面hashcode计算出来的是本地的方法,返回的是对象的内存地址;equal()方法比较的就是内存地址;而如果对象重写了这两个方法之中的一个,就会造成hashcode()内存地址不同,但是equals()结果相同这种结果显然不正确;而且重写的时候还要注意重写的属性都要对应相同才可以;