精华内容
下载资源
问答
  • string类面试题

    2020-12-18 15:55:07
    1,String类可以被继承吗 String类定义如下 publicfinalclassString{...} String类是一个final类,final类不能被继承。报错提示:The type StringDemo cannot subclass the final class String。 2,string...

    1,String类可以被继承吗

    String类定义如下

    
     

    public final class String{...}

    String类是一个final类,final类不能被继承。报错提示:The type StringDemo cannot subclass the final class String。

    2,string的值为什么不能被修改

    String类属性定义如下

    
     

    private final char value[];

    对象值用final字符数组保存,一旦初始化引用地址不可修改,同时String类未提供修改value值的方法,并可保证线程安全。

    String类作为java中最常用的类,底层用的也是char,由此可见java中所有的操作最终还是由8种基本数据类型来完成。

    3,为什么常用string作为map中的key

    
     

    /** Cache the hash code for the string */
       private int hash; // Default to 0
       public int hashCode() {
           int h = hash;
           if (h == 0 && value.length > 0) {
               char val[] = value;

               for (int i = 0; i < value.length; i++) {
                   h = 31 * h + val[i];
               }
               hash = h;
           }
           return h;
       }

    string实例缓存了自己的hashcode,而在map操作中计算key的索引时会使用key的hashcode。

     

    4,字符串倒序输出

    String youfengxin = "youfengxin.com";
    System.out.println(new StringBuilder(youfengxin).reverse().toString());
    

    输出

    moc.nixgnefuoy
    

    5,string与char互转

    String youfengxin = "youfengxin.com";
    //string to char[]
    char[] chars = youfengxin.toCharArray();
    //char[] to string
    System.out.println(new String(chars));
    

    6,==和equals

    public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            if (anObject instanceof String) {
                String anotherString = (String)anObject;
                int n = value.length;
                if (n == anotherString.value.length) {
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }
    

    (==)是判断两个对象的引用地址refrence是否相等。对象的访问定位

    equals先判断==,在判断类型,在比较每个字符,只有==true或者类型相同且每个字符都相等才返回true。

     

    7,intern方法有什么用

     * When the intern method is invoked, if the pool already contains a
         * string equal to this {@code String} object as determined by
         * the {@link #equals(Object)} method, then the string from the pool is
         * returned. Otherwise, this {@code String} object is added to the
         * pool and a reference to this {@code String} object is returned.
         */
        public native String intern()
    

    当intern()方法被调用,如果字符串池中含有一个字符串和当前调用方法的字符串eqauls相等,那么就会返回池中的字符串。如果池中没有的话,则首先将当前字符串加入到池中,然后返回引用。

     

    8,String语法糖

    String youfengxin = "youfengxin";
    String com = ".com";
    String youfengxin_com1 = youfengxin+com;
    String youfengxin_com2 = "youfengxin.com";
    String youfengxin_com3 = "youfengxin"+".com";
    System.out.println(youfengxin_com1 == youfengxin_com2);
    System.out.println(youfengxin_com1 == youfengxin_com3);
    System.out.println(youfengxin_com2 == youfengxin_com3);
    

    结果

    false
    false
    true

    但如果把youfengxin和com变量都改成常量final

    final String youfengxin = "youfengxin";
    final String com = ".com";
    String youfengxin_com1 = youfengxin+com;
    String youfengxin_com2 = "youfengxin.com";
    String youfengxin_com3 = "youfengxin"+".com";
    System.out.println(youfengxin_com1 == youfengxin_com2);
    System.out.println(youfengxin_com1 == youfengxin_com3);
    System.out.println(youfengxin_com2 == youfengxin_com3);
    

    结果

    true
    true
    true
    

    常量拼接(字面量和final修饰的变量),虚拟机会直接优化成youfengxin_com2格式

    变量拼接,编译后使用StringBuilder.append()拼接生成一个新的字符串

    更多java类库文章阅读

    展开全文
  • String类面试题

    千次阅读 2012-06-21 00:59:25
    问题1:  ...String s = new String("abc"); String s1 = "abc"; String s2 = new String("abc");   System.out.println(s == s1); System.out.println(s == s2);
    问题1: 
    Java代码 
    1. String s = new String("abc");   
    2. String s1 = "abc";   
    3. String s2 = new String("abc");   
    4.   
    5. System.out.println(s == s1);   
    6. System.out.println(s == s2);   
    7. System.out.println(s1 == s2);  

    请问以上程序执行结果是什么? 

    第一句执行后内存中有两个对象,而不是一个。一个由new String("abc")中的"abc"在String Pool里生成一个值为"abc"的对象;第二个由new在堆里产生一个值为"abc"的对象,该对象完全是String Pool里的"abc"的一个拷贝。变量s最后指向堆中产生的"abc"对象; 如果在new String("abc");之前,String Pool里面已经存在一个值为"abc"的对象,则省去在String Pool中创建"abc"对象的步骤,直接在堆内存中创建一个新对象,并将此堆内存中对象的引用赋给s;
    第二句执行时,s1先去String Pool找是否有值为"abc"的对象,很显然在上一步中java已经在String Pool里生成一个"abc"对象了,所以s1直接指向String Pool中的这个"abc";如果String Pool中尚无"abc"对象,那么将在String Pool中创建一个"abc"对象,并将此对象的引用赋给s1; 
    第三句中又有一个new,在java中凡遇到new时,都会在堆里产生一个新的对象。因此,该句执行后堆里又多了一个"abc"对象,这与执行第一句后生成的"abc"是不同的两个对象,s2最后指向这个新生成的对象;因为第一个String s = new String("abc");中已经在String Pool中创建了"abc"对象,故而此步骤省略。
    因此,执行后面的打印语句的结果是三个false 

    问题2: 
    Java代码 
    1. System.out.println(s == s.intern());   
    2. System.out.println(s1 == s1.intern());   
    3. System.out.println(s1.intern() == s2.intern());  

    请问以上程序执行结果是什么? 

    设s为String类型的变量,当执行s.intern()时,java先在String Pool里找与字符串变量s相等(用equals()方法)的字符串,若有则将其引用返回;若没有则在String Pool里创建一个与s的值相等的字符串对象,并将其引用返回。从中我们可以总结出intern()方法无论如何都将返回String Pool里的字符串对象的引用。 
    因此,以上程序执行的结果是falsetruetrue。 
    PS:设s和t为两个字符串变量,若有s.equals(t),必有s.intern() == t.intern(); 
    PS:"=="永远比较的是两边对象的地址是否相等。 

    问题3: 
    Java代码 
    1. String hello = "hello";   
    2. String hel = "hel";   
    3. String lo = "lo";   
    4. System.out.println(hello == "hel" + "lo");   
    5. System.out.println(hello == "hel" + lo);  

    请问以上程序执行结果是什么? 

    前三句在String Pool里分别产生“hello”、“hel”、“lo”三个常量字符串对象 
    当做第一个加法连接时,+号两边都是常量字符串,java就会将两者拼起来后到String Pool里找与之相等(用equals)的字符串,若存在则将其地址返回;不存在则在String Pool里新建一个常量对象,其值等于拼接后的字符串,并将其地址返回。 
    第二个+号两边有一个是变量,此时,java会在堆里新建一个对象,其值是两字符串拼接后的值,此时返回的地址是堆中新对象的地址。 
    所以,第一句做+连接后返回String Pool中“hello”的地址,显然与变量hello的地址相等; 
    第二句返回的是堆中地址,显然与变量hello的地址不等;
    展开全文
  • String 面试题

    2010-09-15 12:09:12
    字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改 String类有一个对应的String池,也就是 String pool.每一个内容相同的字符串对象都对应于一个pool里的对象. 1 ...
    字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改

    String类有一个对应的String池,也就是 String pool.每一个内容相同的字符串对象都对应于一个pool里的对象.

    1 看下面一段代码.

    String s = new String("abc");
    String s1 = "abc";
    String s2 = new String("abc");

    System.out.println(s == s1);
    System.out.println(s == s2);
    System.out.println(s1 == s2);

    请问 前面三条语句分别创建了几个对象,分别是什么.后面的输出分别是什么

    (1)String s = new String("abc"); 这句,创建了两个对象..其内容都是"abc".注意,s不是对象,只是引用.只有new生成的才是对象.

    创建的流程是,首先括号里的"abc"先到String pool里看有没"abc"这个对象,没有则在pool里创建这个对象..所以这里就在pool创建了一个"abc"对象.然后 通过new语句又创建了一个"abc"对象..而这个对象是放在内存的堆里. .这里的s指向堆里的对象.

    (2) String s1 = "abc"; 这条语句,s1当然还是引用.没啥可说的.后面的"abc".其实就是上面括号里的"abc".执行的是相同的操作.即 在pool里查找有没"abc"这个对象.没有则创建一个...很显然,第一条语句在pool里已经创建了一个"abc".所以这条语句没有创建对象,s1指向的是pool中的"abc"

    (3)String s2 = new String("abc"); 这条语句,其实和第一条是一样的,但是,因为第一条已经在pool中创建了"abc"这个对象,所以,这条语句创建了一个对象.s2指向的是堆里的"abc".注意,虽然内容都是"abc",s与s2表示的是不同的对象

    (4)接下来就很好说了.下面的三个==判断.(注意,==永远是判断内存地址是否相等) s与s1,一个指向堆里的对象,一个指向pool里的.很明显是不同的对象.s与s2.上面说了,虽然都是指向堆里的对象,内容也是"abc",但是也不是相同的对象.s1与s2.一个指向pool,一个指向堆.也不是相同的对象.所以三个都返回false.

    2 第二个问题

    String s = new String("abc");
    String s1 = "abc";
    String s2 = new String("abc");

    System.out.println(s == s1.intern());
    System.out.println(s == s2.intern());
    System.out.println(s1 == s2.intern());

    求最后输出是什么

    解答.最后的答案是 false false true

    intern()方法.按照jdk的帮助文档来说,是返回字符串对象的规范化表示形式。通俗一点说,就是返回对应这个字符串内容的那个pool里的对象.这样说也许还看不太明白,那可以拿具体例子来说

    s1.intern().他的执行流程是,在pool里去查找s1对应的内容(也就是"abc").如果找到,则返回pool里的对象.如果没有(老实说,我没想到有哪种情况是没有的),则在Pool创建这个对象,并返回...

    这样就很容易理解了.s1.intern返回的是pool里的"abc"对象.与s这个堆里的对象肯定不同,返回false.同理,s与s2.intern()也肯定不同,返回false.第三个,s1与s2.intern().其中s2.intern()返回的是pool中的"abc"对象,而s1也是指向pool中的"abc"对象.所以返回的是true:

    3第三个问题

    String hello = "hello";
    String hel = "hel";
    String lo = "lo";

    System.out.println(hello == "hel" + "lo");
    System.out.println(hello == "hel" + lo);

    求输出的结果

    解答 true false

    首先,上面已经说明了,hello hel lo这三个都是指向pool中的对象..

    现在我们考虑"hel" + "lo" 按照内容来说,两个相加也就是"hello".这个时候,这个会返回pool中的"hello"对象.所以,hello == "hel" + "lo" 返回的是true .

    而"hel" + lo 虽然内容也是"hello",但是它将在堆里面生成一个"hello"对象,并返回这个对象...所以这里的结果是false

    总结一下就是,如果加号两边的是字面值(字面值就是直接在""里写的值,比如上面的"hel"与"lo"),那么将在pool里查找有没对应内容的对象(这里的内容就是"hello"),并返回pool里的对象.这和hello是一样的....

    如果加号两边不满足上面的条件(比如,两边的值是引用值或者堆里的字符串对象).那么将不会再pool里查找"hello",而是直接在堆里生成一个新的对象...
    展开全文
  • 本文主要内容: (1)String的不可变性 (2)StringBuilder类 ...1.String类笔试: (1)String的不可变性 //源码 public final class String implements java.io.Serializable, Comparable<String>, Cha...

    本文主要内容:

    (1)String的不可变性

    (2)StringBuilder类

    (3)StringBuilder与StringBuffer的区别

    1.String类笔试题:
    (1)String的不可变性

    //源码
    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
        //在String类中包含一个数组,private final char[] value;
        //存储String中的每一个字符,final——>地址不让改变,数组的长度本身不可变
        //private->数组中的内容也不能改变
        .....
    

    体现在两个方面:长度和内容。长度——>final修饰的数组,数组的长度本身不变,final修饰的数组地址也不变;内容——>用private修饰的属性,不能在类的外部访问。
    (2)String str = “a”+“b”+“c”+“d”;
    System.out.println(str);在这个过程中产生了几个String对象?字符串常量池7个
    2.StringBuilder类
    由于String类有不可变特性,频繁的修改其内容,性能很不好
    (1)所属的包:java.lang包
    (2)默认继承Onjrct,实现接Serializable,CharSequence,Appendable;
    StringBuffer/StringBuilder没有comapreTo()方法;StringBuffer/StringBuilder含有一个String没有的方法append();拼接
    (3)特性:可变字符串,char[] value;动态扩容
    (4)对象的构建:无参构造方法、有参构造方法

    StringBuilder builder = new StringBuilder();
    //无参构造方法,构建一个默认长度为16个空间的对象
    StringBuilder builder = new StringBuilder(20);
    //利用给定的参数,构建一个自定义长度的空间的对象
    StringBuilder builder = new StringBuilder("abc");
    //利用String带参数构造方法,默认数组长度为字符串长度+16
    

    (5)StringBuilder中常用的方法
    最主要的方法:append();频繁的拼接字符串的时候使用此方法,提高性能
    ensureCapacity(int minimumCapacity);确保底层数组容量够用
    capacity();字符串底层char[]的容量
    length();字符串的有效元素的个数
    char = charAt(int index);返回下标所对应的字符
    int = codePointAt(int index);返回下标对应字符的code码
    String = subString(int start,int end);注意接收返回值,截取出新字符串的效果
    StringBuilder = delete(int start,int end);StringBuilder类中独有的方法String类并没有,将start到end之间的字符串删除掉,不用接受返回值就看到效果
    StringBuilder = deleteCharAt(int index);String类无此方法,将给定的index位置的某一个字符删除掉
    int = indexOf(String str,[int fromIndex]);
    int last = lastIndexOf(String str,[int fromIndex]);
    找寻字符串第一次或者最后一次出现的位置
    insert(int index,char value);将给定的value插入到index位置之上
    replace(int start,int end,String str);将start与end之间的部分替换为str
    setCharAt(int index,char value);将index位置的字符改为给定的value
    toString();将StringBuilder对象构建成一个String对象返回
    trimToSize();将数组无用的容量去掉,编程length长度的数组
    3.StringBuilder类面试题
    (1)String和StringBuilder区别|String和StringBuffer区别
    String:不可变字符串;JDK1.0之后;有一个接口Comparable;不可变体现在长度及内容;有一些方法StringBuilder没有,例如concat、compareTo、toUpperCase方法
    StringBuilder:可变字符串;JDK1.5之后;有一个接口Appendable;可变字符串:没有final修饰,底层可以进行数组扩容;有一些方法String没有,例如:append,insert,delete,reverse方法
    (2)StringBuffer和StringBilder的不同
    StringBuffer早期版本1.0
    StringBuilder后来的版本1.5
    早期版本:线程同步,安全性比较高,执行效率相对较低
    后期版本:线程非同步,安全性比较低,执行效率相对较高

    展开全文
  • String类面试题汇总

    2019-11-13 18:39:04
    1、如何翻转字符串? 有两种方式,一个是 StringBuilder 的 reverse 方法,一个是转换成数组自己打印。自己转换性能更好,reverse 方法内部步骤更多。 public class ... public static void main(String...
  • Java String 类面试题

    2017-08-09 10:59:43
    字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改 String类有一个对应的String池,也就是 String pool.每一个内容相同的字符串对象都对应于一
  • Java String类面试题

    2016-10-12 22:13:20
    字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改 String类有一个对应的String池,也就是 String pool.每一个内容相同的字符串对象都对应于一个pool里的对象. 1. 看...
  • String类面试题2

    2017-08-20 16:56:00
    一:读程序写结果 ...1 String str1="abcde"; 2 String str2=str1.substring(2); 3 System.out.println(str1);//abcde,字符串时常量,一旦定义,其值无法改变 4 System.out.println(str2);//cde 转载于:h...
  • String类 String类 String的两种实例化方式 &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;直接赋值(用的最多) &nbsp;&nbsp; &nbsp;&nbsp...
  • String类 String类 String的两种实例化方式  直接赋值(用的最多)  String str=“Hello”;  传统方法,实例化对象  String str=new String("Hello"); 字符串相等比较  str.e...
  • JAVA-String类面试题

    2018-08-09 21:55:21
    1.两种方式创建String对象时内存分析 2.比较下面的String对象,它们是否相等 public class StringDemo { private static String getString() { return "AB"; } public static void main...
  • java-String类面试题

    2018-04-17 09:53:37
    * String s1 = "abc"; * String s2 = "abc"; * System.out.println(s1 == s2); //true * System.out.println(s1.equals(s2)); //true * 2.下面这句话在内存中创建了几个对象? * ...
  • Integer是java为int提供的封装,是引用数据类型。 int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。例如,要想表达出没有参加考试和考试成绩为...
  • 主要介绍了Java常用类String面试题汇总,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • String类面试

    2019-10-05 14:49:07
    1.面试F:\SHJT\JavaWorkspace\JavaSE\workspace\day13ezra\src\cn\itcast\sh\classcode\BTStringLastIndexOfDemo.java 1 /* 2 Day13_SHJavaTraing_4-21-2017 3 int lastIndexOf(int ch, int fromIndex) .....
  • 上次写了关于 String 类的一些方法Java中的常用类——String类今天我们来做一些关于 String 类的面试题关于 String类 的常见面试题1)判断Str...
  • Java-String类常见面试题

    千次阅读 热门讨论 2016-12-30 15:39:27
    Java-String类常见面试题
  • 2.String面试题: (1)题1: 1 package cn.itcast_02; 2 3 /* 4 * 看程序写结果 5 */ 6 public class StringDemo3 { 7 public static void main(String[] args) { 8 String s1 ...
  • String类常见面试题

    千次阅读 2019-05-01 13:44:47
    答案解释:String类代表字符串,字符串是常量,常量需要进入到内存中的方法区的常量池(进入常量池规则:如果常量池中没有这个常量,就创建一个,如果有就不再创建了)。所以s1首先会在常量池中创建“abc”对象,“abc...
  • 【java】String类常见面试题
  • JAVA --String类笔试面试题
  • String类相关面试题总结

    千次阅读 2018-07-03 16:31:22
    String类相关面试题总结一、判断String类型的s1和s2是否相等 String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2);  //true System.out.println(s1.equals(s2)); //...
  • public static void main(String[] args) { String str1 = new String("Tom"); System.out.println(str1.length()); System.out.println(str1.endsWith("om")); System.out.pri...
  • String笔试面试题

    2017-08-17 21:07:00
    下面六道题目,如果您全部做对了,且明白其所以然,那么Java中的关于String的笔试面试题应该难不到你了。也许您觉得polaris说的有点过了,然而彻底明白这些题目,对理解String类还是很有好处的。 写出下面各题的...
  • String类常见面试题1

    2017-08-20 16:55:00
    字符串常见面试题 1.判断定义为String类型的s1和s2是否相等 1 String s1="abc";//常量池中没有这个对象就去创建,如果有就使用. 2 String s2="abc";//第一次创建了,有对此对象,直接指向他 3 System.out....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,481
精华内容 1,392
关键字:

string类面试题