byte数组转为string乱码_Java基础数据类型和String

基本类型

概念

java的基本数据类型可以简称为四类八种:

  • 整型:(byte、short、int、long):整数数据类型默认是int
  • 浮点型:(float、double)
  • 字符型:(char)
  • 布尔类型:(boolean):true 真 和 false 假byte -> short -> char -> int -> long -> float ->double(小到大)

数据类型转换:

自动类型转换(自动),较小的类型转换为一个更大的类型byte -> short -> char -> int -> long -> float ->double
强制类型转换(手动),更大的类型转换到一个较小的类型double -> float -> long -> int -> char -> short ->byte

数据类型对比一览表

2f52845f977e0398b7b941220814b74c.png

什么是包装类

Java是一种面向对象语言,很多地方都需要使用对象而不是基本数据类型。比如,在集合类中,我们是无法将int 、double等类型放进去的。因为集合的容器要求元素是Object类型。
为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

什么是自动拆箱和自动装箱

  • 在Java SE5中,为了减少开发人员的工作,Java提供了自动拆箱与自动装箱功能。
  • 自动装箱: 就是将基本数据类型自动转换成对应的包装类。
  • 自动拆箱:就是将包装类自动转换成对应的基本数据类型。

那些场景会发生装箱与拆箱

  • 将基本数据类型放入集合类
  • 包装类型和基本类型的大小比较
  • 包装类型的运算
  • 三目运算符的使用
  • 函数参数与返回值

String类

String的常用方法

indexOf():查询字符串首次出现的下标位置
lastIndexOf():查询字符串最后出现的下标位置
contains():查询字符串中是否包含另一个字符串
toLowerCase():把字符串全部转换成小写
toUpperCase():把字符串全部转换成大写
length():查询字符串的长度
trim():去掉字符串首尾空格
replace():替换字符串中的某些字符
split():把字符串分割并返回字符串数组
join():把字符串数组转为字符串

字符串替换删除

public static void main(String[] args) {
		String str = "hello word !!";
		log.info("替换之前 :{}", str);		//替换之前 :hello word !!
		str = str.replaceAll("l", "d");		
		log.info("替换所有字符 :{}", str);	//替换所有字符 :heddo word !!
		str = str.replaceAll("d", "l");
		log.info("替换全部 :{}", str);		//替换全部 :hello worl !!
		str = str.replaceFirst("l", "");
		log.info("替换第一个 l :{}", str);	//替换第一个 l :helo worl !!
}

字符串拆分合并

public static void main(String[] args) {
    	String test =",a,b,";
    	System.out.println(Arrays.asList(test.split(",")) );    			//[, a, b]默认拆分存在空值
    	System.out.println(Arrays.asList(StringUtils.split(test,",")));	    //[a, b] StringUtils处理拆分空值
    	
    	String[] arrStr=new String[]{"a","b" ,null,"c"};
    	System.out.println(String.join("-", arrStr));						//a-b-null-c  拼接出现null值
    	System.out.println(StringUtils.join(arrStr, "-"));					//a-b--c	    拼接空
    	Joiner joiner = Joiner.on(",").skipNulls();
    	System.out.println(joiner.join(arrStr));   							//a,b,c忽略拼接
}

String的不变性

da5bd5a5225a10be0056d7ffdaed9803.png

5070516b8f83093b02ff4c62332e9af5.png

从代码上来看,str 的值好像被修改了,但从 debug 的日志来看,其实是 str 的实例ID已经被修改了,也就说 s =“world” 这个看似简单的赋值,其实已经把 str 的引用指向了新的 String实例,debug 的截图显示实例ID被修改。

从源码上查看一下:

public final class String
    implements java.io.Serializable, Comparable, CharSequence {
    // 用于存储字符串的值
    private final char value[];
    // 缓存字符串的 hash code
    private int hash; // Default to 0
    // ......其他内容
}    

使用 final 修饰的第一个好处是安全;第二个好处是高效,以 JVM 中的字符串常量池来举例,只有字符串是不可变时,我们才能实现字符串常量池,字符串常量池可以为我们缓存字符串,提高程序的运行效率。

String 和 常量池

String 常见的创建方式有两种,new String() 的方式和直接赋值的方式,直接赋值的方式会先去字符串常量池中查找是否已经有此值,如果有则把引用地址直接指向此值,否则会先在常量池中创建,然后再把引用指向此值;而 new String() 的方式一定会先在堆上创建一个字符串对象,然后再去常量池中查询此字符串的值是否已经存在,如果不存在会先在常量池中创建此字符串,然后把引用的值指向此字符串,如下代码所示:

String str1 = new String("Hello");
String str2 = str.intern();
String str3 = "Hello";
System.out.println(str1 == str2); // false
System.out.println(str2 == str3); // true

String 和 StringBuilder、StringBuffer 的区别

因为 String 类型是不可变的,所以在字符串拼接的时候如果使用 String 的话性能会很低,因此我们就需要使用另一个数据类型 StringBuffer,它提供了 append 和 insert 方法可用于字符串的拼接,它使用 synchronized 来保证线程安全,如下源码所示:

@Override
public synchronized StringBuffer append(Object obj) {
    toStringCache = null;
    super.append(String.valueOf(obj));
    return this;
}
@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

因为它使用了 synchronized 来保证线程安全,所以性能不是很高,于是在Java提供了 StringBuilder,它同样提供了 append 和 insert 的拼接方法,但它没有使用 synchronized 来修饰,因此在性能上要优于 StringBuffer,所以在非并发操作的环境下可使用 StringBuilder 来进行字符串拼接。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值