Day013 String的一些
常见的算法、
排序算法
-
冒泡排序
-
选择排序
-
每一次从这堆参数比较的数据当中找出最小值,拿着这个最小值和最前面的元素交换位置。
选择排序比冒泡排序好在:每一次交换数据都是有意义的。
关键点:选择排序的关键在于,怎么找出一堆数据中最小的。
查找算法
二分法查找
-
一个一个挨着找,直到找到为止;
-
二分法查找(算法) 效率比较高;
将查找封装成一个方法:
传什么:第一个参数是数组,第二个参数是被查找的元素
返回值:返回被查找的这个元素的下标。
拿着中间的元素和目标要查找的元素进行对比
-
二分法查找算法是基于排序的基础之上的。
-
二分法查找效率要高于一个一个挨着查找
-
原理:
public class ArrayUtill{
}
介绍一下java。util。Arrays
import java.util.Arrays; //导包
sout
以上的算法在以后的java开发中,不需要使用
java中已经封装好了,直接调用就行
工具类大部分方法都是静态的
使用sun公司提供的数组工具类:java。util。Arrays;
int[] arr = {12122,124,324,3,23,543};
Arrays.sout(arr);
// 遍历输出
for (int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
Arrays 是一个工具类
其中有一个 sort()方法,可以排序,静态方法,直接使用类名调用就行
常用类
string类
java.lang.String
-
String表示字符串类型,属于引用数据类型,不属于基本数据类型
-
java中随便使用双引号括起来的都是String对象。例如:“abc”,“def”
-
java中规定双引号括起来的字符串,是不可变得,也就是“abc”自出生到最终死亡,不可变,不能变成“abcd”
-
在jdk中双引号括起来的字符串都是直接存储在方法区的字符串常量池中
为什么sun公司把字符串存储在一个字符串常量池中,因为字符串在实际的开发中使用太频繁,为了执行效率,所以把字符串放到了方法区的字符串常量池中
String s1 = “abc”;
s1里面保存的不是abc字符串
s1里面保存的是“abc”字符串的内存地址
String相关面试题
String s1 =“hello”;
String s2 = “hello”;
System.out.println(S1==S2);
// 双等号比较的是保存的内存地址
// true
String x = new String ("xyz");
String y = new String ("xyz");
System.out.println(x==y);
//false
//通过这个案例的学习,我们知道了,字符串之间的比较不能使用“==”
//“==” 不保险,应该调用String类的equals方法
System.out.println(x.equals(y));//true
String类已经重写了Equals方法,以下的equals方法是调用的String重写之后的equals方法
建议:System.out.println(“dfasdfahsoi”.equals(k));
可以避免空指针异常
System。out。println(k。equals(“asdfa”));
存在空指针异常的风险、不建议这样写
垃圾回收池是不会释放常量的
int i =100; i变量中保存的是100这个值
String s = “avsad”; s变量中保存的是字符串对象的内存地址 0x11111
面试题
-
输出字符串的话,不会输出字符串内存地址
-
String类中已经重写了ToString方法
String s2 = new String (shuzu,1,2);
//1位起始位置,2为传的个数
//将shuzu中的一部分转换成字符串
String 的构造方法
String类中的常用方法
-
char c = “sdfasdf”.charAt(int index)
char c = "中国人".charAt(1); //国 -
-
int result = "abc".compareTo("abc");
//0
前后一致,为0
前小后大,为-1
前大后小,为1;
-
判断相等不相等 还判断谁大谁小
-
("dsgfdagdfdsds").contains("sdfasd") -
前面一个是否包含后面//true false
-
"sdfasd.txt".endsWith(".txt"); //true -
判断当前字符串是否以某个字符串结尾
-
“abc”.equals("abc");判断相等不相等
-
equalsIgnoreCase() -
忽略大小写
-
.getBytes()将字符串对象转化成字节数据
-
indexOf(String str) -
判断某个字符串在当前字符串第一次出现索引(下标)
-
.isEmpty();判断是否为空字符串
-
.length();判断字符串长度
判断数组长度是length属性,判断字符串长度是length()方法
-
.lastIndexOf(String str);判断某个字符串在当前字符串中最后一次出现 的索引(下标)
-
replace -
替换 支持多个一起替换 替换所有符合
-
split(“-”)//以“-”为分隔符进行拆分拆分字符串
-
startsWith("sdfa")判断字符串是否以“sdfa”开始
-
substring(7)
(开始)
substring(7,10)
(起始位置,结束位置) -
截取
-
toCharArry()一个一个遍历
-
toLowerCase()全部转换为小写
-
toUpperCase();转换为大写
-
trim()去除字符串中的前后空白
-
String中只有一个方法是静态的,不需要new对象
String s1 =String.valueOf(1000);方法叫做valueOf
作用:将“非字符串”转换成字符串
如果valueOf(一个对象)
会调用该对象的toString()方法
-
本质上System。out,println()这个方法在输出任何数据的时候都是先转换成字符串再输出。
java中的字符串是不可变得,每次拼接都会产生新字符串
这样会占用大量的方法区内存,造成内存空间浪费
StringBuffer.append("adfa");
\append 是追加的意思
如果数组满了,会自动扩容
如果以后需要进行大量的字符串拼接操作,建议使用jdk中自带的:
java.lang.StringBuffer
java.lang.StringBuilder
-
如何优化Stringbuffer性能
创建StringBuffer的时候尽可能给定一个初始化容量
最好减少底层数组的扩容次数,预估计一下,给一个大一些的初始化容量
关键点,给定一个合适的初始化容量
java.lang.Stringbuilder
StringBuffer 和 StringBuilder区别:
StringBuffer在多线程运行环境下是安全的
Stringbuilder在多线程环境下运行是不安全的
浙公网安备 33010602011771号