3、java常用工具类

 
常用工具类

1 错误处理: 
1.1 自定义异常
public class CustomException extends Exception{
	public CustomException(){
		//无参,有时会用到
	}	
	public CustomException(String message){
		super(message);
	}
}

1.2 捕获异常转换成另外一种异常抛出
package com.lxj;
import com.lxj.Test;

public class HelloWorld {
	private int cc = 99;

	public static void main(String[] args){
		try{
			HelloWorld h = new HelloWorld();
			h.test2();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			System.out.println("结束了")
		}
	}
	
	public void test1() throws Exception{
		throw new Exception("牛逼");
	}
	
	public  void test2() throws Exception{
		try{
			this.test1();
		}catch(Exception e){
			//RuntimeException r = new RuntimeException(e);  //不转换异常类型,不改变里面的异常提示
			
			RuntimeException r = new RuntimeException("runtime 异常"); //转换异常类型,改变里面异常信息
			r.initCause(e);
			throw r;
		}
	}
}
	
2 java中的字符串
2.1 比较字符串值是否相等要用equals,==比较的是内存地址
2.2 java中String new和直接赋值的区别:
	new,会在java的堆内存中创建对象, 有几个new就有几个对象。直接赋值, 是从字符串常量池中取值。
	例如 String str1 = "a"; String str2 = "a"; System.out.println(str1==str2);结果为true,地址值都是字符串长量池中的"a".
	String str3 = new String("a");String str4 = new String("a");System.out.println(str3==str4);结果为false. 应为new会在堆中创建两个字符串对象, 地址值不同
2.3 常用方法:
	int length() : 返回当前字符串长度
	int indexOf(int ch) :查找ch字符在该字符串中第一次出现的位置
	int indexOf(String str):查找str字符串在该字符串中第一次出现的位置
	int lastIndexOf(int ch):查找ch字符在该字符串中最后一次出现的位置
	int lastIndexOf(Sting str):查找str字符串在该字符串最后一次出现的位置
	String substring(int beginIndex) :获取从beginIndex位置开始到结束的子字符串 【注】:包含beginIndex位置字符
	String substring(int beginIndex,int endIndex) :获取从beginIndex位置开始到endIndex位置结束的子字符串  【注】:包含beginIndex位置字符,不包含endIndex位置字符
	String trim() :去除字符串前后空格
	boolean equals(Object obj) : 将字符串与指定对象比较
	String toLowerCase():将字符串全转为小写
	String toUpperCase():将字符串全转为大写
	char  charAt(int index) :获取字符串中指定位置的字符
	String[] split(String regex,int limit) :将字符串分割为子字符串,返回字符串数组
	byte[] getBytes():将字符串转为byte数组
	byte例子:
		String str = "haha niubi";
		byte[] b = str.getBytes();
		for(int i=0;i<b.length;i++){
			System.out.print(b[i]+" ");
		}  
		//104 97 104 97 32 110 105 117 98 105 

2.3 StringBuffer、StringBuilder(StringBuilder实现了线程安全性能更高):
	2.3.1 相对于普通定义字符串,如果定义一个字符串在重新使其改变值,普通定义的字符串会另开辟空间,而这两个类会直接修改元内存地址值,不需要另开辟空间
	2.3.2 定义StringBuilder类:
		StringBuilder str1 = new StringBuilder();
		StringBuilder str2 = new StringBuilder("哈哈哈");
		System.out.println(str2); //哈哈哈
	2.3.3 StringBuilder类常用的方法:
		StringBuilder append():当前字符串后拼接
		StringBuilder insert(位置,内容):将要插入的字符串插入指定位置
		String toString():转为字符串
		int length() :获取字符串长度
			
			
3 java中的包装类 :基本数据类型(byteshortintlongfloatdoublechar、blean)不具备对象类型,比如不能调用方法,为了让他们能调用java提供了包装类
【注】:在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更加轻松便利了。
以int为例子:
3.1 装箱:把基本类型转换成包装类,使其具有对象的性质,又可分为手动装箱和自动装箱 
	如:int i =10;
		Integer x = new Integer(i); //手动装箱
		Integer y = i ; //自动装箱
		int z = i + x ;// 20 将基本数据类型与对象计算
		
3.2 拆箱:和装箱相反,把包装类对象转换成基本类型的值,又可分为手动拆箱和自动拆箱
		Integer j = new Integer(8);//定义一个Integer包装类对象,值为8
		int m = j.intValue();//手动拆箱为int类型
		int n = j;//自动拆箱为int类型



4 java中基本数据类型与字符串相互转换:
4.1 基本数据类型转换为字符串:
		int a = 2; 
	4.1.1 toString :
		String str1 = Integer.toString(a);
	4.1.2 valueOf:
		String str1 = String.valueOf(a);
	4.1.3 用一个空字符串加上基本数据类型,得到的就是基本类型数据对应的字符串:
	String str3 = a + "";

4.2 字符串转换为基本数据类型:
	String str = "9";
	4.2.1 :调用包装类的parseXxx静态方法
		int d = Integer.parseInt(str);
	4.2.2 : 调用包装类的valueOf方法转换为基本类型的包装类,会自动拆箱
		int e = Integer.ValueOf(str);


5 Date与SimpleDateFormat、Calendar类表示时间:
5.1 Date:java.util.Date ,最主要用来获取当前时间
	Date d = new Date();
	System.out.println(d);
5.2 SimpleDateFormat:java.text.SimpleDateFormat,用来格式化时间
	5.2.1 format:将日期转化为指定文本格式显示
		Date d = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String today = sdf.format(d);
	5.2.2 parse:将文本转换为日期
		String day = "2017年08月11日 11点21分00秒";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
		Date date = sdf.parse(day);

5.3 Calendar:java.util.Calendar ,Date设计缺陷,不建议使用Date,建议使用Carlendar代替Date,Carlendar是个抽象类,通过调用内部getInstance获取Calendar对象
		Calendar c = Calendar.getInstance();
		int year = c.get(Calendar.YEAR);
		int month = c.get(Calendar.MONTH) + 1; //0代表1月
		int day = c.get(Calendar.DAY_OF_MONTH);
		int hour = c.get(Calendar.HOUR_OF_DAY);
		int minute = c.get(Calendar.MINUTE);
		int second = c.get(Calendar.SECOND);
		System.out.println(year + "-" +month + "-" +day + " " +hour + ":" +minute + ":" +second);  //2017-8-11 11:43:42
			

6 Math :用来计算的类
6.1 常用方法:
	long round():四舍五入取整
	double floor():去尾法取整
	double ceil():进一取整
	double random():随机数0~1  例:产生[0,99)(包含0不包含99)之间的随机整数 :(int)(Math.random() * 99)
	
		
7 集合(Collection、Map):
7.1 Collection:
	7.1.1 : List(序列) :有序的,可以重复的
		实现类
		7.1.1.1 :ArrayList(数组序列)
		7.1.1.2 :LinkedList(链表)
	7.1.2 : Queue(队列) :有序的,可以重复的
		实现类
		7.1.2.1 :LinkedList(链表)
	7.1.3 : Set(集):无序的,不可重复的
		实现类
		7.1.3.1 :Hashset
7.2 Map:
	实现类
	7.2.1 HashMap


7.3 Collection下的List之ArrayList
	7.3.1 add:
		Course cr1 = new Course("1","数据结构");
		//添加到序列
		this.coursesToSelect.add(cr1); 
		//从序列中取出
		Course temp = (Course) this.coursesToSelect.get(0); //对象存入集合(collection、map)都变成了object类型,取出来时候要类型转换,向下转型
		System.out.println(temp.id + "_" +temp.name); //1_数据结构

		Course cr2 = new Course("2","C语言");
		this.coursesToSelect.add(0,cr2); //在list最开始添加数据
		Course temp2 = (Course) this.coursesToSelect.get(0); 
		System.out.println(temp2.id + "_" +temp2.name); //1_数据结构
		
		//如果现在list中有2个元素,这时候只能像第3个元素插入,如果想5、6。。插入,就会数组越界
		Course cr3 = new Course("3","N语言");
		this.coursesToSelect.add(4,cr3); //list数据添加不允许中间隔开,要紧挨着,这样会报越界
		
	7.3.2 addAll:
		//addAll 将对象批量添加到list
		Course[] course = {new Course("4","离散数学"),new Course("5","汇编语言")};
		this.coursesToSelect.addAll(Arrays.asList(course));

		Course[] course2 = {new Course("5","语文"),new Course("6","数学")};
		this.coursesToSelect.addAll(2,Arrays.asList(course)); //"5语文"在list的第2个位置,"6数学"在list第3个位置

	7.3.3 site():获取list长度
	7.3.4 get():从list中获取单个数据
		7.3.4.1 普通遍历for
			ListTest lt = new ListTest();
			lt.testAdd(); //批量添加课程
			List courseList = lt.coursesToSelect;
			for(int i = 0 ;i<courseList.size();i++){
				Course course = (Course)courseList.get(i);
				System.out.println(course.id+" "+course.name);
			}
		7.3.4.2 迭代器iterator:
			ListTest lt = new ListTest();
			lt.testAdd();
			Iterator iter = lt.coursesToSelect.iterator();
			while(iter.hasNext()){
				Course course = (Course)iter.next();
				System.out.println(course.id + " "+course.name);
			}
			
		7.3.4.3 用foreach
			ListTest lt = new ListTest();
			lt.testAdd();
			for(Object object :lt.coursesToSelect){
				Course course = (Course)object;
				System.out.println(course.id + " " + course.name);
			}
			
	7.3.5 set修改list中某个位置的对象
		ListTest lt = new ListTest();
		List l = lt.coursesToSelect;
		l.set(3,new Course("8","跑步"))
		
	7.3.6 remove 删除list中单个对象	
		ListTest lt = new ListTest();
		lt.testAdd();//添加了4个课程
		Course course = (Course)lt.coursesToSelect.get(2);
		lt.coursesToSelect.remove(course); //删除一个课程
		for(Object obj :lt.coursesToSelect){
			Course cou = (Course)obj;
			System.out.println(cou.id + " "+cou.name); //纸打印3个
		}
	7.3.7 removeAll 批量删除list中对象
		ListTest lt = new ListTest();
		lt.testAdd();//添加了4个课程
		Course courses[] = {(Course)lt.coursesToSelect.get(0),(Course)lt.coursesToSelect.get(2)};
		lt.coursesToSelect.removeAll(Arrays.asList(courses)); //删除两个课程
	
7.4 泛型 :通过泛型限制向集合中添加的数据类型(比如list是添加课程对象的,加入字符串或者其他对象等都会在编译的时候报错),取出来直接用就行了,再也不需要再取出来去类型转换
		7.4.1 定义:
			public List<Course>  courses;  //<>即为泛型,此list只能添加course对象,添加其他就报错
		7.4.2 取出来不需要转换(以foreach为例):
				ListTest lt = new ListTest();
				lt.testAdd();
				for(Course course :lt.coursesToSelect){
					System.out.println(course.id + " " + course.name);
				}

		7.4.3 泛型集合(connection、map)中不仅可以存放泛型类型对象,也可以存放泛型类型的子类对象:
			如 List<Course> 的List不仅可以存Course的对象,也可以存Course子类对象
		7.4.4 泛型不能使用基本数据类型,必须用包装类替换基本数据类型:
			【错误】:List<int> list = new ArrayList<int>();
			【正确】:List<Integer> list = new ArrayList<Integer>();
			
7.5 set集:无序不可重复
		7.5.1 与list一样存在 add()、addAll()、size()、remove()、removeAll()方法
		7.5.2 与list不一样的是不存在set()、get()修改元素获取元素,因为set是无序的,无法知道在哪个位置是哪个元素
		7.5.3 set只能通过循环或者迭代获取内容,不能通过get获取
		7.5.4 set可以添加null,但是一般对业务没有实际用途


7.6 map:key-value 映射关系
		put(key,value):
		remove(key):
		
		put、ketSet(返回所有键的集合)、remove、entrySet(返回map中所有键值对的集合)例子:
		public class MapTest {

			public Map<String,Student> students;
			public MapTest(){
				this.students = new HashMap<String,Student>();
			}
			/**
			 * map put(添加)
			 */
			public void testPut(){
				Scanner console = new Scanner(System.in);
				int i = 0;
				while(i<3){
					System.out.println("请输入学生id:");
					String ID = console.next();
					Student st = this.students.get(ID);
					if(st == null){
						System.out.println("请输入姓名");
						String Name = console.next();
						Student newst = new Student(ID,Name);
						this.students.put(ID, newst);
						System.out.println("成功添加用户用户:"+Name);
						i++;
					}else{
						System.out.println("该用户已存在");
						continue;
					}
				}
			}
			
			/**
			 * map ketSet
			 */
			public void testKeySet(){
				//通过keyset方法,返回map中所有“键”的set集合
				Set<String> ketSet = this.students.keySet();
				//便利set获取到每一个“键”,在调用map的get方法传入键值,就可以获取到map中该“键”对应的value
				System.out.println("总共有:"+this.students.size()+"个学生");
				for(String ID : ketSet){
					Student student = this.students.get(ID);
					if(student != null){
						System.out.println("学生:"+student.name);
					}
				}
			}
			
			/**
			 * map remove
			 */
			public void testRemove(){
				Scanner console = new Scanner(System.in);
				while(true){
					System.out.println("请输入要删除学生的ID");
					String ID = console.next();
					Student st = this.students.get(ID);
					if(st == null){
						System.out.println("ID不存在");
						continue;
					}else{
						this.students.remove(ID);
						System.out.println("删除成功:"+ st.name);
						break;
					}
				}
			}
			
			/**
			 * map entrySet
			 */
			public void testEntrySet(){
				//通过keyset方法,返回map中所有“键”的set集合
				Set<Entry<String,Student>> entrySet = this.students.entrySet();
				for(Entry<String,Student> entry : entrySet){
					System.out.println("取得键:"+entry.getKey());
					System.out.println("取得对应的值:"+entry.getValue().name);
				}
			}
			
			
			/**
			 * map put(修改)
			 */
			public void testModify(){
				Scanner console = new Scanner(System.in);
				while(true){
					System.out.println("请输入要修改姓名学生的ID");
					String ID = console.next();
					Student st = this.students.get(ID);
					if(st == null){
						System.out.println("ID不存在");
						continue;
					}

					System.out.println("当前学生姓名为:"+ st.name + "请输入新的姓名");
					String NEWNAME = console.next();
					Student newst = new Student(ID,NEWNAME);
					this.students.put(ID, newst);
					System.out.println("修改成功");
					break;
				}
			}
		}
		
		主类:
		public static void main(String[] args){

			MapTest mt = new MapTest();
			
			//add
			mt.testPut();
			mt.testKeySet();
			
			//remove
	//		mt.testRemove();
	//		mt.testEntrySet();
			
			//update
			mt.testModify();
			mt.testEntrySet();
		}
		
7.7 contains、containsAll(与addAll、removeAll用法一样):SET、LIST是否包含某个对象
	7.7.1 :LIST中是否包含某个对象
		7.7.1.1 :判断对象是否存在SET、LIST
			/**
			 * 测试List contains方法
			 */
			public void testListContains(){
				Course course = this.coursesToSelect.get(0);
				System.out.println("取得课程:"+course.name);
				System.out.println("备选课程中是否包含课程::"+course.name+","+this.coursesToSelect.contains(course)); //True
			}
	
		7.7.1.2 :判断对象中某个属性是否一样从而判断对象是否相等,重写equals方法 ,实际上contains也是一个个去比较equals方法
			如:Course中有id、name,默认是id,name都相同才认为相同,但是现在我想只要课程name相同就算存在,那equals重写如下,排除id比较:
			public class Course {
				public String id;
				public String name;
				public Course(String id,String name){
					this.id = id;
					this.name = name;
				}
				@Override
				public boolean equals(Object obj) {
					if (this == obj)
						return true;
					if (obj == null)
						return false;
					if (getClass() != obj.getClass())
						return false;
					Course other = (Course) obj;
					if (name == null) {
						if (other.name != null)
							return false;
					} else if (!name.equals(other.name))
						return false;
					return true;
				}
			}
			//调用
			public class SetTest {
				public List<Course> coursesToSelect;
				
				public SetTest(){
					this.coursesToSelect = new ArrayList();
				}
				public void testListContains(){
					Course[] course = {new Course("3","离散数学"),new Course("4","汇编语言")};
					this.coursesToSelect.addAll(Arrays.asList(course));
					
					Course course =new Course("4","离散数学");
					System.out.println("备选课程中是否包含课程::"+course.name+","+this.coursesToSelect.contains(course)); //true
				}
			}
	
	7.7.2 :SET中是否包含某个对象
		7.7.2.1 SET写法与LIST相同,当你输入一个SET中存在的一个name时候,会返回false,由于Set是通过HashSet实例化的,HashSet会执行hashcode方法,
		SET在调用contains时候,不止回去对比equals,在调用equals对比之前,先去调了hashcode,所以这里不仅用重写equals,也要重写hashcode
			重写代码如下:
			@Override
			public int hashCode() {
				final int prime = 31;
				int result = 1;
				result = prime * result + ((name == null) ? 0 : name.hashCode());
				return result;
			}
			@Override
			public boolean equals(Object obj) {
				if (this == obj)
					return true;
				if (obj == null)
					return false;
				if (getClass() != obj.getClass())
					return false;
				Course other = (Course) obj;
				if (name == null) {
					if (other.name != null)
						return false;
				} else if (!name.equals(other.name))
					return false;
				return true;
			}

			//我们只对比name属性,重写了hashcode与equals之后,通过SET在去调用contains对比,如果name存在就不会再返回false了,具体代码参考LIST中,只需要把LIST换成SET
			
			

7.7 indexOf:返回对象在LIST中的第一次出现的索引位置,原理跟contains差不多,也是循环比较每个对象中的equals方法,如果为true返回第一次出现的索引位置
		list.indexOf(obj)
	lasatIndexOf:	返回对象在LIST中的最后一次出现的索引位置
		list.lasatIndexOf(obj)
	【注意】:如果都没找到,返回-1 ,其实用法跟字符串的indexOf、lastIndexOf一样
	
	
7.8 map中是否包含key、value:
		7.8.1 map.containsKey(key) // 判断key是否存在于map的key中
		7.8.2 map.contaimsValue(param) //判断param是否存在于map的value中,contaimsValue与LIST、SET一样,如果param是对象,就会去调用里面的equals对比,所以重写equals
	
7.9 Comparable、Comparator		
	7.10.1 Comparable接口:可比较的,实现该接口的类的实例可以比较大小,可以进行自然排序,定义了默认比较规则,其实现类需实现compareTo方法,
	compareTo返回正数表示大,负数表示小,0表示相等
	7.10.2 Comparator接口:比较工具接口,用于定义临时比较规则,而不是默认比较规则,其实现类必须实现compare方法,Comparable与Comparator都是Java集合框架的成员。
	
	
	【注】:所有java集合包含:Collection接口、Map接口、Collections工具类、Comparable接口、Comparator接口
	
	
7.10 sort(Collections下的方法):给LIST排序
	7.10.1 给数字、字符串排序:
		public class CollectionsTest {
			public void testSort1(){
				List<Integer> integerList = new ArrayList<Integer>();
				Random random = new Random();
				Integer k;
				for(int i=0;i<10;i++){
					do{
						k = random.nextInt(100); //生成100以内的随机数
					}while(integerList.contains(k));
					integerList.add(k);
					System.out.println("成功添加整数:"+k);
				}
				
				System.out.println("排序前");
				for(Integer inte : integerList){
					System.out.println("元素:"+inte);
				}
				//排序
				Collections.sort(integerList);
				System.out.println("排序后");
				for(Integer inte : integerList){
					System.out.println("元素:"+inte);
				}
			}
			
			public static void main(String[] args){
				CollectionsTest c =new CollectionsTest();
				c.testSort1();
			}
		}
	7.10.2 给对象排序:想要使用这个sort排序的对象,它的类必须要实现comparable接口或者comparator接口:
		7.10.2.1 :实现comparable
			public class Student implements Comparable<Student>{

				public String id;
				public String name;
				public Set<Course> courses;
				
				public Student(String id,String name){
					this.id = id;
					this.name = name;
					this.courses = new HashSet<Course>();
				}

				@Override //必须要实现
				public int compareTo(Student o) {
					// TODO Auto-generated method stub
					return this.id.compareTo(o.id); //只比较id大小
				}
			}
			
			//主类调用
				public void testSort1(){
					List<Student> strList = new ArrayList<Student>();
					Random  r = new Random();
					Student s1 = new Student(String.valueOf(r.nextInt(1000)),"ming");
					Student s2 = new Student(String.valueOf(r.nextInt(1000)),"hong");
					Student s3 = new Student(String.valueOf(r.nextInt(1000)),"xiao");
					Student s4 = new Student(String.valueOf(r.nextInt(1000)),"ha");
					strList.add(s1);
					strList.add(s2);
					strList.add(s3);
					strList.add(s4);
					
					System.out.println("排序前");
					for(Student inte : strList){
						System.out.println(inte.id + " " + inte.name);
					}
					//排序
					Collections.sort(strList);
					System.out.println("排序后");
					for(Student inte : strList){
						System.out.println(inte.id + " " + inte.name);
					}
				}
			【注】:id是字符串,他不会按照数字比较,他会比较第一位数字
			
		7.10.2.2 :实现comparator
		
			Student类:
			public class Student{
				public String id;
				public String name;
				public Set<Course> courses;
				
				public Student(String id,String name){
					this.id = id;
					this.name = name;
					this.courses = new HashSet<Course>();
				}
			}
		
			Comparator定义临时排序类,根据姓名排序
			public class StudentComparator implements Comparator<Student>{

				@Override
				public int compare(Student o1, Student o2) {
					// TODO Auto-generated method stub
					return o1.name.compareTo(o2.name);
				}
			}
			//对比排序
			public void testSort1(){
				List<Student> strList = new ArrayList<Student>();
				Random  r = new Random();
				Student s1 = new Student(String.valueOf(r.nextInt(1000)),"ming");
				Student s2 = new Student(String.valueOf(r.nextInt(1000)),"hong");
				Student s3 = new Student(String.valueOf(r.nextInt(1000)),"xiao");
				Student s4 = new Student(String.valueOf(r.nextInt(1000)),"ha");
				strList.add(s1);
				strList.add(s2);
				strList.add(s3);
				strList.add(s4);
				
				System.out.println("排序前");
				for(Student inte : strList){
					System.out.println(inte.id + " " + inte.name);
				}

				Collections.sort(strList,new StudentComparator());
				System.out.println("排序后");
				for(Student inte : strList){
					System.out.println(inte.id + " " + inte.name);
				}
				
			}
	
	
	
	
	
	
	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值