算法考试–各数据结构常用 方法总结
一、各种数据结构中很多方法是静态方法
静态方法和实例方法的调用:实例方法(普通成员方法),需要先new一个对象,再用 对象名.方法名() 的格式调用。 在外部调用静态方法,可以用 类名.方法名() 的形式,也可以用对象名.方法名().
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
调用本类内部的静态方法也是 类名.方法名(),或者 方法名() ,调用内部的静态方法,加不加类名都行。
二、场景
场景1
反转字符串: StringBuffer和StringBuilder中有reverse()方法,String没有.
String s = "abc"
1)String s1 = new StringBuffer(s).reverse().toString(); // 第一种,利用 reverse() 方法
2) String reverse = ""; // 空串
for(int i = 0; i < s.length(); i++)
reverse = s.charAt(i) + reverse;
return reverse;
排序数组:Arrays.Sort(chars) 从小到大
场景2
三、各个数据结构的方法
1、字符串String
String s1 = "abcdefg",s2 = "ABC";
boolean flag = s1.equals(s2); // 比较字符串内容是否相同,“==”比较的是两个字符串的引用是否相同。
boolean flag = s1.equalsIngoreCase(s2); // 不区分大小写,比较字符串内容是否相同。
int i = s1.compareTo(s2); // 比较两个字符串大小关系(字典序)。返回整形,相等返回0,小于返回负数,大于返回正数。
char[] chars = s1.toCharArray(); // 字符串转变成数组;
String s = Arrays.toString(chars); // 数组转换为字符串;
boolean flag = s1.contains("abcdefg"); //字符串是否包含后面的字符串,
int i = s1.indexOf("def"); // 字符串中第一个索引
int i = s1.lastIndexOf("def"); // 字符串中最后一个索引
boolean flag = s1.startsWith("abc"); // 字符串是否以某字符串开头
boolean flag = s1.endsWith("fg"); // 字符串是否以某字符串结尾
String s2 = s1.replace("ab","hhh"); //把字符串中的所有ab替换为hhh
String s2 = s1.replaceFirst("ab","xxx" ); //把字符串中第一个ab替换为xxx
String str = "username=zhangsan&password=123";
String[] strs = str.split("&" | "="); //字符串分隔为字符串数组,多个分隔符,可以用"|"作为连字符
String s = str.substring(8); //截取字符串索引8后的字符
String s = str.substring(8,10); //截取索引8到10之间的字符 [8,10)
String str1 = str.trim(); // 去掉字符串中的左右空格,保留中间空格
String STR = str.toUpperCase(); // 转换为大写
String str = str.toLowerCase(); // 转换为小写
String str2 = str.concat(str1); // 连接字符串 等同于“+”
String str2 = str + "abc";
int l = str.length(); // 取字符串长度
boolean flag = str.isEmpty(); // 字符串是否为空字符串“”,即长度是否为零,但不是判断是否为null
2、StringBuffer与StringBuilder
StringBuffer StringBuilder
StringBuffer 是线程安全的,多线程的时候使用. StringBuilder 是线程不安全的单线程的时候使用.
String str = "abcdef";
StringBuilder sb = new StringBuilder(str); // string转换为StringBuilder
String s = sb.toString(); // StringBuilder 转换为string
StringBuffer sb = new StringBuffer("birds");
sb.append("abcdefgh"); // 在字符串末尾添加元素
sb.delete(0.2); // 删除0和1两个下标的元素
sb.deleteCharAt(2) // 删除下标为2的字符
sb.replace(1,3,"0") // 把下标1和2的字符替换为"0"
sb.setCharAt(2,"0") // 把下标为2的字符替换为0
sb.insert(2,"我是新插入的字符串") // 在下标2的位置,插入字符串
sb.reverse().toString() //反转,把sb反转然后转换为字符串。
sb.substring(0,2) //截取字符串
StringBuilder 方法和StringBuffer差不多
insert append length() setCharAt toString reverse delete replace subString .....
3、数组 Arrays int[]
String[] s1 = new String[5]; //声明新数组, 长度为5
String[] s1 = {"a","b","c","d"} // 声明新数组并赋值
排序数组:Arrays.Sort(chars) // 从小到大
int[] a2 = a1.reverse(); // 反转数组顺序, 但是不排序
boolean flag = array1.equals(array2); //判断两个数组是否相等,这个感觉很强
String s = array1.toString(); //数组转换成字符串
for(int i : array1); //遍历数组
int i = array1.binarySearch(6); //在数组array1中查找 数字6 并返回下标; 没有就返回负数.从-1开始,可用来判断是否包含某个元素
boolean flag = Arrays.asList(array1).contains("a") //判断数组是否包含某个元素, 把数组转换为链表再用contains方法
List<String> list = Arrays.asList(array1); //数组转换为链表
int[] array2 = array1.clone(); //完全复制数组
int[] array2 = Arrays.copyOf(array1,6); //复制数组array1到新数组array2中并且新数组长度为6. 如果新数组长度小, 那只复制前面的部分
int[] array2 = Arrays.arraycopy(原数组, 原数组起始位置, 目标数组, 目标数组起始位置, 复制的元素长度); //复杂的数组复制
> Collection接口 分为List接口(ArrayList Linklist Vector) Set接口(HashSet
> TreeSet) 常用方法: 增: add addAll 删:chear remove 查:contains equals
> isEmpty size 遍历:for(int i : 目标) 链表 list是接口 ArrayList LinkedList 这两个是实现.
4、ArrayList 和数组很像. 链表 list是接口 ArrayList LinkedList 这两个是实现.
List<String> list = new ArrayList<String> ();
list.add("Jack"); //在链表末尾添加元素
list.add(0,"Tom"); //在指定索引处添加元素
list.addAll(list2); //在当前链表中添加另一个链表的元素
list.clear(); //清空集合中的全部元素
list.remove(2); //删除集合中指定下标的元素
list.remove("Tom"); //删除集合中某个元素, 只删除第一个
list.set(2,"Marry"); //用指定元素替代制定下标处的元素
boolean flag = list.contains("Tom"); //判断集合中是否包含某个元素
boolean flag = list.isEmpty(); //判断元素是否为空
list.get(2); //返回指定下标处的元素
list.size(); //查询集合中元素的个数
list.indexOf("Tom"); //元素在集合中第一次出现的位置
list.toArray(); //把链表转换为数组
5、LinkedList
List list = new LinkedList<String>();
list.add("Tom"); //在链表最后添加元素
list.addFirst("Tom"); //在链表头部添加元素
list.add(2,"Marry"); //在指定位置插入元素
list.remove(); //删除链表中的第一个元素
list.remove("Tom"); //删除链表中的指定元素
list.remove(2); //删除下标为2的元素
list.get(2); //获取索引2的元素
6、Hashset 集合 Set是接口 实现HashSet TreeSet HashSet中不能保存重复的数据
HashSet
Set<String> set = new HashSet<String> ();
set.add("Jack"); //向集合中添加元素
set.addAll(set1); //向集合中添加另一个集合的所有元素
set.remove("Jack"); //从集合中删除元素
set.removeAll(); // 清空集合
boolean flag = set.contains("Jack"); //判断集合是否包含某元素
boolean flag = set.isEmpty(); //判断set是否为空
set.size(); //集合中元素的个数
set.toArray(); //集合转变为数组
TreeSet 方法和HashSet基本一致. 是有序的.用的很少
7、键值对集合Map<K,V> 每个键只能对应一个值 而且键不能重复, 一般供HashMap就行
Map<String,String> map = new HashMap<String,String>(); //创建Map集合
map.put("语文","及格");
map.put("数学","优秀"); //添加键值对,如果键重复会覆盖
map.remove("语文"); //根据键删除键值对, 会返回被删除的键对应的值,如果没有键,就返回null。返回的值一般不要。
map.clear(); //清空所有键值对元素
int size = map.size(); //集合中键值对的数量
Map集合获取方法
String s = map.get("语文"); //根据键获取值,s为"及格"
Set<String> keySet = map.keySet(); //获取所有键的集合
Collection<String> values = map.values(); // 获取所有值的集合,注意这里是Collection
boolean flag = map.containsKey("语文"); //判断键里是否包含某个值
boolean flag = map.containsValues("及格"); //判断值里是否包含某个值
boolean flag = map.isEmpty(); //判断集合是否为空
8、栈 先进后出
Stack<Integer> stack = new Stack<>();
stack.push(); // 在栈顶入栈
stack.pop(); // 获取栈顶元素并删除
stack.peek(); // 获取栈顶元素不删除
stack.isEmpty(); // 判断是否为空
stack.search("Tom") // 判断栈中时候含有某个元素