上午
1. 位运算
左移,右移
补符号位
一个负数,换为一个绝对值相同的正数 ,用>>>
public class index{
public static void main(String[] args){
int x = 55;
int y = -177;
System.out.println(Integer.toBinaryString(x));
System.out.println(Integer.toBinaryString(y));
x = x << 4;
y = y >>> 3;
System.out.println(Integer.toBinaryString(x));
System.out.println(Integer.toBinaryString(y));
}
}
// 110111
// 11111111111111111111111101001111
// 1101110000
// 11111111111111111111111101001
char类型在java中,根据编码不同,位数也不一样
2. 字符串截取
str.substring(a,b); // `[a,b)
字符串能够跟字符串相加,也可以跟基本类型相加
编译器可以让字符串共享
java字符串变得更长,不在本地修改;变得更短会进行内存回收
但是C语言不能实现,会被利用这一特点进行溢出攻击。
基本类型比较值,引用类型,比较引用的地址是否相同
public class index{
public static void main(String[] args){
String x1 = "aaa";
String x2 = "aaa";
String x3 = new String("aaa");
System.out.println(x1 == x2);
System.out.println(x2 == x3);
}
}
// true
// false
对于指向同一个地址的字符串,也可大胆更改,因为是不可变字符串。
new 重新开辟空间
使用equals()来比较字符串数值。(区分大小写)
String x3 = new String(“aaa”);
String x6 = x3; // 指向一样
null只有地址,空串有指向
API接口类似文档
charAt(index)获取索引值
codePointAt(index)获取索引值的ASOLL码
流的底层是数组(stream,buffer)
一些小方法
char charAt (int index)
返回给定位置的代码单元。除非对底层的代码单元感兴趣, 否则不需要调用这个
方法。
• int codePointAt(int Index)
返回从给定位置开始的码点。
• int offsetByCodePoints(int startlndex, int cpCount)
返回从 startlndex 代码点开始,位移 cpCount 后的码点索引。
• i n t compareTo(String other)
按照字典顺序,如果字符串位于 other 之前, 返回一个负数;如果字符串位于 other 之
后,返回一个正数;如果两个字符串相等,返回 0。
• IntStream codePoints()
将这个字符串的码点作为一个流返回。调用 toArray 将它们放在一个数组中。
• new String(int[] codePoints, int offset, int count)
用数组中从 offset 开始的 count 个码点构造一个字符串。
• boolean equals(0bject other)
如果字符串与 other 相等, 返回 true。
• boolean equalsIgnoreCase(String other )
如果字符串与 other 相等 ( 忽略大小写,) 返回 tme。
• boolean startsWith(String prefix )
• boolean endsWith(String suffix )
如果字符串以 suffix 开头或结尾, 则返回 true。
• int indexOf(String str)
• int indexOf(String str, int fromlndex )
• int indexOf(int cp)
• int indexOf(int cp, int fromlndex )
返回与字符串 str 或代码点 cp 匹配的第一个子串的开始位置。这个位置从索引 0 或
fromlndex 开始计算。 如果在原始串中不存在 str 返回 -1。
• int 1astIndexOf(String str)
• Int 1astIndexOf(String str, int fromlndex )
• int lastindexOf(int cp)
• int 1astindexOf(int cp, int fromlndex )
返回与字符串 str 或代码点 cp 匹配的最后一个子串的开始位置。 这个位置从原始串尾
端或 fromlndex 开始计算。
• int 1ength( )
返回字符串的长度。
•int codePointCount(int startlndex , int endlndex ) 5.0
返回 startlndex 和 endludex-l之间的代码点数量。没有配成对的代用字符将计入代码点。
參 String replace( CharSequence oldString,CharSequence newString)
返回一个新字符串。这个字符串用 newString 代替原始字符串中所有的 oldString。可
以用 String 或 StringBuilder 对象作为 CharSequence 参数。
String substring(int beginlndex )
參 String substring(int beginlndex, int endlndex )
返回一个新字符串。这个字符串包含原始字符串中从 beginlndex 到串尾或 endlndex-l
的所有代码单元。
String toLowerCase( )、String toUpperCase( )
返回一个新字符串。 这个字符串将原始字符串中的大写字母改为小写,或者将原始字
符串中的所有小写字母改成了大写字母。
String trim( )
返回一个新字符串。这个字符串将删除了原始字符串头部和尾部的空格。
String join(CharSequence delimiter, CharSequence … elements ) 8
返回一个新字符串, 用给定的定界符连接所有元素。
char k1 = w.charAt(6);
String[] arr = w.split("h");
String[] arr2 = w.split("uh");
System.out.println(Arrays.toString(arr) + "###" + Arrays.toString(arr2));
3. 字符串与StringBuilder
public class index{
public static void main(String[] args){
long start = System.currentTimeMillis();
String w = "";
for(int i = 0;i < 100000; i++){
w += "a";
}
long end = System.currentTimeMillis();
long time = start - end;
System.out.println(time);
long start2 = System.currentTimeMillis();
StringBuilder w2 = new StringBuilder();
for(int i = 0;i < 100000; i++){
w2.append("a");
}
long end2 = System.currentTimeMillis();
long time2 = start2 - end2;
System.out.println(time2);
}
}
不同的数据不同的地址,读取地址
String的拼接,10000次地址指令,记录的地址也非常多
String : 8GB = 2^33B 2^33个数据 2^33地址需要存储
StringBuilder:读取快,消耗地址小,内存页4KB对外只有一个地址,相当于一个变量
short类型分配4kB,实际上只占2B
任何开销实际分配4KB起步
申请足够大的空间,支持分配