java小知识

1.java获取前端的IP等信息:网络协议:request.getScheme();网络ip:request.getServerName();端口号:request.getServerPort()

2.文件流和普通的数据类型是不能同时传递的,因为文件流是异步上传的;数据类型少的情况下直接将数据放到action的url接口中传递,这样能做到同时上传少量数据和文件流

3.关于java.io.FileNotFoundException异常:在构造一个File对象时,指定的文件路径是什么都可以,就算不存在也能够构造File对象,但是,现在你要对文件进行输入输出操作,也就是InputStream和OutputStream操作时,如果填写的路径不存在,那么就会报系统找不到指定路径,如果指定的是目录时,就会报拒绝访问异常。FileOutputStream读取流的时候如果是文件夹,就会出错,无论怎么读,都拒绝访问

4.想用相对路径时,但是当我将images这个文件夹与我的.class文件(即要执行的webservice)放在同一个目录里时,发现运行失败了,提示找不到这个文件夹。打印了一下当前目录结果是tomcat的bin目录,而并不是tomcat里所部属的webservice目录。所以当作为webservice部署到tomcat里时,若想使用当前目录,最好先使用System.out.println(newFile(".").getAbsolutePath());查看一下当前目录是什么,因为他不一定是你的.class文件存放的目录,通常是tomcat的bin目录,所以需要根据这个目录重新指定你想要到达的目录。

5.mkdir()创建此抽象路径名指定的目录,只会建立一级的文件夹;mkdirs()创建此抽象路径名指定的目录,包括创建必需但不存在的父目录,可以建立多级文件夹。文件上传到目的地创建路径时还是用mkdir()为好,因为mkdirs()会创建不存在的父目录

6.03年和03年之前版本的EXCEL后缀为xls,用HSSFWorkbook操作;03年之后的用XSSFWorkbook操作

7.重载就是创建另一个有相同名字但参数不同的方法

8.String,StringBuilder和StringBuffer的区别:

    (1)String在字符串不经常发生变化的业务场景优先使用(代码更清晰简洁),如常量的命名,少量字符串的 操作

    (2)StringBuilder在单线程情况下,如有大量的字符串操作,应使用此类,以此来避免产生大量无用的中间对    象,耗费空间且执行效率低下(新建对象,回收对象会花费大量时间),如json的封装

    (3)StringBuffer在多线程,如有大量的字符串操作,如HTTP参数解析和封装

9.HashMap的方法:hashMap是基于Map的实现,并且允许null value和null key,它不保证存储的数据的顺序。特别要注意的是hashMap不是同步的,要实现同步除了在外部实现同步外,还可以通过Map m = Collections.synchronizedMap(new HashMap())或者使用ConcurrentHashMap类。

HashMap map = new HashMap<>();

HashMap map2 = new HashMap<>();

存值:map.put("demo",1)    取值:map.get("demo")

判断是否为空:map.isEmpty()

判断是否含有key:map.containsKey("demo")    判断是否含有value:map.containsValue(1)

删除key下的value:map.remove("demo")    删除key->value对:map.remove("demo",1)

显示所有的key:map.keySet()    显示所有的key->value:map.entrySet()

所有的values值:map.values()    元素个数:map.size()

添加另一个同一类型的map下的所有值:map.puAll(map2),使用时不能用表达式赋值,而是变量赋值给变量

替换key下的value:map.replace("demo",2)    清空:map.clear()

当前map不存在键key或者该key关联的值为null,则执行put(key,value);否则不变:map.putIfAbsent()

参数为key和逼函数(箭头函数),作用是把箭头函数返回的值赋给key:map.compute("demo",(k,v) -> 表达式?a:b ),举例如下:

        map.compute(8, ((k,v) -> (v == null)? "hiu" : v.concat("hahahaha")));

        System.out.println(map.get(8));

        map.compute(8, ((k,v) -> (v == null)? "hiu" : v.concat("hahahaha")));

        System.out.println(map.get(8));

HashMap遍历方法:

Iterator iter = map.entrySet().iterator();   

while (iter.hasNext()) {   

    Map.Entry entry = (Map.Entry) iter.next();   

    Object key = entry.getKey();   

    Object val = entry.getValue();   

意思就是当Map集合中有这个key时,就使用这个key值,如果没有就使用默认值defaultValue:map.getOrDefault(Object key,String defaultValue)

10.>>和>>>是位移运算符,其中>>为带符号的位移,>>>为不带符号的位移。左移运算符是增大一个数,右移是减小。正数不管是>>还是>>>操作,这两者操作的结果一样。-2在二进制中为10000~00010(32位),进行>>>移位时,先移位成10000~000001(32位),再将移位后的位置前的取相反。则为011111~1111(32位),即int最大值

11.java中 静态方法不可以直接调用非静态方法和成员,也不能使用this关键字(这就是这个问题的原因,我用静态的main方法调用了非静态的的get方法)。

原因解释:类中静态的方法或者属性,本质上来讲并不是该类的成员,在java虚拟机装在类的时候,这些静态的东西已经有了对象,它只是在这个类中”寄居”,不需要通过类的构造器(构造函数)类实现实例化;而非静态的属性或者方法,在类的装载是并没有存在,需在执行了该类的构造函数后才可依赖该类的实例对象存在。所以在静态方法中调用非静态方法时,编译器会报错(Cannot make a static reference to the non-static method func() from the type A)。

12.Java中实现多态的机制为“父类或接口中的引用变量指向的是具体实例对象的方法,而不是引用变量自身这个类中定义的方法”。

你可能感兴趣的:(java小知识)