最近在求职,陆陆续续会有很多面试,现在凭想象力记下来,总结自己面试中回答不太好的地方:
18/08/13 周一 上午 ,云途
1.如何将给定的字符串内容反转?即倒序
该问题,当时回答不是很好,回来后自己敲了下,发现自己不足.以下列出四种解决方案:
方案一:for循环遍历, 根据索引从后向前取字符串中的字符:
public String reverse2(String value){ if (value == null || value.length() < 2){ return value; } String newValue = ""; for (int i = (value.length() - 1); i >= 0; i--) { newValue += value.charAt(i); } return newValue; }
方案二:将字符串转为char数组,然后倒叙取出每个字符,跟方案一类似:
public String reverse3(String value){ if (value == null || value.length() < 2){ return value; } String newValue = ""; char[] charArray = value.toCharArray(); for (int i = (charArray.length- 1); i >= 0; i--) { newValue += charArray[i]; } return newValue; }
方案三:先将字符串转为StringBuilder 或者StringBuffer ,再利用二者的实例方法reverse,实现倒叙后 转为toString() ,这种方式最方便,不需要自己写方法
public String reverse3(String value){ if (value == null || value.length() < 2){ return value; } return new StringBuffer(value).reverse().toString(); }
方案四:利用递归,将传入的字符串首个字符拼到末尾,同时截取字符串,依次递归,直到字符串长度为1
public String reverse(String value){ if (value == null || value.length() < 2){ return value; } return reverse(value.substring(1)) + value.charAt(0); }
2.现有两个ArrayList,需要将两个集合元素全部添加到一个集合中, 并且去除重复的元素,如何实现?
思路:首先得到1个总的ArrayList,然后将ArrayList转为HashSet,利用HashSet的特性(元素不可重复)完成去重;
@org.junit.Test public void name() { List<Integer> list1 = new ArrayList<>(); List<Integer> list2 = new ArrayList<>(); list1.add(1); list1.add(2); list1.add(3); list2.add(2); list2.add(3); list2.add(4); list1.addAll(list2); System.out.println(list1); //将List转为Set HashSet<Integer> set = new HashSet<>(list1); System.out.println(set); //也可以通过同样的方式将Set转为List System.out.println(new ArrayList<>(set)); }
原理是构造器可以接收Collection类型的对象:
3.如何得到字符串去重后的长度? 例如:hello 去重后 是 helo ,长度也就是4;
@org.junit.Test public void myTest() { String str = "Hello"; Set<Object> hashSet = new HashSet<>(); for (int i = 0; i < str.length(); i++) { hashSet.add(str.charAt(i)); } System.out.println(hashSet.size()); }
也可以通过ArrayList完成,但是需要加一个contains的判断:
@org.junit.Test public void myTest2() { String str = "Hello"; List<Object> list = new ArrayList<>(); for (int i = 0; i < str.length(); i++) { if (!list.contains(str.charAt(i))){ list.add(str.charAt(i)); } } System.out.println(list.size()); }
4.上个问题中 ,contains(object)方法,判断list中是否已经存在某个元素,contains方法判断是否为同一个元素的原理是什么?
答: ArrayList中有一个方法: indexOf(object) 如果object存在与list中,则返回大于相应的索引,否则返回-1
如果indexOf()返回的值大于-1,则表示已存在,某则不存在;
下面是contains方法与indexOf方法的源代码:
public boolean contains(Object o) { return indexOf(o) >= 0; }
public int indexOf(Object o) { if (o == null) { for (int i = 0; i < size; i++) if (elementData[i]==null) return i; } else { for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } return -1; }