鉴于异常拓展的日志记录
- log4j.properties(属性文件)
import java.util.Scanner;
import org.apache.log4j.Logger;
public class Log4JDemo {
//创建日志记录对象
private static Logger logger = Logger.getLogger(Log4JDemo.class.getName());
public static void main(String[] args) {
// 记录开始
logger.debug("####日志记录####");
try {
Scanner sc = new Scanner(System.in);
logger.debug("请输入第一个数字:");
System.out.println("第一个数字:");
int i1 = sc.nextInt();
logger.debug("第一个数字为"+i1);
System.out.println("第二个数字:");
logger.debug("请输入第二个数字:");
int i2 = sc.nextInt();
logger.debug("第二个数字为"+i2);
logger.debug("开始计算:");
int i3 = i1 / i2;
logger.debug(i1+"/"+i2+"="+i3);
System.out.println(i3);
} catch (Exception e) {
e.printStackTrace();
}
logger.debug("程序结束!");
}
}
jbit.log
配置日志信息输出目的地(appender)
log4j.appender.appenderName = className
appenderName 自定义,在log4j.rootLogger中使用。
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
配置日志信息的输出格式(Layout)
log4j.appender.appenderName.layout = className
className可设置如下
- org.apache.log4j.HTMLLayout (以HTML表格形式布局)
- org.apache.log4j.PatternLayout(可以灵活的指定布局模式)
- org.apache.log4j.SimpLayout (包含日志信息的级别和信息字符串)
- org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息)
集合入门
以前能储存大量相同数据的容器只有数组,但是数组存在一个弊端,必须指定数组的容器,而且容量无法改变。因此学习ArrayList。
- Enumeration (枚举:对集合迭代器接口)
- vector (向量)
- Stack (栈)
- Hash table(哈希值)
- Dictionary (字典)
- Properties(属性表)
从jdk1.2开始java中新增集合API,形成两种集合的解决方案: - 单列模式 ----> 顶层接口: Collection
- 双列模式 ----> 顶层接口:Map
ArrayList适合做查询不适合做修改(查快改慢)
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListDemo2 {
public static void main(String[] args) {
List list = new ArrayList<>();
添加.add参数Object类型
list.add(new String("hello"));
list.add(true);
list.add(123);
list.add('h');
//向指定的位置插入元素
list.add(1, "word");
System.out.println("集合中是否包含指定元素"+list.contains("hello"));
//替换指定位置的元素
list.set(1, "softeem");
//截取一个子集合(前包后不包)
list = list.subList(2, 5);//2,3,4
//将集合转换成数组对象
Object[] objs = list.toArray();
System.out.println(objs.length);
//清空集合
list.clear();
//判断集合是否为空
System.out.println("集合是否为空"+list.isEmpty());
}
}
LinkedList
LinkedList是基于双向链表的实现,在元素进行增删操作时,只需要修改链表的首尾指针即可轻松实现。(改快差慢)
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add("rose");
list.add("jack");
list.add("bob");
list.add("tom");
list.add("jarry");
list.add("bob");
list.add(null);
//这里的数值不是索引,表示的链表需要进行节点搜索的次数
System.out.println(list.get(0));
for (Object obj : list) {
System.out.println("--->"+obj);
}
System.out.println(list.size());
//向集合头部插入元素
list.addFirst("123");
//尾部插入元素
list.addLast("456");
System.out.println(list.getFirst()+"获取头部元素");
System.out.println(list.getLast()+"获取尾部元素");
//从头部弹出元素(将元素从集合中删除)
System.out.println(list.pop());
for (Object object : list) {
System.out.print(object+" ");
}
System.out.println();
//向集合中加入元素(等同于addFirst头部插入元素)
list.push("123");
/*
* ArrayList虽然表面没有重写Object的toString()方法,
* 但是Arraylist继承了AbstractList继承了AbstractCollection中重写了toString()方法。
*/
System.out.println(list);
}
}
Vector
Vectors的存在是基于动态数组(数组+数组拷贝)的集合实现,Vector是一个线程安全的集合实现(关键方法上都使用了synchronized修饰)。Vector在容量扩充时,增长为原理的2倍(ArrayList 是1.5倍);jdk1.2后Vector被改造为从List集合实现,因此Vector,ArrayList,LinkedList都是源自于List接口。
- Vectors是老式的集合类,内部基于动态数组实现,容量扩充为原来的2倍,Vector是线程安全的实现。
- ArrayList是JDK1.2之后新增的List集合的实现,内部也是基于动态数组实现,容量扩展为原来的1.5倍,ArrayList是线程不安全的实现(效率高),数据查询较快,修改较慢。
- LinkedList是JDK1.2后新增的List集合的实现,内部是基于双向链表实现,也是线程不安全的实现,在进行数据修改方面比较快,数据查询较慢。
Iterator(迭代器)
iterator接口对集合进行快速遍历的接口,内部实现通常是由集合是类自身通过内部类的形式来完成。
Iterator it = list.iterator();
while(it.hasNext()) {
Object s = it.next();
System.out.print(s+" ");
}
ListIterator
ListIterator从Iterator实现而来,在Iterator的基础上扩充了一些方法
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class List2 {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("helloword");
list.add("jack");
list.add("rose");
list.add("lily");
list.add("lucy");
//获取当前集合的列表迭代器(可以方向迭代,添加,替换元素)
ListIterator it = list.listIterator();
while(it.hasNext()) {
System.out.println(it.next());
}
it.add("kebo");
System.out.println("=============");
//反向取出集合元素
while(it.hasPrevious()) {
System.out.println(it.previous());
}
}
}