String字符串 比较 解析 附实际公司面试相关题

字符串理解(java核心技术 卷一 48页 有感)

概念: Java字符串就是Unicode字符序列,java中没有内置的字符串类型,而是在类库中提供了一个预定义类,很自然的叫做String.每个用双引号括起来的字符串都是String类的一个实例. 如: String e=""" ; String greeting=“hello”;
字符串是不可变的: 在java中 String类是不可变字符串,比如,1就是1 2就是2 “hello"就是"hello” “hell"就是"hell”,而不能单独修改其中任何一个单一字符.这些字符串字面量存在一个公共存储池里,便于共享,string字符串变量可以指向同一个字符串字面量. Java设计者认为共享带来的高效率远胜过提取拼接的低效率.对于特定必须大量进行字符串拼接的情况 java提供了stringbuilder类.
与c相比 替换操作: java字符串类似于char*指针,但java字符串替换操作是另开辟一个空间,若原来指向的字符串常量没有变量引用了则会被java自动回收机制回收.
比较字符串是否相等: Java中两种比较方式"= =" 和 equals()方法,推荐使用的是equals()方法(比较的是内容). "= =“方式只能确定两个字符串是否放置在同一个位置,(完全有可能内容相同的多个字符串拷贝在不同位置)即是否指向的是同一个对象,实际上只有字符串常量是共享的,而+或substring操作产生的结果是不共享的所以: String greeting=“hello” if(greeting.substring(0,3)==“hell”)// probably false
空串与null串: 空串”"指长度为0内容为空的字符串,而null串指当前没有对象与它关联.

字符串深度解析问题(不全待完善)

在这里插入图片描述
private final char value[]; //The value is used for character storage

private int hash;  //Cache the hash code for the string

其中第一个就是实际存储字符串的数组,所有字符串最终的存储形式都是字符数组。从上图中可以很清晰的看出,实际的字符数组还是存储在堆中,常量池中存储的是String对象。

当执行String str = “Hello”,只是将常量池中"Hello"对象的地址赋给了str。

推荐文章:
https://www.cnblogs.com/fairly/p/6091456.html

附带真实面试题string+集合题

    Object obj =null;    System.out.println(String.valueOf(obj));//result:"null"

     System.out.println(String.valueOf(null));//error

       System.out.println("123"==String.valueOf("123")); //true

     System.out.println("123"==new String("123"));//flase

     System.out.println(new String("123").equals(String.valueOf("123")));//true

        System.out.println(new String("123")==String.valueOf("123")); //flase

        List<String> list=new ArrayList<String>(0);//lsit是一个可变长的集合,0只是默认容量大小,添加前判断当前容量,不足则扩容;扩容方式:newCapacity = oldCapacity + (oldCapacity >> 1)
      list.add("123");  
		System.out.println(list.get(0));

       List<Object> list = Collections.emptyList();list.add("123");//error 有时候需要返回一个空集合,直接返回null或者new一个耗性能,要做判空等判断.使用这个不用判空,不会报空指针异常;该list不能做add操作 原因是,emptylist没有add方法,使用的是父类abstractList的add方法,该方法报UnsupportedOperationException();不支持该操作

当一个集合(Collection/set/List/map等)被作为参数传递给一个函数时,如何保证函数不能修改它?
在作为参数传递之前,我们可以使用Collections.unmodifiableCollection(Collection c)方法创建一个只读集合,这将确保改变集合的任何操作都会抛出UnsupportedOperationException。

集合部分推荐观看博客链接,几乎全解;
https://blog.csdn.net/u010775025/article/details/79315361


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章