StringBuffer是Java中的一个类,用于处理字符串的可变对象。它是一个线程安全的、可变的字符串序列。StringBuffer类的声明如下: ``` public final class StringBuffer extends AbstractStringBuilder implements Serializable, CharSequence ``` StringBuffer类拥有一系列的方法,可以对字符串进行添加、删除、修改等操作。下面是一些常用的方法: 1. append():向字符串末尾追加内容。 2. insert():在指定位置插入内容。 3. delete():删除指定位置的内容。 4. replace():替换指定位置的内容。 5. reverse():反转字符串。 6. capacity():返回当前容量。 7. length():返回字符串的长度。 StringBuffer类的主要特点是线程安全,即多个线程同时操作一个StringBuffer对象时,不会出现数据混乱的问题。这是通过在方法中添加synchronized关键字来实现的。 与String类不同,StringBuffer对象的内容是可以修改的。这在需要频繁修改字符串内容时非常有用,可以避免每次修改都需要创建一个新的String对象的开销。 需要注意的是,StringBuffer是一个过时的类,从Java 5开始,推荐使用StringBuilder类替代StringBuffer类。StringBuilder类与StringBuffer类的功能相似,但不是线程安全的。如果在单线程环境下使用,建议使用StringBuilder类,以提高性能。 public class StringBufferTest { public static void main(String[] args) { //StringBuffer叫做字符串缓冲区,也叫字符串生成器 //底层是一个字符数组 StringBuffer sb1 = new StringBuffer();//默认长度为16 StringBuffer sb2 = new StringBuffer(20);//可以自我指定长度 StringBuffer sb3 = new StringBuffer("hello");//字符串长度+16 //StringBuffer和string一样都重写了toString方法 System.out.println(sb3); //StringBuffer进行字符串拼接的时候不能使用+进行字符串拼接 //sb3 = sb3+"world" //StringBuffer使用append方法进行追加字符串 sb3.append("world"); System.out.println(sb3.toString()); System.out.println("hello".toString()); } }
在Java中,包(package)是一种用于组织类(class)和接口(interface)的机制。它可以将相关的类和接口分组存放,使代码更加有层次性和可维护性。下面是Java中常用的几种包: 1. java.lang包:这个包是Java语言的核心包,其中包含着一些Java语言的基本类,如String、Integer等。这些类不需要显式导入即可使用。 2. java.util包:这个包提供了一些常用的工具类,如集合类(ArrayList、HashSet等)、日期类(Date、Calendar等)、随机数生成器等。 3. java.io包:这个包提供了输入和输出相关的类,用于读写文件和网络通信。其中有一些常用的类,如File、BufferedReader、PrintWriter等。 4. java.net包:这个包提供了用于处理网络编程的类和接口。它可以实现网络通信、创建服务器和客户端等功能。常用的类有Socket、ServerSocket等。 5. java.awt包:这个包提供了Java的图形界面工具包,用于开发窗口应用程序。其中包含了创建窗口、绘制图形、处理事件等功能。常用的类有Frame、Button、TextField等。 6. java.swing包:这个包是在AWT的基础上开发的一套图形界面工具包,与AWT相比,它更加强大和灵活,并且提供了更多的组件和效果。常用的类有JFrame、JButton、JTextField等。 这只是Java中的一小部分包,Java还有很多其他的包,如数据库访问包(java.sql)、多线程包(java.util.concurrent)等。这些包都提供了丰富的功能和类库,方便开发人员开发各种类型的应用程序。 public class StringTest01 { public static void main(String[] args) { //String是字符串类,也是引用类型 //String位于java.lang包这个包下的类使用的时候都不需要导包 //创建字符串对象的方式有两种 //1.引用字符串常量给字符串变量赋值 String s1 = "Hello"; //2.通过构造方法创建对象 String s2 = new String(); char[] c= {'h','e','l','l','o'}; //将字符数组中的数据拼接在一起作为字符串进行创建对象 String s3 = new String(c); //字符数组索引为2开始,长度为2的字符拼接在一起为字符串创建对象 String s4 = new String(c,2,2); String s5 = new String("Hello"); System.out.println(s1); System.out.println(s2); System.out.println(s3); System.out.println(s4); System.out.println(s5); } }
toString方法是Java中所有类都继承自Object类的一个方法。它用于将对象转换为字符串表示形式。 默认情况下,Object类的toString方法返回一个由类的名称和对象的哈希码组成的字符串。例如,对于一个名为myObject的对象,其默认的toString方法返回的字符串可能是"com.example.MyObject@123456"。 然而,大多数情况下,我们需要根据对象的具体属性来自定义toString方法。这可以通过在类中重写toString方法来实现。 例如,假设我们有一个名为Person的类,定义如下: ```java public class Person { private String name; private int age; // 构造方法、Getter和Setter方法等省略 @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } ``` 在上面的例子中,我们重写了Person类的toString方法,使其返回一个以"name"和"age"属性为基础的字符串表示形式。当我们调用一个Person对象的toString方法时,它将返回类似于"Person{name='Alice', age=25}"的字符串。 通过重写toString方法,我们可以方便地将对象转换为String类型,以便在打印日志或调试时更方便地查看对象的属性。 import lesson07.Student; /** * 面试题:为什么普通引用数据类型打印的是地址,而字符串对象打印是内容呢 * 因为普通引用数据类型的对象默认调用的是Object的toString方法,所以默认打印出来的就是 * 完整类路径+类名+@+十六进制的地址值,而String类型有自己的toStrig方法,会将字符串 * 转换成字符串数组,然后将字符数组打印在控制台上,所以输出是的字符串内容 */ public class StringTest02 { public static void main(String[] args) { String s1 = new String("Hello"); Student s2 = new Student(); //String有自己的toString方法,所以打印的不是地址 System.out.println(s1); System.out.println(s2); } }
** * 面试题:问一共创建了多个String对象 * 答:字符串为了减少内存将字符串常量保存在字符串常量池中,而字符串常量池1.6之前位于 * 方法区中,但是到了1.8之后位于堆区中,如果常量池中有字符串常量,则使用的时候,直接 * 引用,而如果字符串常量不存在,则会创建新的字符串常量,但是不管常量池如何变化 * 只要有new调用构造方法,就会在堆区中创建一个字符串。所以考虑多少个字符串要同时 * 考虑常量池和构造方法创建的堆区对象 */ public class StringTest03 { public static void main(String[] args) { String s1 = "Hello";//1 String s2 = new String();//1 String s3 = new String("hello world");//2 String s4 = new String("hel1o");//2 String s5 = "hello world";//0 // } }
在Java中,字符串是一种不可变的对象,它提供了许多方法来操作和处理字符串。下面是一些常用的字符串方法: 1. `length()`:返回字符串的长度。 ```java String str = "Hello World"; int length = str.length(); // 返回 11 ``` 2. `charAt(index)`:返回指定索引位置的字符。 ```java String str = "Hello"; char ch = str.charAt(0); // 返回 'H' ``` 3. `substring(startIndex, endIndex)`:返回子字符串,从startIndex(包含)到endIndex(不包含)。 ```java String str = "Hello World"; String subStr = str.substring(6, 11); // 返回 "World" ``` 4. `indexOf(str)`:返回str在字符串中第一次出现的索引位置。 ```java String str = "Hello World"; int index = str.indexOf("o"); // 返回 4 ``` 5. `lastIndexOf(str)`:返回str在字符串中最后一次出现的索引位置。 ```java String str = "Hello World"; int index = str.lastIndexOf("o"); // 返回 7 ``` 6. `toUpperCase()`:将字符串中的所有字符转换为大写。 ```java String str = "Hello World"; String upperCaseStr = str.toUpperCase(); // 返回 "HELLO WORLD" ``` 7. `toLowerCase()`:将字符串中的所有字符转换为小写。 ```java String str = "Hello World"; String lowerCaseStr = str.toLowerCase(); // 返回 "hello world" ``` 8. `trim()`:去掉字符串前后的空白字符。 ```java String str = " Hello World "; String trimmedStr = str.trim(); // 返回 "Hello World" ``` 这些只是字符串的一部分常用方法。Java中还有许多其他方法,例如替换、拆分、连接等,可以根据具体的需求来选择使用。 public class StringTest04 { public static void main(String[] args) { String s = " Hello world everyone "; System.out.println("字符串的长度为:"+s.length()); //字符串的索引也是从0开始的 //indexOf正向查找,从左到右查 System.out.println("查找字符串的所在位置"+s.indexOf("ll")); //lastIndexOf反向查找,从右到左查,索引还是从左侧开始 System.out.println("查找字符串的所在位置"+s.lastIndexOf("ll")); //获取指定索引位置的字符,返回值是char类型 System.out.println(s.charAt(2)); //开始位置的索引表示的值要截取,结束位置表示的值不截取 System.out.println("截取子字符串"+s.substring(6,8)); System.out.println("去除字符串前后空格"+s.trim()); //替换:第一个参数是旧字符串中要被替换的字符串,第二个参数是替换的新字符串 System.out.println("替换"+s.replace(" ","")); } }
/** * 面试题:String的equals方法的实现原理 * 答:String会将字符串转换为字符数组,然后在进行按位逐一比较,但是为了提高比较效率 * 会先进行三重判断,第一重判断比较两个对象的地址是否相同,如果相同则返回true,表示 *两个对象是同一个对象,如果不相同则进行第二重判断,判断当前传递过来的对象是否是 * String类型创建的对象,如果不是则返回false, 如果是则进行第三重判断,比较两个字符串 *的长度是否相同,如果不相同,则返回false,如果相同在进行字符数组的逐一比较,当全部 * 相同才会返回为true, 所以String的equals方法比较的是两个对象的内容是否相同而不是地址 */ public class StringTest05 { public static void main(String[] args) { Student s1 = new Student(); Student s2 = new Student(); System.out.println(s1.equals(s2)); System.out.println(s1==s2); String s3 = "hello"; String s4 = new String("hello"); System.out.println(s3.equals(s4)); System.out.println(s3==s4); } }
Java包装类是用于将基本数据类型包装成对象的类。Java中的8个基本数据类型(byte、short、int、long、float、double、boolean、char)都有对应的包装类。 Java的包装类分为两类: 1. 基本数据类型的包装类(Byte、Short、Integer、Long、Float、Double、Boolean、Character):这些类将基本数据类型封装成了对象,使得可以在对象上进行各种操作。例如,可以通过调用包装类的方法来获取最大值、最小值或对基本数据类型进行转换。 2. 数值类型的包装类(Byte、Short、Integer、Long、Float、Double):这些类继承自Number类,提供了各种与数值相关的方法,如计算平方根、绝对值、取整等。 包装类与基本数据类型之间可以进行自动拆箱和装箱操作,即可以在基本数据类型和包装类之间自动进行转换。这种自动转换可以简化代码的编写,使得基本数据类型可以像对象一样进行操作。 另外,包装类还提供了valueOf()方法来将字符串转换为对应的包装类对象,以及提供了parseXxx()方法来将字符串转换为对应的基本数据类型。 总的来说,Java的包装类提供了一系列的方法和功能,使得基本数据类型可以像对象一样进行操作,并且可以方便地在基本数据类型和包装类之间进行转换。 /** * 包装类作用就是: * 1.解决基本数据类型跟包装类类型进行互转 * 2.当不能使用基本数据类型的时候,可以使用包装类类型例如集合 * * 面试题:请写出10个你知道的位于java.long包下的类 * 八种基本数据类型的包装类,String,StringBuffer,Object,System等 */ public class Wrapper { public static void main(String[] args) { //用基本数据类型给包装类类型赋值就是装箱,而且是自动装箱 Integer i1=20; //因为包装类是对象类型,所以也可以用new创建对象 Integer i2=new Integer(50); //用包装类型给基本数据类型赋值就是拆箱,而且是自动拆箱 int a=i2; System.out.println(i1); System.out.println(i2); //将包装类转换成字符串 String s=i1.toString(); System.out.println(s); s="123"; //将字符串转换成基本数据类型,使用parse***方法,调用这个方法的是你要转为什么 //基本类型的包装类去调用 int b=Integer.parseInt(s); System.out.println(b); } }