位运算符 位运算速度快
- 或 | (or)
or运算通常用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。
相同位只要一个为1即为1。
public class Test5{
public static void main(String[] aaa){
int a = 9; //1001
int b = 23; //10111
int c = a | b;
System.out.println(c);
}
}
- 且&(and)
and运算通常用于二进制的取位操作,例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。
相同位的两个数字都为1,则为1;若有一个不为1,则为0。
public class Test5{
public static void main(String[] aaa){
int a = 9; //1001
int b = 23; //10111
int c = a & b;
System.out.println(c);
}
}
- 异或 ^ (xor)
异或的符号是^。按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0.
xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥。1314520 xor 19880516 = 20665500,我就把20665500告诉MM。MM再次计算20665500 xor 19880516的值,得到1314520。
相同位不同则为1,相同则为0。
- 非 ~ (not)
- >> 向右移动 N进制向右移动M位 变为原来的N^M 倍 除以 左侧补符号位
- <<向左移动 N进制向左移动M位 变为原来的N^M 倍 乘以 右侧补0
内部计算原理都用位运算拆分 2进制里面有多少个1 就可以拆成多少个数
即使达到万亿级别也可以拆成40个数方便计算
计算结果超范围会报错 计算时要在范围内
字符串
public class Test5{
public static void main(String[] aaa){
String a ="大家好,杨欣悦是我老婆.";
String f = "宋宇30岁的时候有100万存款,RS7一辆";
String b = f.substring(5,10);
System.out.println(b);
}
}
数组提前在内存中申请足够大的空间 一定要连续
目的:防止越界
字符串值不能再原有地址进行修改 需要在内存中重新申请地址
原有地址可能放不下
常量池
当字符串引入新的变量时 原来的字符不会立即被销毁 当有下一个字符串需要引用时会扫描常量池中有没有要引用的字符 有的话直接引用 没有则再创建
常量池会自己定期检查长时间没有被引用的字符然后销毁
检查字符串是否相等
String a = "he";
String b = new String("he");
System.out.println(a==b); // false == 引用类型检查内存地址 基本类型比较的值
System.out.println(a.equals(b)); // true
空串"" 和null串
null和 "" 不一样 null只有句柄没有值 没有地址 "" 是一个空地址 有特殊符号
码点和代码单元
public class Test5{
public satic void main(String[] aaa){
char a = '杨';
int b = a;
System.out.println(b);
}
}
码点( code point) 是指与一个编码表中的某个字符对应的代码值。
在基本的多语言级别中,每个字符用 16 位表示,通常被称为代码单元( code unit)
length 方法将返回采用 UTF-16 编码表示的给定字符串所需要的代码单元数量。
例如:
String str1 = "杨欣悦很漂亮,如果当我老婆更漂亮";
int a = str1.length();
要想得到实际的长度,即码点数量,可以调用:
int cpCount = greeting.codePointCount(0, greeting.lengthQ);
调用 s.charAt(n) 将返回位置 n 的代码单元,n 介于 0 ~ s.length()-l 之间。
例如:
String str1 = "杨欣悦很漂亮,如果当我老婆更漂亮";
char b = str1.charAt(3);
要想得到第 i 个码点,应该使用下列语句
String str1 = "杨欣悦很漂亮,如果当我老婆更漂亮";
int c = str1.codePointAt(2);
得到全部码点(编码值)
public class Test5{
public static void main(String[] aaa){
String str1 = "杨欣悦是个傻傻猪";
int a = str1.length();
int[] arr = str1.codePoints().toArray();
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
API接口
切换数组大小写
public class Test5{
public static void main(String[] aaa){
String bb = "abc";
String cc = bb.toUpperCase(); //cc此时为bb的大写
System.out.println(cc);
System.out.println(cc.toLowerCase()); //输出cc 又变为小写
}
}
String replace( CharSequence oldString,CharSequence newString) 返回一个新字符串。这个字符串用 newString 代替原始字符串中所有的 oldString。可 以用 String 或 StringBuilder 对象作为 CharSequence 参数。
public class Test5{
public static void main(String[] aaa){
String bb = "abc";
String cc = bb.replace("a","s");
System.out.println(cc);
}
}
切割
public class Test5{
public static void main(String[] aaa){
String bb = "杨欣悦,嫁给我吧";
String[] arr = bb.split(",");
for(int i = 0; i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
字符串的拼接
构建字符串
内存中每个存储单元被分为大小为4kb的页 当一个存储单元被占用时不能被再次占用
但是里面如果只有20b 的东西剩下的字节就会被浪费
每一个4KB单元只有一个地址 如果里面存入了多个数据 除了第一个数据其他的数据定位不到
public class Test5{
public static void main(String[] aaa){
long start = System.currentTimeMillis();
String str="";
StringBuilder str2 = new StringBuilder();
for(int i = 0;i<100000;i++){
str +=i;
}
long end=System.currentTimeMillis();
System.out.println("花费毫秒数:"+(end-start));
}
}
StringBuilder 使速度加快
buffer借助于数组申请足够大的空间让他不至于每次都有额外的空间消耗
buffer---内部就是基本类型数组实现的 代表高性能
public class Test5{
public static void main(String[] aaa){
long start = System.currentTimeMillis();
String str="";
StringBuilder str2 = new StringBuilder();
for(int i = 0;i<100000;i++){
//str +=i;
str2.apend(""+i);
}
long end=System.currentTimeMillis();
System.out.println("花费毫秒数:"+(end-start));
}
}