mianshizhubei

来源:互联网 发布:软件开发财务报表 编辑:程序博客网 时间:2024/06/06 07:39
list与Set、Map区别及适用场景


1、List,Set都是继承自Collection接口,Map则不是


2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。) 


3.Set和List对比: 
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。 
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。 


4.Map适合储存键值对的数据


5.线程安全集合类与非线程安全集合类 
LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。


String和StringBuilder、StringBuffer的区别?
答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,
它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。
而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,
区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。


20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,
不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。




27、阐述静态变量和实例变量的区别。
答:静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,
一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,
需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。


28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。
















ArrayList与LinkedList的区别和适用场景


Arraylist:
优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。   
LinkedList:
优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地
对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景
缺点:因为LinkedList要移动指针,所以查询操作性能比较低。
适用场景分析:
 当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList。










饿汉式和懒汉式区别
从名字上来说,饿汉和懒汉,
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,
而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。
另外从以下两点再区分以下这两种方式:


1、线程安全:
饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,
懒汉式本身是非线程安全的,为了实现线程安全有几种写法,分别是上面的1、2、3,这三种实现在资源加载和性能方面有些区别。




2、资源加载和性能:
饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成,
而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。
至于1、2、3这三种实现又有些区别,
第1种,在方法调用上加了同步,虽然线程安全了,但是每次都要同步,会影响性能,毕竟99%的情况下是不需要同步的,
第2种,在getInstance中做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,同时避免了每次都同步的性能损耗
第3种,利用了classloader的机制来保证初始化instance时只有一个线程,所以也是线程安全的,同时没有性能损耗,所以一般我倾向于使用这一种。


什么是线程安全?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作,或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题,那就是线程安全的




九大内置对象


request           请求对象             类型 javax.servlet.ServletRequest        作用域 Request
response          响应对象              类型 javax.servlet.SrvletResponse        作用域 Page
pageContext       页面上下文对象        类型 javax.servlet.jsp.PageContext       作用域 Page
session           会话对象              类型 javax.servlet.http.HttpSession      作用域 Session
application       应用程序对象          类型 javax.servlet.ServletContext        作用域 Application
out               输出对象              类型 javax.servlet.jsp.JspWriter         作用域 Page
config            配置对象              类型 javax.servlet.ServletConfig         作用域 Page
page              页面对象              类型 javax.lang.Object                   作用域 Page
exception         例外对象              类型 javax.lang.Throwable                作用域 page
“exception” 对象则代表了JSP文件运行时所产生的例外对象,此对象不能在一般JSP文件中直接使用,而只能在使用了“<%@ page isErrorPage="true "%>”的JSP文件中使用。




何为作用域
  先让我们看看效果:
  大概流程是这样的,我们访问index.jsp的时候,分别对pageContext, request, session,application四个作用域中的变量进行累加。(当然先判断这个变量是不是存在,如果变量不存在,则要把变量初始化成1)。计算完成后就从index.jsp执行forward跳转到test.jsp。在test.jsp里再进行一次累加,然后显示出这四个整数来。
  从显示的结果来看,我们可以直观的得出结论:
  page里的变量没法从index.jsp传递到test.jsp。只要页面跳转了,它们就不见了。
  request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。
  session和application里的变量一直在累加,开始还看不出区别,只要关闭浏览器,再次重启浏览器访问这页,session里的变量就重新计算了。
    application里的变量一直在累加,除非你重启tomcat,否则它会一直变大。
作用域规定的是变量的有效期限
  如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。
  从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量。
  如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。
  所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。
  如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。
  所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。
  如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。
  整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。
  application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。
  与上述三个不同的是,application里的变量可以被所有用户共用。如果用户甲的操作修改了application中的变量,用户乙访问时得到的是修改后的值。这在其他scope中都是不会发生的,page, request,session都是完全隔离的,无论如何修改都不会影响其他人的数据。












public static void main(String[] args) {
12         //声明Connection对象
13         Connection con;
14         //驱动程序名
15         String driver = "com.mysql.jdbc.Driver";
16         //URL指向要访问的数据库名mydata
17         String url = "jdbc:mysql://localhost:3306/sqltestdb";
18         //MySQL配置时的用户名
19         String user = "root";
20         //MySQL配置时的密码
21         String password = "123456";
22         //遍历查询结果集
23         try {
24             //加载驱动程序
25             Class.forName(driver);
26             //1.getConnection()方法,连接MySQL数据库!!
27             con = DriverManager.getConnection(url,user,password);
28             if(!con.isClosed())
29                 System.out.println("Succeeded connecting to the Database!");
30             //2.创建statement类对象,用来执行SQL语句!!
31             Statement statement = con.createStatement();
32             //要执行的SQL语句
33             String sql = "select * from emp";
34             //3.ResultSet类,用来存放获取的结果集!!
35             ResultSet rs = statement.executeQuery(sql);
36             System.out.println("-----------------");
37             System.out.println("执行结果如下所示:");  
38             System.out.println("-----------------");  
39             System.out.println("姓名" + "\t" + "职称");  
40             System.out.println("-----------------");  
41              
42             String job = null;
43             String id = null;
44             while(rs.next()){
45                 //获取stuname这列数据
46                 job = rs.getString("job");
47                 //获取stuid这列数据
48                 id = rs.getString("ename");
49 
50                 //输出结果
51                 System.out.println(id + "\t" + job);
52             }
53             rs.close();
54             con.close();
55         } catch(ClassNotFoundException e) {   
56             //数据库驱动类异常处理
57             System.out.println("Sorry,can`t find the Driver!");   
58             e.printStackTrace();   
59             } catch(SQLException e) {
60             //数据库连接失败异常处理
61             e.printStackTrace();  
62             }catch (Exception e) {
63             // TODO: handle exception
64             e.printStackTrace();
65         }finally{
66             System.out.println("数据库数据成功获取!!");
67         }
68     }
69