1、总结String、Object、包装类的常用方法以及注意点;


String类


String类的两种实例化方法
        直接赋值



            String str = "hello";//字符串常量,为字符串的匿名对象
            1、只开辟一个"hello"空间
            2、在JVM底层会自动维护一个对象池(字符串对象池),该对象会自动保存在对象池中;
            3、当下次采用该方式时,先会比较对象池之中有无指定内容,有则直接引用,无则新开辟空间保存
        传统方法(new 操作)
            String str = new String("hello");
            1、采用构造方法产生的字符串对象不会自动入池,str保存在栈上,内容保存在堆上,
            2、开辟两个"hello"空间,其中一个"hello"为垃圾空间,str指向第二个(new出来的内容为"hello"的对象)
            3、String提供手工入池操作intern();String str = new String("hello").intern();//将new的地址入池
  
字符串比较
         "=="
              本身是进行数值比较的,如果现在用于对象比较,比较的是两个对象所保存的内存地址
              System.out.println(str == str1);//false,比较的是str 与str1保存的内容,即为对象地址



         equals()方法
              比较对象内容,则必须采用String类提供的equals方法。
              str.equals(str1);//null不能调用equals()方法,所以一般是将 指定字符串.equals(用户输入)





比较String类"=="和equals的区别:
    1、"=="进行数值的比较,比较的是两个字符串对象的内存地址数值
    2、equals()比较字符串内容
   
字符串常量不可变更



    在定义字符串常量时,它的内容不可改变。变得是引用指向,不是对象。使用字符串时,尽量少变更。(+操作最多执行三次)JVM底层会将String变为StringBuilder(可变),equalsIgnoreCase();//忽略大小写





字符(char)与字符串(String)常用操作方法:



    1、char[] -> String(将数组变为字符串)
        public String(char[])//构造方法
    2、取得指定索引字符(!!!)
        public char charAt(int index):取的字符串索引的字符



    3、String -> char[](将字符串变为char数组)(!!!)
        public char[] toCharArray();
 



所有越界都属于运行时异常
 



字节(byte)与字符串(String)的常用方法
    1、byte[] -> String(将指定字节数组转为String)



        public String(byte[])//构造方法
        //重载构造
        public String(byte[], String charSetName);将指定字节数组按指定编码格式转为字符串
    2、String -> byte[](字符串转为字节数组)(!!!)
        public byte[] getBytes();
    3、String -> byte[](可指定编码格式)
        public byte[] getBytes(String charSetName);
   
String转double:
    Double.parseDouble(str);



String转int:
    Integer.parseInt(str);





toUpperCase():小写字符转大写字符方法
  
字符串比较



    1、boolean equals():区分大小写



    2、boolean equalsIgnoreCase():不区分大小写
    3、int compareTo(String str);
        返回值>0:表示本字符串>指定字符串
        返回值=0:表示两个字符串相等
        返回值<0:表示本字符串<指定字符串
  



字符串查找:从完整字符串中判断指定字符串是否存在(!!!)
    1、public boolean contains(String str);(!!!)
        判断指定字符串str是否存在于本字符串
    2、public int indexOf(String str);
        从头开始查找str的位置,找到返回下标,否则返回-1
    3、public int lastIndexOf(String str);
        从后开始查找str的位置,找到返回下标,否则返回-1
    4、public boolean startsWith(String str);
        判断是否以指定字符串开头
    5、public boolean endsWith(String str);
        判断是否以指定字符串结尾
 
字符串替换:
    replaceFirst(String reg):将本字符串中第一个出现reg元素替换
    replace(String reg);/replaceAll(String reg);将所有用reg换掉
字符串拆分:



public String[] split();


字符串截取:

public String substring(int startIndex, int endIndex);


  
首字母大写:



 

str.substring(0,1).toUpperCase()+str.substring(1);


    截取首字母转为大写+截取后部分内容
   
判断是否有内容:两点操作,是否为空对象,是否为空
  

if(!(str == null || str.isEmpty())){ 
  
            //str有内容 
  
 

       }


  
去掉字符串中的空格:
    trim();去掉字符串左右两边空格,中间空格保留
      
StringBuffer类、StringBuilder类
使用原则:
    为了方便字符串的修改,而不会产生大量的垃圾空间,有了StringBuffer类、StringBuilder类
 
    修改内容:
     

public StringBuffer append(各种数据类型); 
  
  
  
    StringBuffer -> String: 
  
        public String toString();//将StringBuffer转为String 
  
  
  
    String -> StringBuffer:(两种方式) 
  
        1、append(); 
  
        2、new StringBuffer(String str); 
  
  
  
    StringBuffer类和StringBuilder类独有方法: 
  
    1、reverse():字符串反转 
  
    2、delete(); 
  
    3、insert();




请解释String类与两个SB类的区别
    1、String类内容不可变,两个SB内容可变
    2、StringBuffer采用同步处理,线程安全,效率较低;
         StringBuilder采用异步处理,线程不安全,效率较高;
    3、String类的修改操作“+”,JVM底层会将String类变为StringBulider类处理,会去掉用append()方法进行拼接,以减小大量垃圾空间





Object类(!!!)



1、Object类是所有类的默认父类
    使用Object类可以接收所有类的对象(向上转型)
 
2、方法
    toString()取得对象信息
    System.out.println(obj);默认调用对象的toString()方法
    Object类toString()默认返回对象所在类名以及地址信息



    如果子类对输出内容有要求,则需要去重写toString()方法
 
3、对象比较(!!!)



    equals():
        public boolean equals(Object obj);//接收Object对象
   
4、Object类接收数组对象
5、Object类接收接口对象




使用Object类可以接收所有引用数据类型(是方法参数最高统一类型)





包装类(!!!)
基本数据类型无法通过Object类接收,包装类就是将基本数据类型值封装在类中
 



对象型包装类(Object的直接子类):
    Boolean、Character
数值型包装类(Number类的直接子类):
    Byte、Short、Integer、Long、Float、Double
 
装箱:
    将基本数据类型变为包装类的对象,利用包装类提供的构造方法实现装箱处理
拆箱:
    将包装类中包装的基本数据类型取出,利用包装类提供的xxValue()方法



    JDK1.5以后提供自动装箱拆箱功能,使用包装类和使用int一模一样
 



规范:所有相同类型的包装类对象值比较,一律使用equals方法比较
 
对于Integer = ?(自动装箱)[-127,128]之间的赋值,Integer对象会在Integer常量池产生,会复用已存在的对象。
这个区间以外的值,都会在堆上产生,不会复用对象,使用equals方法比较
 
使用int还是Integer?规范:
    所有POJO类必须使用包装类对象;(简单JAVA类)
    所有RPC方法的返回值和参数必须使用包装类;
    所有局部变量使用基本数据类型





String转为基本数据类型(使用包装类提供的 类名.parseXX() 方法)
    String->Number(数值类型)会有转换异常(包含非数字都会有数值转换异常)
    String->对象型包装类不存在转换异常
    Boolean中,非true都为false
   
基本数据类型转为String
    1、"+"
    2、new String(所有数据类型)




2、编程题:
要求:
1).Person类有name,age,salary属性,要求实现至少两个构造方法,并且属性私有,提供对应的getter、setter。
2).覆写toString方法,要求在System.out.println()函数中传递Person对象能打印出三个属性值而不是对象地址。
3).覆写equals方法,要求两个Person类对象的值相同时返回true。


package one;

class Person{
	private String name;
	private int age;
	private double salary;
	
	public Person() {
		super();
	}

	public Person(String name, int age, double salary) {
		super();
		this.name = name;
		this.age = age;
		this.salary = salary;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", salary=" + salary + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		long temp;
		temp = Double.doubleToLongBits(salary);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (Double.doubleToLongBits(salary) != Double.doubleToLongBits(other.salary))
			return false;
		return true;
	}
}
public class Test1 {

	public static void main(String[] args) {
		Person person = new Person("zhang", 20, 10000);
		Person person1 = new Person("zhang", 20, 10000);
		System.out.println(person);
		System.out.println(person1);
		System.out.println(person.equals(person1));
	}
}




java 的三大板块 java的三大类_equals( )


3、说出下列程序的执行结果,并说明原因:


Integer a = 55; 
Integer b = 55; 
System.out.println(a==b); 
System.out.println(a==new Integer(55)); 
System.out.println(a.equals(new Integer(55))); 
Integer c = 129; 
Integer d = 129; 
System.out.println(c==d);


执行结果:


当数值在[-127,128]之间, Integer对象会在Integer常量池产生,会复用已存在的对象。


a==new Integer(55):false,"=="比较的是地址



a.equals(new Integer(55)):true,Integer a在赋值时会自动装箱


都会在堆上产生,不会复用对象




4 、写出懒汉式单例模式 


package one;

//懒汉式单例
class Singleton{
	private static Singleton singleton;
	
	private Singleton() {};
	
	public static Singleton getInstance() {
		if(singleton == null) {
			singleton = new Singleton();
		}
		return singleton;
	}
}

public class Test3 {
	public static void main(String[] args) {
		Singleton singleton = Singleton.getInstance();
		Singleton singleton1 = Singleton.getInstance();
		Singleton singleton2 = Singleton.getInstance();
		System.out.println(singleton);
		System.out.println(singleton1);
		System.out.println(singleton2);
	}
}




java 的三大板块 java的三大类_懒汉式单例_02


5、算法)
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。


package one;

public class Test4 {

	public static void main(String[] args) {
		int day = 10;//第10天只剩一个
		System.out.println(getSum(day));
	}
	
	public static int getSum(int day) {
		int n = day;
		int sum = 1;
		while(n > 1) {//最后一天只剩一个
			sum = (sum + 1) * 2;
			n--;
		}
		return sum;
	}
}

测试结果:



java 的三大板块 java的三大类_自动装箱与自动拆箱_03