8.14 学习笔记

1.

静态变量以及被transient修饰的变量属于类的状态,序列化保存的是对象的状态,不能保存上述两种变量。

2.

 网友回答:

泛型只是在 *编译期* 保证对象类型相同的技术。

真正在代码的运行期,jvm会擦出泛型的存在。

所以我们可以利用反射技术为一个已指定泛型的集合添加一个不符合泛型要求的元素,因为反射的生效期在运行期,泛型无法进行拦截。

因此,泛型指定的元素不具有继承的特性。不能将泛型中的派生类类型复制给基类类型。

因此BEF错误。

从而出现了通配符的技术,为了解决在泛型中不能像正常JAVA类中的继承关系。

我个人的理解是通配符的继承就是为了弥补泛型在继承关系上面的缺陷而诞生的。

因此集合可以使用通配符来描述继承关系,但不能直接使用指定泛型来描述。

通配符的方式可以正确的描述带泛型集合的继承关系。

因此CDG正确

3.hashtable和hashmap的区别

hashtable是线程安全的,hashmap不是。hashmap的迭代器iteratorfail-fast机制,如果有其他线程改变了它的该机制就会尽量抛出异常,但是迭代器本身的remove()方法一出元素不会抛出,而hashtable的迭代器enumerator则不会抛出异常。hashtable直接使用对象的hashCode,hashmap重新计算对象的hashCode。hashmap可以允许KV为null,在hashmap中不能用get()判断其是否有某个键(因为该方法返回null时可能表示没有该键或者是有null这个键),所以使用containsKey()判断其中是否有该键。

4.汉诺塔递归实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class HanNuoTa {
    public static void main(String[] args)
    {
        while (true)
        {
            BufferedReader reader = new BufferedReader((new InputStreamReader(System.in)));
            String s = null;
            try {
                s = reader.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }

            int n = Integer.parseInt(s);
            String a = "a";
            String b = "b";
            String c = "c";

            hannuota(n, a, b, c);
        }

    }

    public static void hannuota(int n, String a, String b, String c)
    {
        if (1 == n)
        {
            System.out.println("将编号为" + n + "的盘子" + "从" + a + "柱子移到" + c + "柱子");
        }
        else
        {
            hannuota(n-1, a, c, b);
            System.out.println("将编号为" + n + "的盘子" + "从" + a + "柱子移到" + c + "柱子");
            hannuota(n-1, b, a, c);
        }
    }
}

5.解决乱码的究极工具类

package com.kuang.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

/**

 * 解决get和post请求 全部乱码的过滤器
   */
   public class GenericEncodingFilter implements Filter {

   @Override
   public void destroy() {
   }

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       //处理response的字符编码
       HttpServletResponse myResponse=(HttpServletResponse) response;
       myResponse.setContentType("text/html;charset=UTF-8");

       // 转型为与协议相关对象
       HttpServletRequest httpServletRequest = (HttpServletRequest) request;
       // 对request包装增强
       HttpServletRequest myrequest = new MyRequest(httpServletRequest);
       chain.doFilter(myrequest, response);

   }

   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
   }

}

//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
//是否编码的标记
private boolean hasEncode;
//定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
public MyRequest(HttpServletRequest request) {
    super(request);// super必须写
    this.request = request;
}
 
// 对需要增强方法 进行覆盖
@Override
public Map getParameterMap() {
    // 先获得请求方式
    String method = request.getMethod();
    if (method.equalsIgnoreCase("post")) {
        // post请求
        try {
            // 处理post乱码
            request.setCharacterEncoding("utf-8");
            return request.getParameterMap();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    } else if (method.equalsIgnoreCase("get")) {
        // get请求
        Map<String, String[]> parameterMap = request.getParameterMap();
        if (!hasEncode) { // 确保get手动编码逻辑只运行一次
            for (String parameterName : parameterMap.keySet()) {
                String[] values = parameterMap.get(parameterName);
                if (values != null) {
                    for (int i = 0; i < values.length; i++) {
                        try {
                            // 处理get乱码
                            values[i] = new String(values[i]
                                    .getBytes("ISO-8859-1"), "utf-8");
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            hasEncode = true;
        }
        return parameterMap;
    }
    return super.getParameterMap();
}
 
//取一个值
@Override
public String getParameter(String name) {
    Map<String, String[]> parameterMap = getParameterMap();
    String[] values = parameterMap.get(name);
    if (values == null) {
        return null;
    }
    return values[0]; // 取回参数的第一个值
}
 
//取所有值
@Override
public String[] getParameterValues(String name) {
    Map<String, String[]> parameterMap = getParameterMap();
    String[] values = parameterMap.get(name);
    return values;
}
}

6.如何写工具类(不要重复造轮子!)

先编写了getJson(Object object, String dateFormat)之后,如何再利用它编写getJson(Object object)这一重载方法

package com.yan.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.text.SimpleDateFormat;

public class JsonUtils {
    public static String getJson(Object object)
    {
        getJson(object, "yyyy-MM-dd HH:mm:ss");
    }


    public static String getJson(Object object, String dateFormat)
    {
        ObjectMapper mapper = new ObjectMapper();

//        使用ObjectMapper来格式化输出,关闭时间戳方式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//        自定义日期的格式
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        mapper.setDateFormat(sdf);

        try {
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

        return null;
    }
}

## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,不同类型的文本片段可以分类存储 3. **热键绑定**:为每个文本片段绑定自定义热键,实现一键粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置和文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击"添加内容"按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热键冲突处理**:如果设置的热键与系统或其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换不同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符和制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击"大飞哥软件自习室——快捷粘贴工具.exe"文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击"添加内容"按钮 - 在弹出的对话框中设置热键和分组 - 点击"确定"保存 3. **使用热键粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热键 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击"编辑"按钮 - 修改内容或热键设置 - 点击"确定"保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击"删除"按钮 - 在确认对话框中点击"确定"即可删除
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值